]> git.neil.brown.name Git - history.git/commitdiff
Revert pmd/pgd slabification. wli will fix it properly
authorLinus Torvalds <torvalds@home.transmeta.com>
Sat, 3 May 2003 11:36:37 +0000 (04:36 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sat, 3 May 2003 11:36:37 +0000 (04:36 -0700)
Cset exclude: akpm@digeo.com|ChangeSet|20030204165956|06074
Cset exclude: akpm@digeo.com|ChangeSet|20030204165949|06077

arch/i386/mm/init.c
arch/i386/mm/pgtable.c
include/asm-i386/pgalloc.h
include/asm-i386/pgtable-3level.h
include/asm-i386/pgtable.h

index 6199c9fd6984bd514090c6c86af1618506799869..03bb9446039b5a6246deec5ce8f347d45db00daa 100644 (file)
@@ -505,36 +505,20 @@ void __init mem_init(void)
 #endif
 }
 
-#include <linux/slab.h>
-
-kmem_cache_t *pmd_cache;
-kmem_cache_t *pgd_cache;
-
-void pmd_ctor(void *, kmem_cache_t *, unsigned long);
-void pgd_ctor(void *, kmem_cache_t *, unsigned long);
+#if CONFIG_X86_PAE
+struct kmem_cache_s *pae_pgd_cachep;
 
 void __init pgtable_cache_init(void)
 {
-       if (PTRS_PER_PMD > 1) {
-               pmd_cache = kmem_cache_create("pae_pmd",
-                                               PTRS_PER_PMD*sizeof(pmd_t),
-                                               0,
-                                               SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN,
-                                               pmd_ctor,
-                                               NULL);
-
-               if (!pmd_cache)
-                       panic("pgtable_cache_init(): cannot create pmd cache");
-       }
-
         /*
          * PAE pgds must be 16-byte aligned:
          */
-        pgd_cache = kmem_cache_create("pgd", PTRS_PER_PGD*sizeof(pgd_t), 0,
-                SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN, pgd_ctor, NULL);
-        if (!pgd_cache)
-                panic("pgtable_cache_init(): Cannot create pgd cache");
+        pae_pgd_cachep = kmem_cache_create("pae_pgd", 32, 0,
+                SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
+        if (!pae_pgd_cachep)
+                panic("init_pae(): Cannot alloc pae_pgd SLAB cache");
 }
+#endif
 
 /*
  * This function cannot be __init, since exceptions don't work in that
index 9d36261de7d081c51b5739c2d3a57a2d79052602..bd6d2e7cedd80c827363d9179d1e4e6db5ae100f 100644 (file)
@@ -151,60 +151,61 @@ struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
        return pte;
 }
 
-extern kmem_cache_t *pmd_cache;
-extern kmem_cache_t *pgd_cache;
+#if CONFIG_X86_PAE
 
-void pmd_ctor(void *__pmd, kmem_cache_t *pmd_cache, unsigned long flags)
+pgd_t *pgd_alloc(struct mm_struct *mm)
 {
-       clear_page(__pmd);
+       int i;
+       pgd_t *pgd = kmem_cache_alloc(pae_pgd_cachep, GFP_KERNEL);
+
+       if (pgd) {
+               for (i = 0; i < USER_PTRS_PER_PGD; i++) {
+                       unsigned long pmd = __get_free_page(GFP_KERNEL);
+                       if (!pmd)
+                               goto out_oom;
+                       clear_page(pmd);
+                       set_pgd(pgd + i, __pgd(1 + __pa(pmd)));
+               }
+               memcpy(pgd + USER_PTRS_PER_PGD,
+                       swapper_pg_dir + USER_PTRS_PER_PGD,
+                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+       }
+       return pgd;
+out_oom:
+       for (i--; i >= 0; i--)
+               free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+       kmem_cache_free(pae_pgd_cachep, pgd);
+       return NULL;
 }
 
-void pgd_ctor(void *__pgd, kmem_cache_t *pgd_cache, unsigned long flags)
+void pgd_free(pgd_t *pgd)
 {
-       pgd_t *pgd = __pgd;
+       int i;
 
-       if (PTRS_PER_PMD == 1)
-               memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
-       memcpy(pgd + USER_PTRS_PER_PGD,
-               swapper_pg_dir + USER_PTRS_PER_PGD,
-               (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+       for (i = 0; i < USER_PTRS_PER_PGD; i++)
+               free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+       kmem_cache_free(pae_pgd_cachep, pgd);
 }
 
+#else
+
 pgd_t *pgd_alloc(struct mm_struct *mm)
 {
-       int i;
-       pgd_t *pgd = kmem_cache_alloc(pgd_cache, SLAB_KERNEL);
-
-       if (PTRS_PER_PMD == 1)
-               return pgd;
-       else if (!pgd)
-               return NULL;
-
-       for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-               pmd_t *pmd = kmem_cache_alloc(pmd_cache, SLAB_KERNEL);
-               if (!pmd)
-                       goto out_oom;
-               set_pgd(pgd + i, __pgd(1 + __pa((unsigned long long)((unsigned long)pmd))));
+       pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
+
+       if (pgd) {
+               memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
+               memcpy(pgd + USER_PTRS_PER_PGD,
+                       swapper_pg_dir + USER_PTRS_PER_PGD,
+                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
        }
        return pgd;
-
-out_oom:
-       for (i--; i >= 0; --i)
-               kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
-       kmem_cache_free(pgd_cache, (void *)pgd);
-       return NULL;
 }
 
 void pgd_free(pgd_t *pgd)
 {
-       int i;
+       free_page((unsigned long)pgd);
+}
 
-       if (PTRS_PER_PMD > 1) {
-               for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-                       kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
-                       set_pgd(pgd + i, __pgd(0));
-               }
-       }
+#endif /* CONFIG_X86_PAE */
 
-       kmem_cache_free(pgd_cache, (void *)pgd);
-}
index 640ca76d0ad2786b72027d05f2d3e09919c51fbe..a44e266934f6ae981814bfe5d3f019ba218b4544 100644 (file)
@@ -20,11 +20,11 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *p
  * Allocate and free page tables.
  */
 
-pgd_t *pgd_alloc(struct mm_struct *);
-void pgd_free(pgd_t *pgd);
+extern pgd_t *pgd_alloc(struct mm_struct *);
+extern void pgd_free(pgd_t *pgd);
 
-pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
-struct page *pte_alloc_one(struct mm_struct *, unsigned long);
+extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
+extern struct page *pte_alloc_one(struct mm_struct *, unsigned long);
 
 static inline void pte_free_kernel(pte_t *pte)
 {
index 147acd8530e2be59627a2d861f36d0587a4bf010..0ca6393cbe4c209a69d6c275ae98a37b38a55f20 100644 (file)
@@ -123,4 +123,6 @@ static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
 #define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })
 #define PTE_FILE_MAX_BITS       32
 
+extern struct kmem_cache_s *pae_pgd_cachep;
+
 #endif /* _I386_PGTABLE_3LEVEL_H */
index 1c557c87abf18859ea341ce58474d042a73be9bf..c2ef3a5479ecafb5c0078a729275f0beac99ff77 100644 (file)
@@ -41,12 +41,21 @@ extern unsigned long empty_zero_page[1024];
 #ifndef __ASSEMBLY__
 #ifdef CONFIG_X86_PAE
 # include <asm/pgtable-3level.h>
+
+/*
+ * Need to initialise the X86 PAE caches
+ */
+extern void pgtable_cache_init(void);
+
 #else
 # include <asm/pgtable-2level.h>
-#endif
 
-void pgtable_cache_init(void);
+/*
+ * No page table caches to initialise
+ */
+#define pgtable_cache_init()   do { } while (0)
 
+#endif
 #endif
 
 #define PMD_SIZE       (1UL << PMD_SHIFT)