pte_update and 64-bit PTEs on PPC32?

Kumar Gala kumar.gala at freescale.com
Thu Apr 7 08:27:22 EST 2005


On Apr 6, 2005, at 5:22 PM, Benjamin Herrenschmidt wrote:

> On Wed, 2005-04-06 at 11:44 -0500, Kumar Gala wrote:
>
> > Ben, I agree with you about having the flags in a single word so we 
> can
> > lock them properly.  In the short term it appears that the issue I'm
> > running into is explicit with ptep_get_and_clear():
> >
> > static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned
>  > long addr,
>  >                                         pte_t *ptep)
>  > {
>  >          return __pte(pte_update(ptep, ~_PAGE_HASHPTE, 0));
>  > }
>  >
> > It appears that we should be returning the pte that was passed in,
>  > before its modified?  (seems a little silly to me, why bother, the
> > caller could do this -- i've posted to lkml on the issue?).
>
> No, we should return the "old" PTE.
>
> >   Anyways,
> > since pte_update only returns the lower 32-bits the wrong thing
> > happens.  The following seems to be a better implementation of
> > ptep_get_and_clear() for ppc32 which resolves my issue:
>  >
> > static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned
>  > long addr,
>  >                                         pte_t *ptep)
>  > {
>  >          pte_t tmp = *ptep;
>  >          pte_update(ptep, ~_PAGE_HASHPTE, 0);
>  >          return tmp;
>  > }
>
> Hrm... I would still do it differently. I would read the "rpn only" 
> part
>  non atomically and load/clear the other half atomically. Withotu that,
>  you may miss a bit set between the load and the update (for example,
>  _PAGE_HASHPTE may have been put in in between).

Ben,

I'll let you catch up with the rest of the thread, I realized most of 
what you have here and created a new implementation of pte_update that 
should be doing what you are asking for.

- kumar




More information about the Linuxppc-dev mailing list