On Fri, Nov 18, 2011 at 10:21 PM, John Kacur <jkacur@xxxxxxxxxx> wrote: > On Fri, Nov 18, 2011 at 3:16 PM, John Kacur <jkacur@xxxxxxxxxx> wrote: >> On Fri, Nov 18, 2011 at 3:04 PM, Hillf Danton <dhillf@xxxxxxxxx> wrote: >>> In the error path that we fail to allocate new huge page, before try again, we >>> have to check race since page_table_lock is re-acquired. >>> >>> If racing, our job is done. >>> >>> Signed-off-by: Hillf Danton <dhillf@xxxxxxxxx> >>> --- >>> >>> --- a/mm/hugetlb.c Fri Nov 18 21:38:30 2011 >>> +++ b/mm/hugetlb.c Fri Nov 18 21:48:15 2011 >>> @@ -2407,7 +2407,14 @@ retry_avoidcopy: >>> BUG_ON(page_count(old_page) != 1); >>> BUG_ON(huge_pte_none(pte)); >>> spin_lock(&mm->page_table_lock); >>> - goto retry_avoidcopy; >>> + ptep = huge_pte_offset(mm, address & huge_page_mask(h)); >>> + if (likely(pte_same(huge_ptep_get(ptep), pte))) >>> + goto retry_avoidcopy; >>> + /* >>> + * race occurs while re-acquiring page_table_lock, and >>> + * our job is done. >>> + */ >>> + return 0; >>> } >>> WARN_ON_ONCE(1); >>> } >> >> >> I'm not sure about the veracity of the race condition, but you better >> do spin_unlock before you return. >> > > Ugh, sorry for the noise, I see that's not how it works here. Welcome:) ��.n������g����a����&ޖ)���)��h���&������梷�����Ǟ�m������)�����b�n���y��{^�w�r���&�i��('����춊m�鞵��â����چ�����i�������$����