On Tue, Jul 17, 2012 at 02:25:24PM +0200, Hiroshi Doyu wrote:
> The above spin_lock is always necessary. "as->lock" should be held to
> protect "as->pdir_page". Only when "as->pdir_page" is NULL,
> "as->pdir_page" would be allocated in "alloc_pdir()". Without this
> lock, the following race could happen:
> 
> 
> Without as->lock:
> A:                    B:
> i == 3
> pdir_page == NULL
>                       i == 3
>                       pdir_page == NULL
> pdir_page = a;
>                       pdir_page = b;  !!!!!! OVERWRITTEN !!!!!!
>

Unless I am missing something, this is not the correct situation with my
patch. It would look more like this:


 A:                                     B:
 i == 3
 pdir_page == NULL
                                        i == 3
                                        pdir_page == NULL

 take as->lock

 /* race check */
 pdir_page == NULL -> proceed           /* spinning on as->lock */

 pdir_page = a;

 release as->lock

                                         take as->lock

                                         /* race check */
                                         pdir_page != NULL -> return

This should be fine, no? Do I miss something?


        Joerg


_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to