[v3.6 3/3] iommu/tegra: smmu: Fix unsleepable memory allocation at alloc_pdir()
Hiroshi Doyu
hdoyu at nvidia.com
Wed Jul 18 04:50:35 EDT 2012
"joerg.roedel at amd.com" <joerg.roedel at amd.com> wrote @ Tue, 17 Jul 2012 15:23:00 +0200:
> 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?
You are right. I didn't get the point of your patch. In the case that
you can return -EAGAIN, the complicated "lock,unlock,lock,check race"
is not necessary as you did.
Verified the patch w/ Tegra3 based board. Please put this into next
queue. Thanks.
More information about the linux-arm-kernel
mailing list