[PATCH] x86: revert back to use request_resource to reserve kernel res Signed-off-by: Yinghai Lu --- arch/x86/kernel/e820.c | 17 +++++++++++++++-- arch/x86/kernel/setup.c | 22 +++++++++++++++------- include/asm-x86/e820.h | 3 ++- 3 files changed, 32 insertions(+), 10 deletions(-) Index: linux-2.6/arch/x86/kernel/e820.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/e820.c +++ linux-2.6/arch/x86/kernel/e820.c @@ -1267,7 +1267,7 @@ static inline const char *e820_type_to_s /* * Mark e820 reserved areas as busy for the resource manager. */ -void __init e820_reserve_resources(void) +void __init e820_reserve_resources(struct resource **res_kernel, int nr_res_k) { int i; struct resource *res; @@ -1287,7 +1287,20 @@ void __init e820_reserve_resources(void) res->end = end; res->flags = IORESOURCE_MEM | IORESOURCE_BUSY; - insert_resource(&iomem_resource, res); + request_resource(&iomem_resource, res); + if (e820.map[i].type == E820_RAM) { + int j; + /* + * We don't know which RAM region contains kernel data, + * so we try it repeatedly and let the resource manager + * test it. + */ + for (j = 0; j < nr_res_k; j++) { + if (!res_kernel[j]) + continue; + request_resource(res, res_kernel[j]); + } + } res++; } Index: linux-2.6/arch/x86/kernel/setup.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/setup.c +++ linux-2.6/arch/x86/kernel/setup.c @@ -437,6 +437,7 @@ static void __init reserve_early_setup_d * --------- Crashkernel reservation ------------------------------ */ +static struct resource *crashk_res_ptr; #ifdef CONFIG_KEXEC /** @@ -517,7 +518,7 @@ static void __init reserve_crashkernel(v crashk_res.start = crash_base; crashk_res.end = crash_base + crash_size - 1; - insert_resource(&iomem_resource, &crashk_res); + crashk_res_ptr = &crashk_res; } #else static void __init reserve_crashkernel(void) @@ -593,6 +594,9 @@ struct x86_quirks *x86_quirks __initdata void __init setup_arch(char **cmdline_p) { + struct resource *res_kernel[4]; + int num_res; + #ifdef CONFIG_X86_32 memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); visws_early_detect(); @@ -699,11 +703,6 @@ void __init setup_arch(char **cmdline_p) probe_roms(); #endif - /* after parse_early_param, so could debug it */ - insert_resource(&iomem_resource, &code_resource); - insert_resource(&iomem_resource, &data_resource); - insert_resource(&iomem_resource, &bss_resource); - if (efi_enabled) efi_init(); @@ -865,7 +864,16 @@ void __init setup_arch(char **cmdline_p) kvm_guest_init(); - e820_reserve_resources(); + res_kernel[0] = &code_resource; + res_kernel[1] = &data_resource; + res_kernel[2] = &bss_resource; + num_res = 3; + if (crashk_res_ptr) { + res_kernel[num_res] = crashk_res_ptr; + num_res++; + } + e820_reserve_resources(res_kernel, num_res); + e820_mark_nosave_regions(max_low_pfn); #ifdef CONFIG_X86_32 Index: linux-2.6/include/asm-x86/e820.h =================================================================== --- linux-2.6.orig/include/asm-x86/e820.h +++ linux-2.6/include/asm-x86/e820.h @@ -120,7 +120,8 @@ extern void e820_register_active_regions unsigned long end_pfn); extern u64 e820_hole_size(u64 start, u64 end); extern void finish_e820_parsing(void); -extern void e820_reserve_resources(void); +struct resource; +extern void e820_reserve_resources(struct resource **res, int num); extern void setup_memory_map(void); extern char *default_machine_specific_memory_setup(void); extern char *machine_specific_memory_setup(void);