]> git.hungrycats.org Git - linux/commitdiff
[SPARC32]: Align pkmap properly.
authorKeith M. Wesolowski <wesolows@foobazco.org>
Mon, 2 Feb 2004 02:16:08 +0000 (18:16 -0800)
committerKeith M. Wesolowski <wesolows@foobazco.org>
Mon, 2 Feb 2004 02:16:08 +0000 (18:16 -0800)
Align the pkmap area on a 4MB region so that a single
large pagetable can be used.  Fixes random killing of
processes which used high memory.

arch/sparc/mm/srmmu.c
include/asm-sparc/highmem.h
include/asm-sparc/pgtsrmmu.h

index 5109625cad58f4f85f1a043c241fe35add1b3813..0a0e52cad279fe55403da34f2b9501b580465807 100644 (file)
 
 #include <asm/btfixup.h>
 
-/*
- * To support pagetables in highmem, Linux introduces APIs which
- * return struct page* and generally manipulate page tables when
- * they are not mapped into kernel space. Our hardware page tables
- * are smaller than pages. We lump hardware tabes into big, page sized
- * software tables.
- *
- * PMD_SHIFT determines the size of the area a second-level page table entry
- * can map, and our pmd_t is 16 times larger than normal.
- */
-#define SRMMU_PTRS_PER_PMD_SOFT    0x4 /* Each pmd_t contains 16 hard PTPs */
-#define SRMMU_PTRS_PER_PTE_SOFT  0x400 /* 16 hard tables per 4K page */
-#define SRMMU_PTE_SZ_SOFT       0x1000 /* same as above, in bytes */
-
-#define SRMMU_PMD_SHIFT_SOFT   22
-#define SRMMU_PMD_SIZE_SOFT    (1UL << SRMMU_PMD_SHIFT_SOFT)
-#define SRMMU_PMD_MASK_SOFT    (~(SRMMU_PMD_SIZE_SOFT-1))
-// #define SRMMU_PMD_ALIGN(addr)  (((addr)+SRMMU_PMD_SIZE-1)&SRMMU_PMD_MASK)
-
-
 enum mbus_module srmmu_modtype;
 unsigned int hwbug_bitmask;
 int vac_cache_size;
index f2795c8dcdddae82c58392f65129dc8a88343e63..7ca1a85c26e9ea5bdbb1552f925d1541e9f870ef 100644 (file)
@@ -38,10 +38,12 @@ extern void kmap_init(void) __init;
 /*
  * Right now we initialize only a single pte table. It can be extended
  * easily, subsequent pte tables have to be allocated in one physical
- * chunk of RAM.
+ * chunk of RAM.  Currently the simplest way to do this is to align the
+ * pkmap region on a pagetable boundary (4MB).
  */
-#define PKMAP_BASE (SRMMU_NOCACHE_VADDR + (SRMMU_MAX_NOCACHE_PAGES << PAGE_SHIFT))
 #define LAST_PKMAP 1024
+#define PKMAP_SIZE (LAST_PKMAP << PAGE_SHIFT)
+#define PKMAP_BASE SRMMU_PMD_ALIGN_SOFT(SRMMU_NOCACHE_VADDR + (SRMMU_MAX_NOCACHE_PAGES << PAGE_SHIFT))
 
 #define LAST_PKMAP_MASK (LAST_PKMAP - 1)
 #define PKMAP_NR(virt)  ((virt - PKMAP_BASE) >> PAGE_SHIFT)
index dee6984d949f22cfc587e873d7654e992b5069cb..0a6f80c5d68ce878d95ae8d548bddfe24f37eb5c 100644 (file)
 #define SRMMU_PMD_TABLE_SIZE    0x100 /* 64 entries, 4 bytes a piece */
 #define SRMMU_PGD_TABLE_SIZE    0x400 /* 256 entries, 4 bytes a piece */
 
+/*
+ * To support pagetables in highmem, Linux introduces APIs which
+ * return struct page* and generally manipulate page tables when
+ * they are not mapped into kernel space. Our hardware page tables
+ * are smaller than pages. We lump hardware tabes into big, page sized
+ * software tables.
+ *
+ * PMD_SHIFT determines the size of the area a second-level page table entry
+ * can map, and our pmd_t is 16 times larger than normal.
+ */
+#define SRMMU_PTRS_PER_PTE_SOFT        (PAGE_SIZE/4)   /* 16 hard tables per 4K page */
+#define SRMMU_PTRS_PER_PMD_SOFT        4       /* Each pmd_t contains 16 hard PTPs */
+#define SRMMU_PTE_SZ_SOFT       PAGE_SIZE      /* same as above, in bytes */
+
+#define SRMMU_PMD_SHIFT_SOFT   22
+#define SRMMU_PMD_SIZE_SOFT    (1UL << SRMMU_PMD_SHIFT_SOFT)
+#define SRMMU_PMD_MASK_SOFT    (~(SRMMU_PMD_SIZE_SOFT-1))
+#define SRMMU_PMD_ALIGN_SOFT(addr)  (((addr)+SRMMU_PMD_SIZE_SOFT-1)&SRMMU_PMD_MASK_SOFT)
+
 /* Definition of the values in the ET field of PTD's and PTE's */
 #define SRMMU_ET_MASK         0x3
 #define SRMMU_ET_INVALID      0x0