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