Loading arch/x86/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -960,7 +960,7 @@ config ARCH_PHYS_ADDR_T_64BIT config NUMA bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" depends on SMP depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN) depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) default n if X86_PC default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) help Loading arch/x86/include/asm/mmzone_32.h +4 −0 Original line number Diff line number Diff line Loading @@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void) extern int early_pfn_to_nid(unsigned long pfn); extern void resume_map_numa_kva(pgd_t *pgd); #else /* !CONFIG_NUMA */ #define get_memcfg_numa get_memcfg_numa_flat static inline void resume_map_numa_kva(pgd_t *pgd) {} #endif /* CONFIG_NUMA */ #ifdef CONFIG_DISCONTIGMEM Loading arch/x86/mm/numa_32.c +35 −0 Original line number Diff line number Diff line Loading @@ -222,6 +222,41 @@ static void __init remap_numa_kva(void) } } #ifdef CONFIG_HIBERNATION /** * resume_map_numa_kva - add KVA mapping to the temporary page tables created * during resume from hibernation * @pgd_base - temporary resume page directory */ void resume_map_numa_kva(pgd_t *pgd_base) { int node; for_each_online_node(node) { unsigned long start_va, start_pfn, size, pfn; start_va = (unsigned long)node_remap_start_vaddr[node]; start_pfn = node_remap_start_pfn[node]; size = node_remap_size[node]; printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); pgd_t *pgd = pgd_base + pgd_index(vaddr); pud_t *pud = pud_offset(pgd, vaddr); pmd_t *pmd = pmd_offset(pud, vaddr); set_pmd(pmd, pfn_pmd(start_pfn + pfn, PAGE_KERNEL_LARGE_EXEC)); printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", __FUNCTION__, vaddr, start_pfn + pfn); } } } #endif static unsigned long calculate_numa_remap_pages(void) { int nid; Loading arch/x86/power/hibernate_32.c +4 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <asm/system.h> #include <asm/page.h> #include <asm/pgtable.h> #include <asm/mmzone.h> /* Defined in hibernate_asm_32.S */ extern int restore_image(void); Loading Loading @@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base) } } } resume_map_numa_kva(pgd_base); return 0; } Loading Loading
arch/x86/Kconfig +1 −1 Original line number Diff line number Diff line Loading @@ -960,7 +960,7 @@ config ARCH_PHYS_ADDR_T_64BIT config NUMA bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" depends on SMP depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN) depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) default n if X86_PC default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) help Loading
arch/x86/include/asm/mmzone_32.h +4 −0 Original line number Diff line number Diff line Loading @@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void) extern int early_pfn_to_nid(unsigned long pfn); extern void resume_map_numa_kva(pgd_t *pgd); #else /* !CONFIG_NUMA */ #define get_memcfg_numa get_memcfg_numa_flat static inline void resume_map_numa_kva(pgd_t *pgd) {} #endif /* CONFIG_NUMA */ #ifdef CONFIG_DISCONTIGMEM Loading
arch/x86/mm/numa_32.c +35 −0 Original line number Diff line number Diff line Loading @@ -222,6 +222,41 @@ static void __init remap_numa_kva(void) } } #ifdef CONFIG_HIBERNATION /** * resume_map_numa_kva - add KVA mapping to the temporary page tables created * during resume from hibernation * @pgd_base - temporary resume page directory */ void resume_map_numa_kva(pgd_t *pgd_base) { int node; for_each_online_node(node) { unsigned long start_va, start_pfn, size, pfn; start_va = (unsigned long)node_remap_start_vaddr[node]; start_pfn = node_remap_start_pfn[node]; size = node_remap_size[node]; printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node); for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) { unsigned long vaddr = start_va + (pfn << PAGE_SHIFT); pgd_t *pgd = pgd_base + pgd_index(vaddr); pud_t *pud = pud_offset(pgd, vaddr); pmd_t *pmd = pmd_offset(pud, vaddr); set_pmd(pmd, pfn_pmd(start_pfn + pfn, PAGE_KERNEL_LARGE_EXEC)); printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n", __FUNCTION__, vaddr, start_pfn + pfn); } } } #endif static unsigned long calculate_numa_remap_pages(void) { int nid; Loading
arch/x86/power/hibernate_32.c +4 −0 Original line number Diff line number Diff line Loading @@ -12,6 +12,7 @@ #include <asm/system.h> #include <asm/page.h> #include <asm/pgtable.h> #include <asm/mmzone.h> /* Defined in hibernate_asm_32.S */ extern int restore_image(void); Loading Loading @@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base) } } } resume_map_numa_kva(pgd_base); return 0; } Loading