Skip to contentSkip to conversation

Simplify pte_offset_{map,map_nested}() on 32 bits [try #2]

PATCH In review Franck Bui-Huu 2 participants 2 messages May 4, 2007 – May 11, 2007 MIPS

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Simplify pte_offset_{map,map_nested}() on 32 bits [try #2]

From: Franck Bui-Huu <[email protected]>

Since both kernel and process page tables are never allocated in highmem these 2 macros were doing unnecessary extra works for getting a pte from a pmd.

This patch also clean up pte allocation functions by passing __GFP_ZERO to alloc_pages() and by removing a useless local variable.

With this patch the size of the kernel is slighly reduced.

---

Hi Ralf,

Maybe I'm missing something but it seems that page tables are never allocated from highmem. Please correct me if I'm wrong. This patch boot fine on a 32-bits platform without highmem though.

This patch does not include any modifications for 64-bits platforms since I can't test them but this assertion should be more true since there's no highmem on these platforms. I can make another patch for such platforms if you think it makes sense.

Please consider,

Franck

 include/asm-mips/pgalloc.h    |   22 ++++++----------------
 include/asm-mips/pgtable-32.h |   13 +++++--------
 2 files changed, 11 insertions(+), 24 deletions(-)
include/asm-mips/pgalloc.h +6 -16
index 5685d4f..a3b9953 100644
@@ -62,26 +62,16 @@ static inline void pgd_free(pgd_t *pgd)
 	free_pages((unsigned long)pgd, PGD_ORDER);
 }
 
-static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
-	unsigned long address)
+static inline pte_t *
+pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
 {
-	pte_t *pte;
-
-	pte = (pte_t *) __get_free_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, PTE_ORDER);
-
-	return pte;
+	return (pte_t *)__get_free_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, PTE_ORDER);
 }
 
-static inline struct page *pte_alloc_one(struct mm_struct *mm,
-	unsigned long address)
+static inline struct page *
+pte_alloc_one(struct mm_struct *mm, unsigned long address)
 {
-	struct page *pte;
-
-	pte = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER);
-	if (pte)
-		clear_highpage(pte);
-
-	return pte;
+	return alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, PTE_ORDER);
 }
 
 static inline void pte_free_kernel(pte_t *pte)
include/asm-mips/pgtable-32.h +5 -8
index 2fbd47e..9e0a8c7 100644
@@ -143,6 +143,7 @@ pfn_pte(unsigned long pfn, pgprot_t prot)
 #define __pgd_offset(address)	pgd_index(address)
 #define __pud_offset(address)	(((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
 #define __pmd_offset(address)	(((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
+#define __pte_offset(address)	(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
 
 /* to find an entry in a kernel page-table-directory */
 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
@@ -153,19 +154,15 @@ pfn_pte(unsigned long pfn, pgprot_t prot)
 #define pgd_offset(mm,addr)	((mm)->pgd + pgd_index(addr))
 
 /* Find an entry in the third-level page table.. */
-#define __pte_offset(address)						\
-	(((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
 #define pte_offset(dir, address)					\
 	((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address))
 #define pte_offset_kernel(dir, address)					\
 	((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address))
 
-#define pte_offset_map(dir, address)                                    \
-	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
-#define pte_offset_map_nested(dir, address)                             \
-	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
-#define pte_unmap(pte) ((void)(pte))
-#define pte_unmap_nested(pte) ((void)(pte))
+#define pte_offset_map(dir, address)		pte_offset_kernel(dir,address)
+#define pte_offset_map_nested(dir, address)	pte_offset_kernel(dir,address)
+#define pte_unmap(pte)				((void)(pte))
+#define pte_unmap_nested(pte)			((void)(pte))
 
 #if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
 
Signature · 1 line
1.5.1.3
#1 lore raw
Quoted 10 lines · Franck Bui-Huu

From: Franck Bui-Huu <[email protected]>

Since both kernel and process page tables are never allocated in highmem these 2 macros were doing unnecessary extra works for getting a pte from a pmd.

This patch also clean up pte allocation functions by passing __GFP_ZERO to alloc_pages() and by removing a useless local variable.

With this patch the size of the kernel is slighly reduced.

These hook allows general mapping of pagetables, not just highmem. On MIPS that's useful because fancy mapping stuff allows a faster implementation of TLB exception handlers. That was more or less the official strategy for the R2000. Then the R4000 came and broke this scheme with virtual aliases which was hard to fix back then so I had to switch to the current pagetable and TLB reload mechanism. If you care about the details, take a look at Linux/MIPS 2.1.1.

The fact that getting this to work again would also allow putting pagetables into highmem at virtually no extra effort is a nice side effect, of course.

Ralf