> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Wednesday, October 09, 2013 3:07 AM
> To: Bhushan Bharat-R65777
> Cc: ag...@suse.de; Yoder Stuart-B08248; k...@vger.kernel.org; kvm-
> p...@vger.kernel.org; pau...@samba.org; Bhushan Bharat-R65777
> Subject: Re: [PATCH 3/4] kvm: powerpc: define a linux pte lookup function
> 
> On Tue, 2013-10-08 at 11:33 +0530, Bharat Bhushan wrote:
> > We need to search linux "pte" to get "pte" attributes for setting TLB
> > in KVM.
> > This patch defines a linux_pte_lookup() function for same.
> >
> > Signed-off-by: Bharat Bhushan <bharat.bhus...@freescale.com>
> > ---
> >  arch/powerpc/include/asm/pgtable.h |   35 
> > +++++++++++++++++++++++++++++++++++
> >  1 files changed, 35 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/powerpc/include/asm/pgtable.h
> > b/arch/powerpc/include/asm/pgtable.h
> > index 7d6eacf..fd26c04 100644
> > --- a/arch/powerpc/include/asm/pgtable.h
> > +++ b/arch/powerpc/include/asm/pgtable.h
> > @@ -223,6 +223,41 @@ extern int gup_hugepte(pte_t *ptep, unsigned long
> > sz, unsigned long addr,  #endif  pte_t
> > *find_linux_pte_or_hugepte(pgd_t *pgdir, unsigned long ea,
> >                              unsigned *shift);
> > +
> > +static inline pte_t lookup_linux_pte(pgd_t *pgdir, unsigned long hva,
> > +                                unsigned long *pte_sizep)
> > +{
> > +   pte_t *ptep;
> > +   pte_t pte;
> > +   unsigned long ps = *pte_sizep;
> > +   unsigned int shift;
> > +
> > +   ptep = find_linux_pte_or_hugepte(pgdir, hva, &shift);
> > +   if (!ptep)
> > +           return __pte(0);
> > +   if (shift)
> > +           *pte_sizep = 1ul << shift;
> > +   else
> > +           *pte_sizep = PAGE_SIZE;
> > +
> > +   if (ps > *pte_sizep)
> > +           return __pte(0);
> > +
> > +   /* wait until _PAGE_BUSY is clear */
> > +   while (1) {
> > +           pte = pte_val(*ptep);
> > +           if (unlikely(pte & _PAGE_BUSY)) {
> > +                   cpu_relax();
> > +                   continue;
> > +           }
> > +   }
> > +
> > +   /* If pte is not present return None */
> > +   if (unlikely(!(pte & _PAGE_PRESENT)))
> > +           return __pte(0);
> > +
> > +   return pte;
> > +}
> 
> Can lookup_linux_pte_and_update() call lookup_linux_pte()?

What lookup_linux_pte_and_update() does:-
 - find_linux_pte_or_hugepte()
 - does size and some other trivial checks
 - Then atomically update the pte:-
   => while()
   => wait till _PAGE_BUSY is clear
   => atomically update the pte
   => if not updated then go back to while() above else break


While what lookup_linux_pte() does:-
 - find_linux_pte_or_hugepte()
 - does size and some other trivial checks
 - wait till _PAGE_BUSY is clear
 - return pte

I am finding it difficult to call lookup_linux_pte() from 
lookup_linux_pte_and_update().

Thanks
-Bharat

> 
> -Scott
> 

Reply via email to