Skip to content

Commit

Permalink
early_res: Enhance check_and_double_early_res
Browse files Browse the repository at this point in the history
... to make it always try to start from low at first.

This makes it less likely for early_memtest to reserve a bad range, in
particular it puts new early_res in a range that is already tested.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
LKML-Reference: <1265793639-15071-24-git-send-email-yinghai@kernel.org>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
Yinghai Lu authored and H. Peter Anvin committed Feb 12, 2010
1 parent efdd0e8 commit 53db62a
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions arch/x86/kernel/early_res.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,20 +180,33 @@ void __init reserve_early_overlap_ok(u64 start, u64 end, char *name)
__reserve_early(start, end, name, 1);
}

static void __init __check_and_double_early_res(u64 start)
static void __init __check_and_double_early_res(u64 ex_start, u64 ex_end)
{
u64 end, size, mem;
u64 start, end, size, mem;
struct early_res *new;

/* do we have enough slots left ? */
if ((max_early_res - early_res_count) > max(max_early_res/8, 2))
return;

/* double it */
end = max_pfn_mapped << PAGE_SHIFT;
mem = -1ULL;
size = sizeof(struct early_res) * max_early_res * 2;
mem = find_e820_area(start, end, size, sizeof(struct early_res));

if (early_res == early_res_x)
start = 0;
else
start = early_res[0].end;
end = ex_start;
if (start + size < end)
mem = find_e820_area(start, end, size,
sizeof(struct early_res));
if (mem == -1ULL) {
start = ex_end;
end = max_pfn_mapped << PAGE_SHIFT;
if (start + size < end)
mem = find_e820_area(start, end, size,
sizeof(struct early_res));
}
if (mem == -1ULL)
panic("can not find more space for early_res array");

Expand Down Expand Up @@ -235,7 +248,7 @@ void __init reserve_early(u64 start, u64 end, char *name)
if (start >= end)
return;

__check_and_double_early_res(end);
__check_and_double_early_res(start, end);

drop_overlaps_that_are_ok(start, end);
__reserve_early(start, end, name, 0);
Expand All @@ -248,7 +261,7 @@ void __init reserve_early_without_check(u64 start, u64 end, char *name)
if (start >= end)
return;

__check_and_double_early_res(end);
__check_and_double_early_res(start, end);

r = &early_res[early_res_count];

Expand Down

0 comments on commit 53db62a

Please sign in to comment.