[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20190116043455.GP4205@dastard>
Date: Wed, 16 Jan 2019 15:34:55 +1100
From: Dave Chinner <david@...morbit.com>
To: Jerome Glisse <jglisse@...hat.com>
Cc: Dan Williams <dan.j.williams@...el.com>,
John Hubbard <jhubbard@...dia.com>, Jan Kara <jack@...e.cz>,
Matthew Wilcox <willy@...radead.org>,
John Hubbard <john.hubbard@...il.com>,
Andrew Morton <akpm@...ux-foundation.org>,
Linux MM <linux-mm@...ck.org>, tom@...pey.com,
Al Viro <viro@...iv.linux.org.uk>, benve@...co.com,
Christoph Hellwig <hch@...radead.org>,
Christopher Lameter <cl@...ux.com>,
"Dalessandro, Dennis" <dennis.dalessandro@...el.com>,
Doug Ledford <dledford@...hat.com>,
Jason Gunthorpe <jgg@...pe.ca>,
Michal Hocko <mhocko@...nel.org>,
Mike Marciniszyn <mike.marciniszyn@...el.com>,
rcampbell@...dia.com,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
linux-fsdevel <linux-fsdevel@...r.kernel.org>
Subject: Re: [PATCH 1/2] mm: introduce put_user_page*(), placeholder versions
On Tue, Jan 15, 2019 at 09:23:12PM -0500, Jerome Glisse wrote:
> On Tue, Jan 15, 2019 at 06:01:09PM -0800, Dan Williams wrote:
> > On Tue, Jan 15, 2019 at 5:56 PM Jerome Glisse <jglisse@...hat.com> wrote:
> > > On Tue, Jan 15, 2019 at 04:44:41PM -0800, John Hubbard wrote:
> > [..]
> > > To make it clear.
> > >
> > > Lock code:
> > > GUP()
> > > ...
> > > lock_page(page);
> > > if (PageWriteback(page)) {
> > > unlock_page(page);
> > > wait_stable_page(page);
> > > goto retry;
> > > }
> > > atomic_add(page->refcount, PAGE_PIN_BIAS);
> > > unlock_page(page);
> > >
> > > test_set_page_writeback()
> > > bool pinned = false;
> > > ...
> > > pinned = page_is_pin(page); // could be after TestSetPageWriteback
> > > TestSetPageWriteback(page);
> > > ...
> > > return pinned;
> > >
> > > Memory barrier:
> > > GUP()
> > > ...
> > > atomic_add(page->refcount, PAGE_PIN_BIAS);
> > > smp_mb();
> > > if (PageWriteback(page)) {
> > > atomic_add(page->refcount, -PAGE_PIN_BIAS);
> > > wait_stable_page(page);
> > > goto retry;
> > > }
> > >
> > > test_set_page_writeback()
> > > bool pinned = false;
> > > ...
> > > TestSetPageWriteback(page);
> > > smp_wmb();
> > > pinned = page_is_pin(page);
> > > ...
> > > return pinned;
> > >
> > >
> > > One is not more complex than the other. One can contend, the other
> > > will _never_ contend.
> >
> > The complexity is in the validation of lockless algorithms. It's
> > easier to reason about locks than barriers for the long term
> > maintainability of this code. I'm with Jan and John on wanting to
> > explore lock_page() before a barrier-based scheme.
>
> How is the above hard to validate ?
Well, if you think it's so easy, then please write the test cases so
we can add them to fstests and make sure that we don't break it in
future.
If you can't write filesystem test cases that exercise these race
conditions reliably, then the answer to your question is "it is
extremely hard to validate" and the correct thing to do is to start
with the simple lock_page() based algorithm.
Premature optimisation in code this complex is something we really,
really need to avoid.
-Dave.
--
Dave Chinner
david@...morbit.com
Powered by blists - more mailing lists