x86: move some func calling from setup_arch to paging_init
PATCH 1/1 x86: setup_arch 64bit move kvmclock_init later
In reply to Yinghai Lu--- arch/x86/kernel/setup_32.c | 32 ++++++++++++++++++-------------- arch/x86/kernel/setup_64.c | 14 +++++++------- 2 files changed, 25 insertions(+), 21 deletions(-)
arch/x86/kernel/setup_64.c +3 -4
@@ -296,10 +296,6 @@ void __init setup_arch(char **cmdline_p)io_delay_init (); -#ifdef CONFIG_KVM_CLOCK -kvmclock_init (); -#endif -/* * Initialize the ACPI boot-time table parser (gets the RSDP and SDT). * Call this early for SRAT node setup.
@@ -342,6 +338,9 @@ void __init setup_arch(char **cmdline_p)reserve_ibft_region (); +#ifdef CONFIG_KVM_CLOCK +kvmclock_init (); +#endif paging_init ();map_vsyscall ();
PATCH 1/1 x86: setup_arch 32bit move efi check later
--- arch/x86/kernel/setup_32.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
arch/x86/kernel/setup_32.c +8 -9
@@ -337,14 +337,6 @@ void __init setup_arch(char **cmdline_p)early_ioremap_init ();reserve_setup_data (); -#ifdef CONFIG_EFI -if (!strncmp ((char *)&boot_params.efi_info.efi_loader_signature, -"EL32" ,4 )) { - efi_enabled =1 ; -efi_reserve_early (); - } -#endif -ROOT_DEV =old_decode_dev (boot_params.hdr.root_dev); screen_info = boot_params.screen_info; edid_info = boot_params.edid_info;
@@ -364,10 +356,17 @@ void __init setup_arch(char **cmdline_p) rd_prompt = ((boot_params.hdr.ram_size &RAMDISK_PROMPT_FLAG ) !=0 ); rd_doload = ((boot_params.hdr.ram_size &RAMDISK_LOAD_FLAG ) !=0 );#endif +#ifdef CONFIG_EFI +if (!strncmp ((char *)&boot_params.efi_info.efi_loader_signature, +"EL32" ,4 )) { + efi_enabled =1 ; +efi_reserve_early (); + } +#endif +ARCH_SETUP setup_memory_map (); -copy_edd ();if (!boot_params.hdr.root_flags)
PATCH 1/1 x86: setup_arch 64bit move efi_init calling early
In reply to Yinghai Lu--- arch/x86/kernel/setup_32.c | 32 ++++++++++++++++++-------------- arch/x86/kernel/setup_64.c | 14 +++++++------- 2 files changed, 25 insertions(+), 21 deletions(-)
arch/x86/kernel/setup_64.c +3 -2
@@ -260,6 +260,9 @@ void __init setup_arch(char **cmdline_p)insert_resource (&iomem_resource, &data_resource);insert_resource (&iomem_resource, &bss_resource); +if (efi_enabled) +efi_init (); +early_gart_iommu_check ();e820_register_active_regions (0 ,0 ,-1UL );
@@ -286,8 +289,6 @@ void __init setup_arch(char **cmdline_p)check_efer (); max_pfn_mapped =init_memory_mapping (0 , (end_pfn <<PAGE_SHIFT )); -if (efi_enabled) -efi_init ();vsmp_init ();
PATCH 1/1 x86: setup_arch 32bit move command line copying early
In reply to Yinghai Lu--- arch/x86/kernel/setup_32.c | 32 ++++++++++++++++++-------------- arch/x86/kernel/setup_64.c | 14 +++++++------- 2 files changed, 25 insertions(+), 21 deletions(-)
arch/x86/kernel/setup_32.c +3 -3
@@ -383,6 +383,9 @@ void __init setup_arch(char **cmdline_p) bss_resource.start =virt_to_phys (&__bss_start); bss_resource.end =virt_to_phys (&__bss_stop)-1 ; +strlcpy (command_line, boot_command_line,COMMAND_LINE_SIZE ); + *cmdline_p = command_line; +parse_setup_data ();parse_early_param ();
@@ -408,9 +411,6 @@ void __init setup_arch(char **cmdline_p)insert_resource (&iomem_resource, &data_resource);insert_resource (&iomem_resource, &bss_resource); -strlcpy (command_line, boot_command_line,COMMAND_LINE_SIZE ); - *cmdline_p = command_line; -if (efi_enabled)efi_init ();
PATCH 1/1 x86: move some func calling from setup_arch to paging_init
those function depends on paging setup pgtable, so they could access the ram in bootmem region but just get mapped.
--- arch/x86/kernel/setup_32.c | 34 ++-------------------------------- arch/x86/mm/init_32.c | 29 +++++++++++++++++++++++++++++ include/asm-x86/setup.h | 1 + 3 files changed, 32 insertions(+), 32 deletions(-)
arch/x86/kernel/setup_32.c +2 -32
@@ -250,7 +250,7 @@ static void __init reserve_initrd(void)#define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) -static void __init post_reserve_initrd (void ) +void __init post_reserve_initrd (void ) {u64 ramdisk_image = boot_params.hdr.ramdisk_image;u64 ramdisk_size = boot_params.hdr.ramdisk_size;
@@ -308,29 +308,11 @@ static void __init post_reserve_initrd(vvoid __init reserve_initrd (void ) { } -static void __init post_reserve_initrd (void ) +void __init post_reserve_initrd (void ) { }#endif /* CONFIG_BLK_DEV_INITRD */ -/* -* The node 0 pgdat is initialized before all of these because -* it's needed for bootmem. node>0 pgdats have their virtual -* space allocated before the pagetables are in place to access -* them, so they can't be cleared then. -* -* This should all compile down to nothing when NUMA is off. -*/ -static void __init remapped_pgdat_init (void ) -{ -int nid; - -for_each_online_node (nid) { -if (nid !=0 ) -memset (NODE_DATA (nid),0 ,sizeof (struct pglist_data )); - } -} -#ifdef CONFIG_MCA static void set_mca_bus (int x) {
@@ -530,18 +512,6 @@ void __init setup_arch(char **cmdline_p)init_ohci1394_dma_on_all_controllers ();#endif -/* -* NOTE: at this point the bootmem allocator is fully available. -*/ - -post_reserve_initrd (); - -remapped_pgdat_init (); -sparse_init (); -zone_sizes_init (); - -paravirt_post_allocator_init (); -#ifdef CONFIG_X86_GENERICARCH generic_apic_probe ();#endif
arch/x86/mm/init_32.c +29 -0
@@ -705,6 +705,23 @@ void __init setup_bootmem_allocator(void } +/* +* The node 0 pgdat is initialized before all of these because +* it's needed for bootmem. node>0 pgdats have their virtual +* space allocated before the pagetables are in place to access +* them, so they can't be cleared then. +* +* This should all compile down to nothing when NUMA is off. +*/ +static void __init remapped_pgdat_init (void ) +{ +int nid; + +for_each_online_node (nid) { +if (nid !=0 ) +memset (NODE_DATA (nid),0 ,sizeof (struct pglist_data )); + } +}/* * paging_init() sets up the page tables - note that the first 8MB are
@@ -727,6 +744,18 @@ void __init paging_init(void)__flush_tlb_all ();kmap_init (); + +/* +* NOTE: at this point the bootmem allocator is fully available. +*/ + +post_reserve_initrd (); + +remapped_pgdat_init (); +sparse_init (); +zone_sizes_init (); + +paravirt_post_allocator_init (); }/*
include/asm-x86/setup.h +1 -0
@@ -39,6 +39,7 @@ void reserve_crashkernel(void);#include <asm/bootparam.h> void reserve_standard_io_resources (void ); +extern void post_reserve_initrd (void );#ifndef _SETUP
PATCH 1/1 x86: setup_arch 32bit move kvm_guest_init later
In reply to Yinghai Lu--- arch/x86/kernel/setup_32.c | 32 ++++++++++++++++++-------------- arch/x86/kernel/setup_64.c | 14 +++++++------- 2 files changed, 25 insertions(+), 21 deletions(-)
arch/x86/kernel/setup_32.c +7 -2
@@ -488,8 +488,6 @@ void __init setup_arch(char **cmdline_p)*/ vmi_init ();#endif -kvm_guest_init (); -/* * NOTE: before this point _nobody_ is allowed to allocate * any memory using the bootmem allocator. Although the
@@ -517,9 +515,15 @@ void __init setup_arch(char **cmdline_p)early_quirks (); +/* +* Read APIC and some other early information from ACPI tables. +*/ acpi_boot_init ();#if defined(CONFIG_X86_MPPARSE ) || defined(CONFIG_X86_VISWS ) +/* +* get boot-time SMP configuration: +*/ if (smp_found_config)get_smp_config ();#endif
@@ -529,6 +533,7 @@ void __init setup_arch(char **cmdline_p)"CONFIG_X86_PC cannot handle it.\nUse " "CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");#endif +kvm_guest_init ();e820_reserve_resources ();e820_mark_nosave_regions (max_low_pfn);
Ingo Molnar
AppliedRe: [PATCH] x86: setup_arch 32bit move kvm_guest_init later
Quoted 1 line · Yinghai Lu
Signed-off-by Yinghai Lu <[email protected]>
applied all 9 patches to tip/x86/setup-memory. Thanks Yinghai,
Ingo
PATCH 1/1 x86: introduce init_memory_mapping for 32bit
In reply to Yinghai Luso could use mem below max_low_pfn as early.
could move several function more early instead of waiting after paging_init
including moving relocate_initrd early, and kva related early done in initmem_init
--- arch/x86/kernel/setup_32.c | 32 +++------ arch/x86/mm/discontig_32.c | 8 +- arch/x86/mm/init_32.c | 154 +++++++++++++++++++++++++++++++-------------- include/asm-x86/numa_32.h | 5 - include/asm-x86/page_32.h | 2 include/asm-x86/setup.h | 1 6 files changed, 128 insertions(+), 74 deletions(-)
arch/x86/kernel/setup_32.c +13 -19
@@ -187,7 +187,7 @@ static inline void copy_edd(void)#ifdef CONFIG_BLK_DEV_INITRD -static bool do_relocate_initrd = false; +static void __init relocate_initrd (void );static void __init reserve_initrd (void ) {
@@ -196,7 +196,6 @@ static void __init reserve_initrd(void)u64 ramdisk_end = ramdisk_image + ramdisk_size;u64 end_of_lowmem = max_low_pfn <<PAGE_SHIFT ;u64 ramdisk_here; -u64 ramdisk_target;if (!boot_params.hdr.type_of_loader || !ramdisk_image || !ramdisk_size)
@@ -227,10 +226,8 @@ static void __init reserve_initrd(void) }/* We need to move the initrd down into lowmem */ - ramdisk_target = max_pfn_mapped<<PAGE_SHIFT ; - ramdisk_here =find_e820_area (min (ramdisk_target, end_of_lowmem>>1 ), - end_of_lowmem, ramdisk_size, -PAGE_SIZE ); + ramdisk_here =find_e820_area (0 , end_of_lowmem, ramdisk_size, +PAGE_SIZE );if (ramdisk_here ==-1ULL ) panic("Cannot find place for new RAMDISK of size %lld\n",
@@ -245,12 +242,12 @@ static void __init reserve_initrd(void)printk (KERN_INFO "Allocated new RAMDISK: %08llx - %08llx\n" , ramdisk_here, ramdisk_here + ramdisk_size); - do_relocate_initrd = true; +relocate_initrd (); }#define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) -void __init post_reserve_initrd (void ) +static void __init relocate_initrd (void ) {u64 ramdisk_image = boot_params.hdr.ramdisk_image;u64 ramdisk_size = boot_params.hdr.ramdisk_size;
@@ -259,9 +256,6 @@ void __init post_reserve_initrd(void)unsigned long slop, clen, mapaddr;char *p, *q; -if (!do_relocate_initrd) -return ; - ramdisk_here = initrd_start -PAGE_OFFSET ; q = (char *)initrd_start;
@@ -272,10 +266,6 @@ void __init post_reserve_initrd(void) p = (char *)__va (ramdisk_image);memcpy (q, p, clen); q += clen; -/* need to free these low pages...*/ -printk (KERN_INFO "Freeing old partial RAMDISK %08llx-%08llx\n" , - ramdisk_image, ramdisk_image + clen -1 ); -free_bootmem (ramdisk_image, clen); ramdisk_image += clen; ramdisk_size -= clen; }
@@ -301,16 +291,16 @@ void __init post_reserve_initrd(void) ramdisk_image, ramdisk_image + ramdisk_size -1 , ramdisk_here, ramdisk_here + ramdisk_size - 1); -/* need to free that, otherwise init highmem will reserve it again */ +/* +* need to free old one, otherwise init cross max_low_pfn could be +* converted to bootmem +*/ free_early(ramdisk_image, ramdisk_image+ramdisk_size); }#else void __init reserve_initrd (void ) { } -void __init post_reserve_initrd (void ) -{ -}#endif /* CONFIG_BLK_DEV_INITRD */ #ifdef CONFIG_MCA
@@ -439,8 +429,12 @@ void __init setup_arch(char **cmdline_p) max_pfn =e820_end_of_ram (); } +/* max_low_pfn get updated here */ find_low_pfn_range (); +/* max_pfn_mapped is updated here*/ +init_memory_mapping (0 , (max_low_pfn <<PAGE_SHIFT )); +reserve_initrd ();dmi_scan_machine ();
arch/x86/mm/discontig_32.c +6 -2
@@ -200,7 +200,7 @@ void *alloc_remap(int nid, unsigned longreturn allocation; } -void __init remap_numa_kva (void ) +static void __init remap_numa_kva (void ) {void *vaddr;unsigned long pfn;
@@ -373,12 +373,16 @@ void __init initmem_init(unsigned long sallocate_pgdat (nid); } +remap_numa_kva (); +printk (KERN_DEBUG "High memory starts at vaddr %08lx\n" , (ulong )pfn_to_kaddr (highstart_pfn));for_each_online_node (nid)propagate_e820_map_node (nid); -memset (NODE_DATA (0 ),0 ,sizeof (struct pglist_data )); +for_each_online_node (nid) +memset (NODE_DATA (nid),0 ,sizeof (struct pglist_data )); +NODE_DATA (0 )->bdata = &node0_bdata;setup_bootmem_allocator (); }
arch/x86/mm/init_32.c +107 -47
228 lines not on this page · raw message
include/asm-x86/numa_32.h +0 -5
@@ -5,12 +5,7 @@ extern int pxm_to_nid(int pxm);extern void numa_remove_cpu (int cpu);#ifdef CONFIG_NUMA -extern void __init remap_numa_kva (void );extern void set_highmem_pages_init (void ); -#else -static inline void remap_numa_kva (void ) -{ -}#endif #endif /* _ASM_X86_32_NUMA_H */
include/asm-x86/page_32.h +2 -0
@@ -93,6 +93,8 @@ extern int sysctl_legacy_va_layout;#define MAXMEM (-__PAGE_OFFSET - __VMALLOC_RESERVE)extern void find_low_pfn_range (void ); +extern unsigned long init_memory_mapping (unsigned long start, +unsigned long end);extern void initmem_init (unsigned long ,unsigned long );extern void zone_sizes_init (void );extern void setup_bootmem_allocator (void );
include/asm-x86/setup.h +0 -1
@@ -39,7 +39,6 @@ void reserve_crashkernel(void);#include <asm/bootparam.h> void reserve_standard_io_resources (void ); -extern void post_reserve_initrd (void );#ifndef _SETUP
Re: [PATCH] x86: setup_arch 32bit move kvm_guest_init later
In reply to Ingo MolnarQuoted 6 lines · Ingo Molnar
Quoted 1 line · Yinghai Lu
Signed-off-by Yinghai Lu <[email protected]>applied all 9 patches to tip/x86/setup-memory. Thanks Yinghai,
please check
[PATCH] x86: introduce init_memory_mapping for 32bit
that will make 32bit flow in setup_arch more clear.
YH
Ingo Molnar
AppliedRe: [PATCH] x86: introduce init_memory_mapping for 32bit
In reply to Yinghai LuQuoted 4 lines · Yinghai Lu
so could use mem below
max_low_pfnas early. could move several function more early instead of waiting afterpaging_initincluding movingrelocate_initrdearly, and kva related early done ininitmem_init
applied to tip/x86/setup-memory - thanks Yinghai.
a sidenote:
Quoted 1 line
6 files changed, 128 insertions(+), 74 deletions(-)
this patch is too large - if it causes any problems it will not be very easy to figure out which exact change caused the problems.
Lets hope it goes all fine - but in the future lets try doing more+smaller patches, especially if they change some known-dangerous area of the kernel.
For example here a better splitup would have been to do 5 or more patches:
1) first introduce init_memory_mapping() [but dont use it anywhere]
2) add the init_memory_mapping() call to setup_arch()
3) move remap_numa_kva()
4) move relocate_initrd()
5) remove the now unnecessary setup from paging_init()
... or something like that. The point is to manage risk: if there's multiple problem areas that a change is touching, try to isolate them from each other and introduce the change gradually.
The end result is still exactly the same, but much more reviewable/debuggable/bisectable.
Ingo
Re: [PATCH] x86: introduce init_memory_mapping for 32bit
Quoted 30 lines · Ingo Molnar
Quoted 4 lines · Yinghai Lu
so could use mem below
max_low_pfnas early. could move several function more early instead of waiting afterpaging_initincluding movingrelocate_initrdearly, and kva related early done ininitmem_initapplied to tip/x86/setup-memory - thanks Yinghai.
a sidenote:
Quoted 1 line
6 files changed, 128 insertions(+), 74 deletions(-)this patch is too large - if it causes any problems it will not be very easy to figure out which exact change caused the problems.
Lets hope it goes all fine - but in the future lets try doing more+smaller patches, especially if they change some known-dangerous area of the kernel.
For example here a better splitup would have been to do 5 or more patches:
1) first introduce
init_memory_mapping()[but dont use it anywhere]
2) add theinit_memory_mapping()call tosetup_arch()
3) moveremap_numa_kva()
4) moverelocate_initrd()
5) remove the now unnecessary setup frompaging_init()
Quoted 6 lines
... or something like that. The point is to manage risk: if there's multiple problem areas that a change is touching, try to isolate them from each other and introduce the change gradually.
The end result is still exactly the same, but much more reviewable/debuggable/bisectable.
actually i added and tested that one by one. let me check if i split that into 5.
YH
PATCH 1/1 x86: introduce init_memory_mapping for 32bit #1
In reply to Yinghai Luso could use mem below max_low_pfn as early.
--- arch/x86/kernel/setup_32.c | 10 +-- arch/x86/mm/init_32.c | 141 +++++++++++++++++++++++++++++++++++---------- include/asm-x86/page_32.h | 2 3 files changed, 120 insertions(+), 33 deletions(-)
arch/x86/kernel/setup_32.c +6 -4
@@ -227,10 +227,8 @@ static void __init reserve_initrd(void) }/* We need to move the initrd down into lowmem */ - ramdisk_target = max_pfn_mapped<<PAGE_SHIFT ; - ramdisk_here =find_e820_area (min (ramdisk_target, end_of_lowmem>>1 ), - end_of_lowmem, ramdisk_size, -PAGE_SIZE ); + ramdisk_here =find_e820_area (0 , end_of_lowmem, ramdisk_size, +PAGE_SIZE );if (ramdisk_here ==-1ULL ) panic("Cannot find place for new RAMDISK of size %lld\n",
@@ -440,8 +438,12 @@ void __init setup_arch(char **cmdline_p) max_pfn =e820_end_of_ram (); } +/* max_low_pfn get updated here */ find_low_pfn_range (); +/* max_pfn_mapped is updated here*/ +init_memory_mapping (0 , (max_low_pfn <<PAGE_SHIFT )); +reserve_initrd ();dmi_scan_machine ();
arch/x86/mm/init_32.c +112 -29
211 lines not on this page · raw message
include/asm-x86/page_32.h +2 -0
@@ -93,6 +93,8 @@ extern int sysctl_legacy_va_layout;#define MAXMEM (-__PAGE_OFFSET - __VMALLOC_RESERVE)extern void find_low_pfn_range (void ); +extern unsigned long init_memory_mapping (unsigned long start, +unsigned long end);extern void initmem_init (unsigned long ,unsigned long );extern void zone_sizes_init (void );extern void setup_bootmem_allocator (void );
PATCH 1/1 x86: introduce init_memory_mapping for 32bit #2
moving relocate_initrd early
--- arch/x86/kernel/setup_32.c | 22 +++++++--------------- arch/x86/mm/init_32.c | 3 --- include/asm-x86/setup.h | 1 - 3 files changed, 7 insertions(+), 19 deletions(-)
arch/x86/kernel/setup_32.c +7 -15
@@ -187,7 +187,7 @@ static inline void copy_edd(void)#ifdef CONFIG_BLK_DEV_INITRD -static bool do_relocate_initrd = false; +static void __init relocate_initrd (void );static void __init reserve_initrd (void ) {
@@ -196,7 +196,6 @@ static void __init reserve_initrd(void)u64 ramdisk_end = ramdisk_image + ramdisk_size;u64 end_of_lowmem = max_low_pfn <<PAGE_SHIFT ;u64 ramdisk_here; -u64 ramdisk_target;if (!boot_params.hdr.type_of_loader || !ramdisk_image || !ramdisk_size)
@@ -243,12 +242,12 @@ static void __init reserve_initrd(void)printk (KERN_INFO "Allocated new RAMDISK: %08llx - %08llx\n" , ramdisk_here, ramdisk_here + ramdisk_size); - do_relocate_initrd = true; +relocate_initrd (); }#define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT) -void __init post_reserve_initrd (void ) +static void __init relocate_initrd (void ) {u64 ramdisk_image = boot_params.hdr.ramdisk_image;u64 ramdisk_size = boot_params.hdr.ramdisk_size;
@@ -257,9 +256,6 @@ void __init post_reserve_initrd(void)unsigned long slop, clen, mapaddr;char *p, *q; -if (!do_relocate_initrd) -return ; - ramdisk_here = initrd_start -PAGE_OFFSET ; q = (char *)initrd_start;
@@ -270,10 +266,6 @@ void __init post_reserve_initrd(void) p = (char *)__va (ramdisk_image);memcpy (q, p, clen); q += clen; -/* need to free these low pages...*/ -printk (KERN_INFO "Freeing old partial RAMDISK %08llx-%08llx\n" , - ramdisk_image, ramdisk_image + clen -1 ); -free_bootmem (ramdisk_image, clen); ramdisk_image += clen; ramdisk_size -= clen; }
@@ -299,16 +291,16 @@ void __init post_reserve_initrd(void) ramdisk_image, ramdisk_image + ramdisk_size -1 , ramdisk_here, ramdisk_here + ramdisk_size - 1); -/* need to free that, otherwise init highmem will reserve it again */ +/* +* need to free old one, otherwise init cross max_low_pfn could be +* converted to bootmem +*/ free_early(ramdisk_image, ramdisk_image+ramdisk_size); }#else void __init reserve_initrd (void ) { } -void __init post_reserve_initrd (void ) -{ -}#endif /* CONFIG_BLK_DEV_INITRD */ #ifdef CONFIG_MCA
arch/x86/mm/init_32.c +0 -3
@@ -831,9 +831,6 @@ void __init paging_init(void)/* * NOTE: at this point the bootmem allocator is fully available. */ - -post_reserve_initrd (); -remapped_pgdat_init ();sparse_init ();zone_sizes_init ();
include/asm-x86/setup.h +0 -1
@@ -39,7 +39,6 @@ void reserve_crashkernel(void);#include <asm/bootparam.h> void reserve_standard_io_resources (void ); -extern void post_reserve_initrd (void );#ifndef _SETUP
PATCH 1/1 x86: introduce init_memory_mapping for 32bit #3
move kva related early backto initmem_init for numa32
--- arch/x86/mm/discontig_32.c | 8 ++++++-- arch/x86/mm/init_32.c | 20 -------------------- include/asm-x86/numa_32.h | 5 ----- 3 files changed, 6 insertions(+), 27 deletions(-)
arch/x86/mm/discontig_32.c +6 -2
@@ -200,7 +200,7 @@ void *alloc_remap(int nid, unsigned longreturn allocation; } -void __init remap_numa_kva (void ) +static void __init remap_numa_kva (void ) {void *vaddr;unsigned long pfn;
@@ -373,12 +373,16 @@ void __init initmem_init(unsigned long sallocate_pgdat (nid); } +remap_numa_kva (); +printk (KERN_DEBUG "High memory starts at vaddr %08lx\n" , (ulong )pfn_to_kaddr (highstart_pfn));for_each_online_node (nid)propagate_e820_map_node (nid); -memset (NODE_DATA (0 ),0 ,sizeof (struct pglist_data )); +for_each_online_node (nid) +memset (NODE_DATA (nid),0 ,sizeof (struct pglist_data )); +NODE_DATA (0 )->bdata = &node0_bdata;setup_bootmem_allocator (); }
arch/x86/mm/init_32.c +0 -20
@@ -449,7 +449,6 @@ static void __init pagetable_init(void)paravirt_pagetable_setup_start (pgd_base); -remap_numa_kva ();/* * Fixed mappings, only the page table structure has to be * created - mappings will be set by set_fixmap():
@@ -724,24 +723,6 @@ void __init setup_bootmem_allocator(void after_init_bootmem =1 ; } -/* -* The node 0 pgdat is initialized before all of these because -* it's needed for bootmem. node>0 pgdats have their virtual -* space allocated before the pagetables are in place to access -* them, so they can't be cleared then. -* -* This should all compile down to nothing when NUMA is off. -*/ -static void __init remapped_pgdat_init (void ) -{ -int nid; - -for_each_online_node (nid) { -if (nid !=0 ) -memset (NODE_DATA (nid),0 ,sizeof (struct pglist_data )); - } -} -static void __init find_early_table_space (unsigned long end) {unsigned long puds, pmds, tables, start;
@@ -831,7 +812,6 @@ void __init paging_init(void)/* * NOTE: at this point the bootmem allocator is fully available. */ -remapped_pgdat_init ();sparse_init ();zone_sizes_init ();
include/asm-x86/numa_32.h +0 -5
@@ -5,12 +5,7 @@ extern int pxm_to_nid(int pxm);extern void numa_remove_cpu (int cpu);#ifdef CONFIG_NUMA -extern void __init remap_numa_kva (void );extern void set_highmem_pages_init (void ); -#else -static inline void remap_numa_kva (void ) -{ -}#endif #endif /* _ASM_X86_32_NUMA_H */
Re: [PATCH] x86: introduce init_memory_mapping for 32bit
In reply to Ingo MolnarQuoted 30 lines · Ingo Molnar
Quoted 4 lines · Yinghai Lu
so could use mem below
max_low_pfnas early. could move several function more early instead of waiting afterpaging_initincluding movingrelocate_initrdearly, and kva related early done ininitmem_initapplied to tip/x86/setup-memory - thanks Yinghai.
a sidenote:
Quoted 1 line
6 files changed, 128 insertions(+), 74 deletions(-)this patch is too large - if it causes any problems it will not be very easy to figure out which exact change caused the problems.
Lets hope it goes all fine - but in the future lets try doing more+smaller patches, especially if they change some known-dangerous area of the kernel.
For example here a better splitup would have been to do 5 or more patches:
1) first introduce
init_memory_mapping()[but dont use it anywhere]
2) add theinit_memory_mapping()call tosetup_arch()
3) moveremap_numa_kva()
4) moverelocate_initrd()
5) remove the now unnecessary setup frompaging_init()
Quoted 6 lines
... or something like that. The point is to manage risk: if there's multiple problem areas that a change is touching, try to isolate them from each other and introduce the change gradually.
The end result is still exactly the same, but much more reviewable/debuggable/bisectable.
split into 3 patches, please use them to replace the old one if you like.
YH
Re: [PATCH] x86: introduce init_memory_mapping for 32bit
Quoted 31 lines · Yinghai Lu
Quoted 30 lines · Ingo Molnar
Quoted 4 lines · Yinghai Lu
so could use mem below
max_low_pfnas early. could move several function more early instead of waiting afterpaging_initincluding movingrelocate_initrdearly, and kva related early done ininitmem_initapplied to tip/x86/setup-memory - thanks Yinghai.
a sidenote:
Quoted 1 line
6 files changed, 128 insertions(+), 74 deletions(-)this patch is too large - if it causes any problems it will not be very easy to figure out which exact change caused the problems.
Lets hope it goes all fine - but in the future lets try doing more+smaller patches, especially if they change some known-dangerous area of the kernel.
For example here a better splitup would have been to do 5 or more patches:
1) first introduce
init_memory_mapping()[but dont use it anywhere]
2) add theinit_memory_mapping()call tosetup_arch()
3) moveremap_numa_kva()
4) moverelocate_initrd()
5) remove the now unnecessary setup frompaging_init()
Quoted 9 lines
Quoted 6 lines
... or something like that. The point is to manage risk: if there's multiple problem areas that a change is touching, try to isolate them from each other and introduce the change gradually.
The end result is still exactly the same, but much more reviewable/debuggable/bisectable.
split into 3 patches, please use them to replace the old one if you like.
and
[PATCH] x86: fix e820_update_range size when overlapping [PATCH] x86: get max_pfn_mapped in init_memory_mapping [PATCH] x86: add table_top check for alloc_low_page in 64 bit [PATCH] x86: change size if e820_update/remove_range
YH
Re: [PATCH] x86: introduce init_memory_mapping for 32bit
In reply to Yinghai LuQuoted 35 lines · Yinghai Lu
Quoted 34 lines · Ingo Molnar
Quoted 4 lines · Yinghai Lu
so could use mem below
max_low_pfnas early. could move several function more early instead of waiting afterpaging_initincluding movingrelocate_initrdearly, and kva related early done ininitmem_initapplied to tip/x86/setup-memory - thanks Yinghai.
a sidenote:
Quoted 1 line
6 files changed, 128 insertions(+), 74 deletions(-)this patch is too large - if it causes any problems it will not be very easy to figure out which exact change caused the problems.
Lets hope it goes all fine - but in the future lets try doing more+smaller patches, especially if they change some known-dangerous area of the kernel.
For example here a better splitup would have been to do 5 or more patches:
1) first introduce
init_memory_mapping()[but dont use it anywhere]
2) add theinit_memory_mapping()call tosetup_arch()
3) moveremap_numa_kva()
4) moverelocate_initrd()
5) remove the now unnecessary setup frompaging_init()... or something like that. The point is to manage risk: if there's multiple problem areas that a change is touching, try to isolate them from each other and introduce the change gradually.
Quoted 5 lines
Quoted 2 lines
The end result is still exactly the same, but much more reviewable/debuggable/bisectable.
split into 3 patches, please use them to replace the old one if you like.
i've applied them to tip/x86/setup-memory, replacing the larger patch - thanks Yinghai.
Ingo