tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Changes to reduce pressure on uvm_pageqlock
Complete & compilable diff as promised. Having taken feedback into
consideration and considering that with the last revision uvm_pageqlock
wasn't doing a whole lot any more, this takes it further than before, about
as far as I want to go right now. Summary:
- uvm_pageqlock is gone.
- instead we have vm_page::interlock protecting identity, and...
- the pdpolicy has its own lock. could do multiple queues/locks later.
- the ground is paved for lazy dequeueing of pages.
- vm_page has grown (yamt's radixtree can eliminate rbtree node later).
- i think it fixes this recent PR: http://gnats.netbsd.org/54727
- vm_page::pqflags becomes totally private to pdpolicy. it now needs
to be 32-bits to stand on its own for architectures that can't do
atomic sub-word writes, because it's locked by a different lock to
the adjacent fields. i am using the spare bits for lazy activation.
- i have bumped loan & wire counts to 32-bits. i don't think 16 is safe.
- clockpro was already broken but I have tried not to make it worse.
http://www.netbsd.org/~ad/2019/uvm_pageqlock.diff
Cheers,
Andrew
On Sat, Dec 07, 2019 at 10:40:39PM +0000, Andrew Doran wrote:
> On Sat, Dec 07, 2019 at 01:32:35PM -0800, Chuck Silvers wrote:
>
> > I like this new version much more than the previous version.
> > The new diff looks incomplete though, it uses the "pdpol" field in
> > vm_page that was new in the previous diff. It looks like there
> > should be changes in uvm_pdaemon.c to go with the new diff too?
> > Could you send the complete new diff again please?
>
> Yes it's incomplete. I'll split these pieces out of my tree, merge into
> -current tomorrow and get a clean diff.
>
> I think the locking change is enough on its own, so I will exclude the
> "pdpol" piece to avoid clouding things, and go again with another review for
> that and other parts in the near future.
>
> > > With that done, we'd then only need one version of uvm_pageactivate() etc,
> > > because those functions will no longer care about uvm_pageqlock.
> >
> > The pageq lock is named that because it currently protects the pageq's. :-)
> > If it's not going to protect the pageq's anymore then it ought to be renamed.
> > Probably better to just work on eliminating it though.
>
> Agreed.
>
> > In your new diff, the pageq lock is still used by the pagedaemon
> > (for uvmpd_trylockowner() as you noted in the comment).
> > It would be good not to have a global lock involved in changing page identity,
> > and with the pageq's now protected by a separate lock, we should be able to
> > eliminate the need for the pageq lock when freeing a page with an RCUy thing
> > to prevent freeing uvm_object and uvm_anon structures while the pagedaemon might
> > still be accessing them via the vm_page fields. We should be able to improve
> > the locking for pg->loan_count with a similar RCUy thing... my recollection is
> > that the only reason loan_count uses the pageq lock currently is to stabilize
> > the page identity while locking the owning object. It might make sense to have
>
> On stablisation yes I agree. My reading has always been that it's safe to
> test those properties with either the pageqlock or the object locked - but
> on what happens next, your intent matters.
>
> > pg->wire_count protected by the pdpol lock too (though I have some thoughts
> > about changing the nature of wire_count that would probaby make that not
> > make sense, I haven't had time to think that through yet).
> >
> > But anyway, I'll stop rambling at this point so we can focus on the diff at hand.
> > :-)
>
> That's an interesting point re stabilisation and a RCUy type thing I see
> exactly what you're getting at and it's related to the few points of
> connection between datasets I mentioned. I'll have a think about that.
>
> Thanks for taking the time to look this over Chuck.
>
> Cheers,
> Andrew
>
> >
> > -Chuck
> >
> >
> > > I tried it out: the code looks more elegant and the scheme works in practice
> > > with contention on uvm_pageqlock now quite minor, and the sum of contention
> > > on the two locks lower than it was on uvm_pageqlock prior.
> > >
> > > With the locking for the pdpolicy code being private to the file I think it
> > > would then be easier to experiment with different strategies to reduce
> > > contention further.
> > >
> > > http://www.netbsd.org/~ad/2019/pdpolicy.diff
> > >
> > > Andrew
Home |
Main Index |
Thread Index |
Old Index