]> err.no Git - linux-2.6/commitdiff
[PATCH] powerpc: 64k pages pmd alloc fix
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 10 Nov 2005 03:53:16 +0000 (14:53 +1100)
committerPaul Mackerras <paulus@samba.org>
Thu, 10 Nov 2005 04:03:29 +0000 (15:03 +1100)
This patch makes the kernel use a different kmem cache for PMD pages
as they are smaller than PTE pages. Avoids waste of memory.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/mm/init_64.c
include/asm-ppc64/pgalloc.h

index ce974c83d88a6f1decd8341ccf92fbf253133c37..e274cf10205c902889747c8633ca01f5a5fc09bd 100644 (file)
@@ -20,6 +20,8 @@
  *
  */
 
+#undef DEBUG
+
 #include <linux/config.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <asm/vdso.h>
 #include <asm/imalloc.h>
 
+#ifdef DEBUG
+#define DBG(fmt...) printk(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
 #if PGTABLE_RANGE > USER_VSID_RANGE
 #warning Limited user VSID range means pagetable space is wasted
 #endif
@@ -188,14 +196,14 @@ static void zero_ctor(void *addr, kmem_cache_t *cache, unsigned long flags)
 }
 
 #ifdef CONFIG_PPC_64K_PAGES
-static const int pgtable_cache_size[2] = {
-       PTE_TABLE_SIZE, PGD_TABLE_SIZE
+static const unsigned int pgtable_cache_size[3] = {
+       PTE_TABLE_SIZE, PMD_TABLE_SIZE, PGD_TABLE_SIZE
 };
 static const char *pgtable_cache_name[ARRAY_SIZE(pgtable_cache_size)] = {
-       "pte_pmd_cache", "pgd_cache",
+       "pte_pmd_cache", "pmd_cache", "pgd_cache",
 };
 #else
-static const int pgtable_cache_size[2] = {
+static const unsigned int pgtable_cache_size[2] = {
        PTE_TABLE_SIZE, PMD_TABLE_SIZE
 };
 static const char *pgtable_cache_name[ARRAY_SIZE(pgtable_cache_size)] = {
@@ -213,6 +221,8 @@ void pgtable_cache_init(void)
                int size = pgtable_cache_size[i];
                const char *name = pgtable_cache_name[i];
 
+               DBG("Allocating page table cache %s (#%d) "
+                   "for size: %08x...\n", name, i, size);
                pgtable_cache[i] = kmem_cache_create(name,
                                                     size, size,
                                                     SLAB_HWCACHE_ALIGN |
index 98da0e4262bd2f02a6d07c3df5d2c68eb3f495f3..dcf3622d19462110dda6332b30f9234feb8f16cc 100644 (file)
@@ -10,8 +10,8 @@ extern kmem_cache_t *pgtable_cache[];
 
 #ifdef CONFIG_PPC_64K_PAGES
 #define PTE_CACHE_NUM  0
-#define PMD_CACHE_NUM  0
-#define PGD_CACHE_NUM  1
+#define PMD_CACHE_NUM  1
+#define PGD_CACHE_NUM  2
 #else
 #define PTE_CACHE_NUM  0
 #define PMD_CACHE_NUM  1