x86: use a uniform structure for pte_t
Subsystems (3)
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, pmdstatic 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, pudstatic 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 lonstatic 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)