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
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu