Messages in this thread Patch in this message | | | Date | Wed, 10 Aug 2016 18:27:19 +0200 | From | Oleg Nesterov <> | Subject | Re: [PATCH] sched: Avoid that __wait_on_bit_lock() hangs |
| |
On 08/10, Bart Van Assche wrote: > > On 08/10/2016 03:46 AM, Oleg Nesterov wrote: > > OK. Could you try another debugging patch below? > > > > Oleg. > > --- > > > > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h > > index e5a3244..9d5f892 100644 > > --- a/include/linux/page-flags.h > > +++ b/include/linux/page-flags.h > > @@ -711,6 +711,15 @@ static inline int page_has_private(struct page *page) > > return !!(page->flags & PAGE_FLAGS_PRIVATE); > > } > > > > +void unlock_page(struct page *page); > > +static inline void __ClearPageLocked_x(struct page *page) > > +{ > > + if (PageLocked(compound_head(page))) > > + unlock_page(page); > > +} > > + > > +#define __ClearPageLocked(page) __ClearPageLocked_x(page) > > + > > #undef PF_ANY > > #undef PF_HEAD > > #undef PF_NO_TAIL > > Hi Oleg, > > Are you sure that all __ClearPageLocked() users pass the compound head > to that macro?
Hmm. it obviously should... which kernel version do you use for testing?
From include/linux/page-flags.h
__PAGEFLAG(Locked, locked, PF_NO_TAIL)
and
#define PF_NO_TAIL(page, enforce) ({ \ VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \ compound_head(page);}) and this matches compound_head() in lock/unlock_page().
> --- a/include/linux/page-flags.h > +++ b/include/linux/page-flags.h > @@ -711,6 +711,17 @@ static inline int page_has_private(struct page *page) > return !!(page->flags & PAGE_FLAGS_PRIVATE); > } > > +void unlock_page(struct page *page); > +static inline void __ClearPageLocked_x(struct page *page) > +{ > + if (PageLocked(compound_head(page))) > + unlock_page(page); > + else > + __ClearPageLocked(page); > +}
No, no. If you use an old kernel (which doesn't call compound_head() in lock_page()), then just remove compound_head() from __ClearPageLocked_x() above:
static inline void __ClearPageLocked_x(struct page *page) { if (PageLocked(page)) unlock_page(page); }
even if this shouldn't make any difference afaics, note the VM_BUG_ON_PGFLAGS() above.
Oleg.
| |