Skip to contentSkip to conversation

x86: use a uniform structure for pte_t

PATCH In review Jeremy Fitzhardinge 1 participant 1 message Dec 14, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 4/4 x86: use a uniform structure for pte_t

Make pte_t have the same basic structure for all pagetable formats so that it can be accessed in a uniform way. This means exposing both a "pte" element which is the whole pte value (32 or 64 bit), and pte_low+pte_high for users which need to access each half independently (pte_high doesn't exist for 32-bit pte entries).

This allows a number of follow-on opportunities for sharing code.

---
 arch/x86/kernel/vmi_32.c         |   10 +-
 arch/x86/xen/mmu.c               |    4 
 include/asm-x86/page.h           |   56 +++++-------
 include/asm-x86/paravirt.h       |  157 ++++++++++++++++++++-------------
 include/asm-x86/pgtable-2level.h |   22 ++--
 include/asm-x86/pgtable-3level.h |   12 --
 include/asm-x86/pgtable.h        |  177 +++++++++++++++++++++++++++++++-------
 include/asm-x86/pgtable_32.h     |   55 -----------
 include/asm-x86/pgtable_64.h     |   52 +++--------
 include/asm-x86/tlbflush.h       |    1 
 include/xen/page.h               |    4 
 11 files changed, 300 insertions(+), 250 deletions(-)

===================================================================

arch/x86/kernel/vmi_32.c +5 -5
@@ -475,10 +475,10 @@ static void vmi_set_pmd(pmd_t *pmdp, pmd
 static void vmi_set_pmd(pmd_t *pmdp, pmd_t pmdval)
 {
 #ifdef CONFIG_X86_PAE
-	const pte_t pte = { pmdval.pmd, pmdval.pmd >> 32 };
+	const pte_t pte = { .pte = pmdval.pmd };
 	vmi_check_page_type(__pa(pmdp) >> PAGE_SHIFT, VMI_PAGE_PMD);
 #else
-	const pte_t pte = { pmdval.pud.pgd.pgd };
+	const pte_t pte = { .pte = pmdval.pud.pgd.pgd };
 	vmi_check_page_type(__pa(pmdp) >> PAGE_SHIFT, VMI_PAGE_PGD);
 #endif
 	vmi_ops.set_pte(pte, (pte_t *)pmdp, VMI_PAGE_PD);
@@ -508,21 +508,21 @@ static void vmi_set_pud(pud_t *pudp, pud
 static void vmi_set_pud(pud_t *pudp, pud_t pudval)
 {
 	/* Um, eww */
-	const pte_t pte = { pudval.pgd.pgd, pudval.pgd.pgd >> 32 };
+	const pte_t pte = { .pte = pudval.pgd.pgd };
 	vmi_check_page_type(__pa(pudp) >> PAGE_SHIFT, VMI_PAGE_PGD);
 	vmi_ops.set_pte(pte, (pte_t *)pudp, VMI_PAGE_PDP);
 }
 
 static void vmi_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
 {
-	const pte_t pte = { 0 };
+	const pte_t pte = { .pte = 0 };
 	vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE);
 	vmi_ops.set_pte(pte, ptep, vmi_flags_addr(mm, addr, VMI_PAGE_PT, 0));
 }
 
 static void vmi_pmd_clear(pmd_t *pmd)
 {
-	const pte_t pte = { 0 };
+	const pte_t pte = { .pte = 0 };
 	vmi_check_page_type(__pa(pmd) >> PAGE_SHIFT, VMI_PAGE_PMD);
 	vmi_ops.set_pte(pte, (pte_t *)pmd, VMI_PAGE_PD);
 }

===================================================================

arch/x86/xen/mmu.c +2 -2
@@ -248,7 +248,7 @@ pte_t xen_make_pte(unsigned long long pt
 
 	pte &= ~_PAGE_PCD;
 
-	return (pte_t){ pte, pte >> 32 };
+	return (pte_t){ .pte = pte };
 }
 
 pmd_t xen_make_pmd(unsigned long long pmd)
@@ -299,7 +299,7 @@ pte_t xen_make_pte(unsigned long pte)
 
 	pte &= ~_PAGE_PCD;
 
-	return (pte_t){ pte };
+	return (pte_t){ .pte = pte };
 }
 
 pgd_t xen_make_pgd(unsigned long pgd)

===================================================================

include/asm-x86/page.h +25 -31

91 lines not on this page · raw message

===================================================================

include/asm-x86/paravirt.h +94 -63

214 lines not on this page · raw message

===================================================================

include/asm-x86/pgtable-2level.h +10 -12
@@ -27,28 +27,26 @@ static inline void native_set_pmd(pmd_t 
 	*pmdp = pmd;
 }
 
-#undef set_pte_atomic
-static inline void set_pte_atomic(pte_t *ptep, pte_t pteval)
+static inline void native_set_pte_atomic(pte_t *ptep, pte_t pteval)
 {
-	set_pte(ptep, pteval);
+	native_set_pte(ptep, pteval);
 }
 
-static inline void set_pte_present(struct mm_struct *mm, unsigned long addr,
-				   pte_t *ptep, pte_t pteval)
+static inline void native_set_pte_present(struct mm_struct *mm, unsigned long addr,
+					  pte_t *ptep, pte_t pteval)
 {
-	set_pte_at(mm, addr, ptep, pteval);
+	native_set_pte_at(mm, addr, ptep, pteval);
 }
 
 static inline void native_pte_clear(struct mm_struct *mm,
 				    unsigned long addr, pte_t *ptep)
 {
-	set_pte_at(mm, addr, ptep, __pte(0));
+	native_set_pte_at(mm, addr, ptep, __pte(0));
 }
 
-#undef pmd_clear
-static inline void pmd_clear(pmd_t *pmdp)
+static inline void native_pmd_clear(pmd_t *pmdp)
 {
-	set_pmd(pmdp, __pmd(0));
+	native_set_pmd(pmdp, __pmd(0));
 }
 
 static inline pte_t native_ptep_get_and_clear(pte_t *xp)
@@ -87,7 +85,7 @@ static inline int pte_exec_kernel(pte_t 
 #define __swp_offset(x)			((x).val >> 8)
 #define __swp_entry(type, offset)	\
 	((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
-#define __pte_to_swp_entry(pte)		((swp_entry_t) { (pte).pte_low })
-#define __swp_entry_to_pte(x)		((pte_t) { (x).val })
+#define __pte_to_swp_entry(pte)		((swp_entry_t){.val = native_pte_val(pte)})
+#define __swp_entry_to_pte(x)		(native_make_pte((x).val))
 
 #endif /* _I386_PGTABLE_2LEVEL_H */

===================================================================

include/asm-x86/pgtable-3level.h +3 -9
@@ -105,7 +105,7 @@ static inline void native_pmd_clear(pmd_
  * We do not let the generic code free and clear pgd entries due to
  * this erratum.
  */
-static inline void pud_clear(pud_t * pud) { }
+static inline void native_pud_clear(pud_t * pud) { }
 
 #define pud_page(pud)					\
 	((struct page *) __va(pud_val(pud) & PAGE_MASK))
@@ -130,12 +130,6 @@ static inline pte_t native_ptep_get_and_
 	return res;
 }
 
-#define __HAVE_ARCH_PTE_SAME
-static inline int pte_same(pte_t a, pte_t b)
-{
-	return a.pte_low == b.pte_low && a.pte_high == b.pte_high;
-}
-
 extern unsigned long long __supported_pte_mask;
 
 
@@ -151,8 +145,8 @@ extern unsigned long long __supported_pt
 #define __swp_type(x)			(((x).val) & 0x1f)
 #define __swp_offset(x)			((x).val >> 5)
 #define __swp_entry(type, offset)	((swp_entry_t){(type) | (offset) << 5})
-#define __pte_to_swp_entry(pte)		((swp_entry_t){ (pte).pte_high })
-#define __swp_entry_to_pte(x)		((pte_t){ 0, (x).val })
+#define __pte_to_swp_entry(pte)		((swp_entry_t){.val = native_pte_val(pte) >> 32})
+#define __swp_entry_to_pte(x)		(native_make_pte((pteval_t)(x).val << 32))
 
 #define __pmd_free_tlb(tlb, x)		do { } while (0)
 

===================================================================

include/asm-x86/pgtable.h +145 -32

194 lines not on this page · raw message

===================================================================

include/asm-x86/pgtable_32.h +0 -55

73 lines not on this page · raw message

===================================================================

include/asm-x86/pgtable_64.h +14 -38

87 lines not on this page · raw message

===================================================================

include/asm-x86/tlbflush.h +0 -1
@@ -1,7 +1,6 @@
 #ifndef _ASM_X86_TLBFLUSH_H
 #define _ASM_X86_TLBFLUSH_H
 
-#include <linux/mm.h>
 #include <linux/sched.h>
 
 #include <asm/processor.h>

===================================================================

include/xen/page.h +2 -2
@@ -156,11 +156,11 @@ static inline pte_t mfn_pte(unsigned lon
 
 static inline unsigned long long pte_val_ma(pte_t x)
 {
-	return ((unsigned long long)x.pte_high << 32) | x.pte_low;
+	return x.pte;
 }
 #define pmd_val_ma(v) ((v).pmd)
 #define pud_val_ma(v) ((v).pgd.pgd)
-#define __pte_ma(x)	((pte_t) { .pte_low = (x), .pte_high = (x)>>32 } )
+#define __pte_ma(x)	((pte_t) { .pte = (x) })
 #define __pmd_ma(x)	((pmd_t) { (x) } )
 #else  /* !X86_PAE */
 #define pte_mfn(_pte) ((_pte).pte_low >> PAGE_SHIFT)