"joerg.roedel@xxxxxxx" <joerg.roedel@xxxxxxx> 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. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html