This patch was to get my VM percpu working on my laptop. This patch still needs work to handle NUMA and other types of X86 architectures. Signed-off-by: Steven Rostedt <rostedt@xxxxxxxxxxx> Index: linux-2.6.16-test/arch/i386/mm/init.c =================================================================== --- linux-2.6.16-test.orig/arch/i386/mm/init.c 2006-05-17 04:32:28.000000000 -0400 +++ linux-2.6.16-test/arch/i386/mm/init.c 2006-05-17 04:58:37.000000000 -0400 @@ -772,3 +772,39 @@ void free_initrd_mem(unsigned long start } } #endif + +/* + * The following three functions are to impement per_cpu variables + * into VM. per_cpu variables are initialized very early on startup + * and before memory management. So the per_cpu initialization needs + * a way to allocate pages using bootmem. + */ +pud_t __init *pud_boot_alloc(struct mm_struct *mm, pgd_t *pgd, + unsigned long addr, int cpu) +{ + return (pud_t*)pgd; +} + +pmd_t __init *pmd_boot_alloc(struct mm_struct *mm, pud_t *pud, + unsigned long addr, int cpu) +{ + return pmd_offset(pud, addr); +} + +/* FIXME - handle NUMA handling with the CPU parameter */ +pte_t __init *pte_boot_alloc(struct mm_struct *mm, pmd_t *pmd, + unsigned long addr, int cpu) +{ + pte_t *pte; + + if (pmd_none(*pmd)) { + pte = alloc_bootmem_pages(PAGE_SIZE); + if (!pte) + return NULL; + mm->nr_ptes++; + set_pmd(pmd, __pmd(__pa(pte) | _PAGE_TABLE)); + } else + pte = pte_offset_kernel(pmd, addr); + + return pte; +}