aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kernel/early_res.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/arch/x86/kernel/early_res.c b/arch/x86/kernel/early_res.c
index 1b99a2619f9f..dbf08bd01252 100644
--- a/arch/x86/kernel/early_res.c
+++ b/arch/x86/kernel/early_res.c
@@ -180,9 +180,9 @@ void __init reserve_early_overlap_ok(u64 start, u64 end, char *name)
180 __reserve_early(start, end, name, 1); 180 __reserve_early(start, end, name, 1);
181} 181}
182 182
183static void __init __check_and_double_early_res(u64 start) 183static void __init __check_and_double_early_res(u64 ex_start, u64 ex_end)
184{ 184{
185 u64 end, size, mem; 185 u64 start, end, size, mem;
186 struct early_res *new; 186 struct early_res *new;
187 187
188 /* do we have enough slots left ? */ 188 /* do we have enough slots left ? */
@@ -190,10 +190,23 @@ static void __init __check_and_double_early_res(u64 start)
190 return; 190 return;
191 191
192 /* double it */ 192 /* double it */
193 end = max_pfn_mapped << PAGE_SHIFT; 193 mem = -1ULL;
194 size = sizeof(struct early_res) * max_early_res * 2; 194 size = sizeof(struct early_res) * max_early_res * 2;
195 mem = find_e820_area(start, end, size, sizeof(struct early_res)); 195 if (early_res == early_res_x)
196 196 start = 0;
197 else
198 start = early_res[0].end;
199 end = ex_start;
200 if (start + size < end)
201 mem = find_e820_area(start, end, size,
202 sizeof(struct early_res));
203 if (mem == -1ULL) {
204 start = ex_end;
205 end = max_pfn_mapped << PAGE_SHIFT;
206 if (start + size < end)
207 mem = find_e820_area(start, end, size,
208 sizeof(struct early_res));
209 }
197 if (mem == -1ULL) 210 if (mem == -1ULL)
198 panic("can not find more space for early_res array"); 211 panic("can not find more space for early_res array");
199 212
@@ -235,7 +248,7 @@ void __init reserve_early(u64 start, u64 end, char *name)
235 if (start >= end) 248 if (start >= end)
236 return; 249 return;
237 250
238 __check_and_double_early_res(end); 251 __check_and_double_early_res(start, end);
239 252
240 drop_overlaps_that_are_ok(start, end); 253 drop_overlaps_that_are_ok(start, end);
241 __reserve_early(start, end, name, 0); 254 __reserve_early(start, end, name, 0);
@@ -248,7 +261,7 @@ void __init reserve_early_without_check(u64 start, u64 end, char *name)
248 if (start >= end) 261 if (start >= end)
249 return; 262 return;
250 263
251 __check_and_double_early_res(end); 264 __check_and_double_early_res(start, end);
252 265
253 r = &early_res[early_res_count]; 266 r = &early_res[early_res_count];
254 267