Skip to content

Commit

Permalink
memblock: Fix alloc failure due to dumb underflow protection in membl…
Browse files Browse the repository at this point in the history
…ock_find_in_range_node()

7bd0b0f ("memblock: Reimplement memblock allocation using
reverse free area iterator") implemented a simple top-down
allocator using a reverse memblock iterator.  To avoid underflow
in the allocator loop, it simply raised the lower boundary to
the requested size under the assumption that requested size
would be far smaller than available memblocks.

This causes early page table allocation failure under certain
configurations in Xen.  Fix it by checking for underflow directly
instead of bumping up lower bound.

Signed-off-by: Tejun Heo <[email protected]>
Reported-by: Konrad Rzeszutek Wilk <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Linus Torvalds <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
  • Loading branch information
htejun authored and Ingo Molnar committed Jan 16, 2012
1 parent edf7c81 commit 5d53cb2
Showing 1 changed file with 5 additions and 2 deletions.
7 changes: 5 additions & 2 deletions mm/memblock.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,17 @@ phys_addr_t __init_memblock memblock_find_in_range_node(phys_addr_t start,
if (end == MEMBLOCK_ALLOC_ACCESSIBLE)
end = memblock.current_limit;

/* adjust @start to avoid underflow and allocating the first page */
start = max3(start, size, (phys_addr_t)PAGE_SIZE);
/* avoid allocating the first page */
start = max_t(phys_addr_t, start, PAGE_SIZE);
end = max(start, end);

for_each_free_mem_range_reverse(i, nid, &this_start, &this_end, NULL) {
this_start = clamp(this_start, start, end);
this_end = clamp(this_end, start, end);

if (this_end < size)
continue;

cand = round_down(this_end - size, align);
if (cand >= this_start)
return cand;
Expand Down

0 comments on commit 5d53cb2

Please sign in to comment.