Messages in this thread | | | Date | Wed, 27 Oct 2010 12:40:21 +0200 | From | Borislav Petkov <> | Subject | Re: [PATCH] x86: use pgd accessors when cloning a pgd range. |
| |
On Wed, Oct 27, 2010 at 09:50:13AM +0100, Ian Campbell wrote: > Page tables should always be updated using the proper accessor > methods. Not doing so bypasses the paravirt infrastructure. > > In this case the failure to do so was exposed under Xen by > b40827fa7268 "x86-32, mm: Add an initial page table for core > bootstrapping". > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > Cc: Borislav Petkov <bp@alien8.de> > Cc: H. Peter Anvin <hpa@linux.intel.com> > Cc: Jeremy Fitzhardinge <jeremy@goop.org> > --- > arch/x86/include/asm/pgtable.h | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h > index ada823a..0b4c514 100644 > --- a/arch/x86/include/asm/pgtable.h > +++ b/arch/x86/include/asm/pgtable.h > @@ -619,7 +619,10 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, > */ > static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count) > { > - memcpy(dst, src, count * sizeof(pgd_t)); > + int i; > + > + for (i=0; i<count; i++) > + set_pgd(&dst[i], src[i]);
Hmm, this slows down clone_pgd_range(). It is called at 3 sites total, two of which happen only on boot in setup_arch() so they can be ignored but the callchain
copy_process() ... mm_init() |->mm_alloc_pgd() |->pgd_alloc() |->pgd_ctor() |->clone_pgd_range()
could become noticeable. To be on the safe side, I'd make clone_pgd_range() a macro calling either the native or the xen version..
hpa?
-- Regards/Gruss, Boris.
| |