Messages in this thread | | | Date | Wed, 09 Jul 2008 01:02:34 -0700 | From | Jeremy Fitzhardinge <> | Subject | Re: [PATCH 16 of 55] xen64: add extra pv_mmu_ops |
| |
Mark McLoughlin wrote: > Hey Jeremy, > > On Tue, 2008-07-08 at 15:06 -0700, Jeremy Fitzhardinge wrote: > >> We need extra pv_mmu_ops for 64-bit, to deal with the extra level of >> pagetable. >> >> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> >> --- >> arch/x86/xen/enlighten.c | 33 +++++++++++++++++++++++++++- >> arch/x86/xen/mmu.c | 51 +++++++++++++++++++++++++++++++++++++++++++- >> arch/x86/xen/mmu.h | 15 +++++++++++- >> include/asm-x86/xen/page.h | 4 +++ >> 4 files changed, 99 insertions(+), 4 deletions(-) >> > ... > >> diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c >> --- a/arch/x86/xen/mmu.c >> +++ b/arch/x86/xen/mmu.c >> @@ -438,14 +438,19 @@ >> >> void xen_set_pte(pte_t *ptep, pte_t pte) >> { >> +#ifdef CONFIG_X86_PAE >> ptep->pte_high = pte.pte_high; >> smp_wmb(); >> ptep->pte_low = pte.pte_low; >> +#else >> + *ptep = pte; >> +#endif >> } >> > > You've dropped non-PAE support already, right? Any reason to use the > X86_PAE macro instead of X86_32? >
It's a fine difference, but the specific thing I'm testing for is actually PAE vs 64-bit (or even more specifically "can I update a whole pte atomically?"). Testing for X86_32 is equivalent in the absence of non-PAE 32-bit, but not quite as correct. The other way I could do it is as I have elsewhere:
if (sizeof(pte_t) > sizeof(long)) { ptep->pte_high = pte.pte_high; smp_wmb(); ptep->pte_low = pte.pte_low; } else *ptep = pte;
But there are other places where it tests for this using PAE (and even whole pvops which are only defined in the PAE case).
You'll notice other places where I test for PAGETABLE_LEVELS == 3 where the code is generally handling 3-level pagetables, and others where I test for PAE where it's something specific to PAE.
J
| |