[v3.6 3/3] iommu/tegra: smmu: Fix unsleepable memory allocation at alloc_pdir()
joerg.roedel at amd.com
joerg.roedel at amd.com
Tue Jul 17 09:23:00 EDT 2012
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
More information about the linux-arm-kernel
mailing list