Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
ccan
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mirror
ccan
Commits
32ed68de
Commit
32ed68de
authored
Oct 20, 2010
by
Rusty Russell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
alloc: fix 64-bit
Make sure we use 1UL to bitshift, not 1.
parent
afcb4f4d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
26 additions
and
22 deletions
+26
-22
ccan/alloc/alloc.c
ccan/alloc/alloc.c
+26
-22
No files found.
ccan/alloc/alloc.c
View file @
32ed68de
...
...
@@ -108,7 +108,7 @@ struct page_header {
*/
static
unsigned
long
bucket_to_size
(
unsigned
int
bucket
)
{
unsigned
long
base
=
1
<<
(
bucket
/
INTER_BUCKET_SPACE
);
unsigned
long
base
=
1
UL
<<
(
bucket
/
INTER_BUCKET_SPACE
);
return
base
+
((
bucket
%
INTER_BUCKET_SPACE
)
<<
(
bucket
/
INTER_BUCKET_SPACE
))
/
INTER_BUCKET_SPACE
;
...
...
@@ -127,9 +127,9 @@ static unsigned int size_to_bucket(unsigned long size)
unsigned
int
base
=
fls
(
size
/
2
);
unsigned
long
overshoot
;
overshoot
=
size
-
(
1
<<
base
);
overshoot
=
size
-
(
1
UL
<<
base
);
return
base
*
INTER_BUCKET_SPACE
+
((
overshoot
*
INTER_BUCKET_SPACE
+
(
1
<<
base
)
-
1
)
>>
base
);
+
((
overshoot
*
INTER_BUCKET_SPACE
+
(
1
UL
<<
base
)
-
1
)
>>
base
);
}
static
unsigned
int
small_page_bits
(
unsigned
long
poolsize
)
...
...
@@ -167,7 +167,7 @@ static unsigned long page_header_size(unsigned int align_bits,
size
=
sizeof
(
struct
page_header
)
-
sizeof
(((
struct
page_header
*
)
0
)
->
used
)
+
used_size
(
num_elements
);
return
align_up
(
size
,
1
<<
align_bits
);
return
align_up
(
size
,
1
UL
<<
align_bits
);
}
static
void
add_to_list
(
struct
header
*
head
,
...
...
@@ -294,17 +294,17 @@ static void add_to_bucket_full_list(struct header *head,
static
void
clear_bit
(
unsigned
long
bitmap
[],
unsigned
int
off
)
{
bitmap
[
off
/
BITS_PER_LONG
]
&=
~
(
1
<<
(
off
%
BITS_PER_LONG
));
bitmap
[
off
/
BITS_PER_LONG
]
&=
~
(
1
UL
<<
(
off
%
BITS_PER_LONG
));
}
static
bool
test_bit
(
const
unsigned
long
bitmap
[],
unsigned
int
off
)
{
return
bitmap
[
off
/
BITS_PER_LONG
]
&
(
1
<<
(
off
%
BITS_PER_LONG
));
return
bitmap
[
off
/
BITS_PER_LONG
]
&
(
1
UL
<<
(
off
%
BITS_PER_LONG
));
}
static
void
set_bit
(
unsigned
long
bitmap
[],
unsigned
int
off
)
{
bitmap
[
off
/
BITS_PER_LONG
]
|=
(
1
<<
(
off
%
BITS_PER_LONG
));
bitmap
[
off
/
BITS_PER_LONG
]
|=
(
1
UL
<<
(
off
%
BITS_PER_LONG
));
}
/* There must be a bit to be found. */
...
...
@@ -324,7 +324,7 @@ static unsigned long elements_per_page(unsigned long align_bits,
unsigned
long
num
,
overhead
;
/* First approximation: no extra room for bitmap. */
overhead
=
align_up
(
sizeof
(
struct
page_header
),
1
<<
align_bits
);
overhead
=
align_up
(
sizeof
(
struct
page_header
),
1
UL
<<
align_bits
);
num
=
(
psize
-
overhead
)
/
esize
;
while
(
page_header_size
(
align_bits
,
num
)
+
esize
*
num
>
psize
)
...
...
@@ -394,7 +394,7 @@ void alloc_init(void *pool, unsigned long poolsize)
clear_bit
(
head
->
pagesize
,
0
);
/* Skip over page(s) used by header, add rest to free list */
for
(
i
=
align_up
(
header_size
,
(
1
<<
sp_bits
))
>>
sp_bits
;
for
(
i
=
align_up
(
header_size
,
(
1
UL
<<
sp_bits
))
>>
sp_bits
;
i
<
SMALL_PAGES_PER_LARGE_PAGE
;
i
++
)
{
ph
=
from_pgnum
(
head
,
i
,
sp_bits
);
...
...
@@ -404,7 +404,7 @@ void alloc_init(void *pool, unsigned long poolsize)
/* Add the rest of the pages as large pages. */
i
=
SMALL_PAGES_PER_LARGE_PAGE
;
while
((
i
<<
sp_bits
)
+
(
1
<<
lp_bits
)
<=
poolsize
)
{
while
((
i
<<
sp_bits
)
+
(
1
UL
<<
lp_bits
)
<=
poolsize
)
{
assert
(
i
<
MAX_SMALL_PAGES
);
ph
=
from_pgnum
(
head
,
i
,
sp_bits
);
ph
->
elements_used
=
0
;
...
...
@@ -547,7 +547,7 @@ void *huge_alloc(void *pool, unsigned long poolsize,
header_size
=
sizeof
(
*
head
)
+
sizeof
(
head
->
bs
)
*
(
max_bucket
(
lp_bits
)
-
1
);
num
=
0
;
for
(
i
=
(
header_size
+
(
1
<<
sp_bits
)
-
1
)
>>
sp_bits
;
for
(
i
=
(
header_size
+
(
1
UL
<<
sp_bits
)
-
1
)
>>
sp_bits
;
i
<<
sp_bits
<
poolsize
;
i
++
)
{
struct
page_header
*
pg
;
...
...
@@ -555,7 +555,7 @@ void *huge_alloc(void *pool, unsigned long poolsize,
/* Skip over large pages. */
if
(
test_bit
(
head
->
pagesize
,
i
>>
BITS_FROM_SMALL_TO_LARGE_PAGE
))
{
i
+=
(
1
<<
BITS_FROM_SMALL_TO_LARGE_PAGE
)
-
1
;
i
+=
(
1
UL
<<
BITS_FROM_SMALL_TO_LARGE_PAGE
)
-
1
;
continue
;
}
...
...
@@ -596,7 +596,7 @@ void *huge_alloc(void *pool, unsigned long poolsize,
recombine_small_pages
(
head
,
poolsize
,
sp_bits
);
num
=
0
;
for
(
i
=
(
header_size
+
(
1
<<
lp_bits
)
-
1
)
>>
lp_bits
;
for
(
i
=
(
header_size
+
(
1
UL
<<
lp_bits
)
-
1
)
>>
lp_bits
;
(
i
<<
lp_bits
)
<
poolsize
;
i
++
)
{
struct
page_header
*
pg
;
unsigned
long
off
=
(
i
<<
lp_bits
);
...
...
@@ -667,13 +667,17 @@ huge_free(struct header *head, unsigned long poolsize, void *free)
pgnum
=
free_off
>>
sp_bits
;
if
(
test_bit
(
head
->
pagesize
,
pgnum
>>
BITS_FROM_SMALL_TO_LARGE_PAGE
))
{
for
(
off
=
ha
->
off
;
off
<
ha
->
off
+
ha
->
len
;
off
+=
1
<<
lp_bits
)
{
for
(
off
=
ha
->
off
;
off
<
ha
->
off
+
ha
->
len
;
off
+=
1UL
<<
lp_bits
)
{
add_large_page_to_freelist
(
head
,
(
void
*
)((
char
*
)
head
+
off
),
sp_bits
);
}
}
else
{
for
(
off
=
ha
->
off
;
off
<
ha
->
off
+
ha
->
len
;
off
+=
1
<<
sp_bits
)
{
for
(
off
=
ha
->
off
;
off
<
ha
->
off
+
ha
->
len
;
off
+=
1UL
<<
sp_bits
)
{
add_small_page_to_freelist
(
head
,
(
void
*
)((
char
*
)
head
+
off
),
sp_bits
);
...
...
@@ -1008,7 +1012,7 @@ bool alloc_check(void *pool, unsigned long poolsize)
prev
=
0
;
for
(
i
=
head
->
small_free_list
;
i
;
i
=
ph
->
next
)
{
/* Bad pointer? */
if
(
out_of_bounds
(
i
,
sp_bits
,
1
<<
sp_bits
,
poolsize
))
if
(
out_of_bounds
(
i
,
sp_bits
,
1
UL
<<
sp_bits
,
poolsize
))
return
check_fail
();
/* Large page? */
if
(
test_bit
(
head
->
pagesize
,
i
>>
BITS_FROM_SMALL_TO_LARGE_PAGE
))
...
...
@@ -1028,7 +1032,7 @@ bool alloc_check(void *pool, unsigned long poolsize)
prev
=
0
;
for
(
i
=
head
->
large_free_list
;
i
;
i
=
ph
->
next
)
{
/* Bad pointer? */
if
(
out_of_bounds
(
i
,
sp_bits
,
1
<<
lp_bits
,
poolsize
))
if
(
out_of_bounds
(
i
,
sp_bits
,
1
UL
<<
lp_bits
,
poolsize
))
return
check_fail
();
/* Not large page? */
if
(
!
test_bit
(
head
->
pagesize
,
i
>>
BITS_FROM_SMALL_TO_LARGE_PAGE
))
...
...
@@ -1085,7 +1089,7 @@ bool alloc_check(void *pool, unsigned long poolsize)
if
(
ha
->
prev
!=
prev
)
return
check_fail
();
for
(
j
=
ha
->
off
;
j
<
ha
->
off
+
ha
->
len
;
j
+=
(
1
<<
sp_bits
))
{
for
(
j
=
ha
->
off
;
j
<
ha
->
off
+
ha
->
len
;
j
+=
(
1
UL
<<
sp_bits
))
{
/* Already seen this page? */
if
(
test_bit
(
pages
,
j
>>
sp_bits
))
return
check_fail
();
...
...
@@ -1172,7 +1176,7 @@ static unsigned long visualize_bucket(FILE *out, struct header *head,
overhead
+=
print_overhead
(
out
,
"page post-header alignments"
,
(
hdr_size
-
hdr_min
)
*
num_pages
,
poolsize
);
/* Between last element and end of page. */
page_size
=
(
1
<<
sp_bits
);
page_size
=
(
1
UL
<<
sp_bits
);
if
(
large_page_bucket
(
bucket
,
sp_bits
))
page_size
<<=
BITS_FROM_SMALL_TO_LARGE_PAGE
;
...
...
@@ -1207,11 +1211,11 @@ void alloc_visualize(FILE *out, void *pool, unsigned long poolsize)
fprintf
(
out
,
"Large page size %lu, small page size %lu.
\n
"
,
1UL
<<
lp_bits
,
1UL
<<
sp_bits
);
overhead
+=
print_overhead
(
out
,
"unused pool tail"
,
poolsize
%
(
1
<<
lp_bits
),
poolsize
);
poolsize
%
(
1
UL
<<
lp_bits
),
poolsize
);
fprintf
(
out
,
"Main header %lu bytes (%lu small pages).
\n
"
,
header_size
,
align_up
(
header_size
,
1
<<
sp_bits
)
>>
sp_bits
);
header_size
,
align_up
(
header_size
,
1
UL
<<
sp_bits
)
>>
sp_bits
);
overhead
+=
print_overhead
(
out
,
"partial header page"
,
align_up
(
header_size
,
1
<<
sp_bits
)
align_up
(
header_size
,
1
UL
<<
sp_bits
)
-
header_size
,
poolsize
);
/* Total large pages. */
i
=
count_bits
(
head
->
pagesize
,
poolsize
>>
lp_bits
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment