Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 185136
b: refs/heads/master
c: 53db62a
h: refs/heads/master
v: v3
  • Loading branch information
Yinghai Lu authored and H. Peter Anvin committed Feb 12, 2010
1 parent d877f1e commit f8aed1d
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: efdd0e81df0f23830c6d2cb971cf87f415b8dbdb
refs/heads/master: 53db62a2529280ff216c941d8a2650204547e44a
27 changes: 20 additions & 7 deletions trunk/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 f8aed1d

Please sign in to comment.