Re: [PATCH] mm: filemap: Avoid unnecessary barries and waitqueue lookups in unlock_page fastpath v5
From: Andrew Morton
Date: Wed May 21 2014 - 17:50:11 EST
On Wed, 21 May 2014 23:33:54 +0200 Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote:
> On Wed, May 21, 2014 at 02:26:22PM -0700, Andrew Morton wrote:
> > > +static inline void
> > > +__prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait,
> > > + struct page *page, int state, bool exclusive)
> >
> > Putting MM stuff into core waitqueue code is rather bad. I really
> > don't know how I'm going to explain this to my family.
>
> Right, so we could avoid all that and make the functions in mm/filemap.c
> rather large and opencode a bunch of wait.c stuff.
>
The world won't end if we do it Mel's way and it's probably the most
efficient. But ugh. This stuff does raise the "it had better be a
useful patch" bar.
> Which is pretty much what I initially pseudo proposed.
Alternative solution is not to merge the patch ;)
> > > + __ClearPageWaiters(page);
> >
> > We're freeing the page - if someone is still waiting on it then we have
> > a huge bug? It's the mysterious collision thing again I hope?
>
> Yeah, so we only clear that bit when at 'unlock' we find there are no
> more pending waiters, so if the last unlock still had a waiter, we'll
> leave the bit set.
Confused. If the last unlock had a waiter, that waiter will get woken
up so there are no waiters any more, so the last unlock clears the flag.
um, how do we determine that there are no more waiters? By looking at
the waitqueue. But that waitqueue is hashed, so it may contain waiters
for other pages so we're screwed? But we could just go and wake up the
other-page waiters anyway and still clear PG_waiters?
um2, we're using exclusive waitqueues so we can't (or don't) wake all
waiters, so we're screwed again?
(This process is proving to be a hard way of writing Mel's changelog btw).
If I'm still on track here, what happens if we switch to wake-all so we
can avoid the dangling flag? I doubt if there are many collisions on
that hash table?
If there *are* a lot of collisions, I bet it's because a great pile of
threads are all waiting on the same page. If they're trying to lock
that page then wake-all is bad. But if they're just waiting for IO
completion (probable) then it's OK.
I'll stop now.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/