From: Lorenzo Stoakes <lstoakes@gmail.com>
To: David Hildenbrand <david@redhat.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Oleg Nesterov <oleg@redhat.com>,
Richard Cochran <richardcochran@gmail.com>,
Jason Gunthorpe <jgg@nvidia.com>,
John Hubbard <jhubbard@nvidia.com>, Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH 3/4] mm/gup: make failure to pin an error if FOLL_NOWAIT not specified
Date: Mon, 2 Oct 2023 23:51:04 +0100 [thread overview]
Message-ID: <6a421da0-8479-4873-8e46-6f92aed342c6@lucifer.local> (raw)
In-Reply-To: <6161e8a8-64a4-c4ea-626d-daac45ccd836@redhat.com>
On Mon, Oct 02, 2023 at 01:04:51PM +0200, David Hildenbrand wrote:
> On 01.10.23 18:00, Lorenzo Stoakes wrote:
> > There really should be no circumstances under which a non-FOLL_NOWAIT GUP
> > operation fails to return any pages, so make this an error.
> >
> > To catch the trivial case, simply exit early if nr_pages == 0.
> >
> > This brings __get_user_pages_locked() in line with the behaviour of its
> > nommu variant.
> >
> > Signed-off-by: Lorenzo Stoakes <lstoakes@gmail.com>
> > ---
> > mm/gup.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> >
> > diff --git a/mm/gup.c b/mm/gup.c
> > index b21b33d1787e..fb2218d74ca5 100644
> > --- a/mm/gup.c
> > +++ b/mm/gup.c
> > @@ -1471,6 +1471,9 @@ static __always_inline long __get_user_pages_locked(struct mm_struct *mm,
> > long ret, pages_done;
> > bool must_unlock = false;
> > + if (!nr_pages)
> > + return 0;
> > +
>
> Probably unlikely() is reasonable. I even wonder if WARN_ON_ONCE() would be
> appropriate, but likely there are weird callers that end up calling this
> with nr_pages==0 ... probably they should be identified and changed. Future
> work.
>
> > /*
> > * The internal caller expects GUP to manage the lock internally and the
> > * lock must be released when this returns.
> > @@ -1595,6 +1598,14 @@ static __always_inline long __get_user_pages_locked(struct mm_struct *mm,
> > mmap_read_unlock(mm);
> > *locked = 0;
> > }
> > +
> > + /*
> > + * Failing to pin anything implies something has gone wrong except when
> > + * FOLL_NOWAIT is specified, so explicitly make this an error.
> > + */
> > + if (pages_done == 0 && !(flags & FOLL_NOWAIT))
> > + return -EFAULT;
> > +
>
> But who would be affected by that and why do we care about adding this
> check?
>
> This smells like a "if (WARN_ON_ONCE())", correct?
Sure it does somewhat, however there are 'ordinary' (maybe) scenarios where
this could possibly happen - FOLL_UNLOCKABLE and __get_user_pages() returns
0, or lock retained for non-FOLL_NOWAIT scenario and __get_user_pages() 0
also.
So I think the safest option might be to leave without-WARN, however you
could argue since we're making it an error now maybe we want to draw
attention to it by warning.
I just want to avoid a warning that _might_ be a product of a particular
faulting scenario.
Jason or John may have an opinion on this.
Actually having written all this, given we're changing this into an error
now anyway and this is just not a correct or expected scenario, yeah I
think WARN_ON_ONCE() would make sense, will update on v2.
>
> --
> Cheers,
>
> David / dhildenb
>
next prev parent reply other threads:[~2023-10-02 22:51 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-01 16:00 [PATCH 0/4] various improvements to the GUP interface Lorenzo Stoakes
2023-10-01 16:00 ` [PATCH 1/4] mm: make __access_remote_vm() static Lorenzo Stoakes
2023-10-02 10:59 ` David Hildenbrand
2023-10-09 22:16 ` Jason Gunthorpe
2023-10-01 16:00 ` [PATCH 2/4] mm/gup: explicitly define and check internal GUP flags, disallow FOLL_TOUCH Lorenzo Stoakes
2023-10-02 11:00 ` David Hildenbrand
2023-10-09 22:19 ` Jason Gunthorpe
2023-10-01 16:00 ` [PATCH 3/4] mm/gup: make failure to pin an error if FOLL_NOWAIT not specified Lorenzo Stoakes
2023-10-02 11:04 ` David Hildenbrand
2023-10-02 22:51 ` Lorenzo Stoakes [this message]
2023-10-09 22:22 ` Jason Gunthorpe
2023-10-01 16:00 ` [PATCH 4/4] mm/gup: adapt get_user_page_vma_remote() to never return NULL Lorenzo Stoakes
2023-10-02 10:16 ` Catalin Marinas
2023-10-02 11:08 ` David Hildenbrand
2023-10-02 22:56 ` Lorenzo Stoakes
2023-10-09 22:24 ` Jason Gunthorpe
2023-10-01 17:39 ` [PATCH 0/4] various improvements to the GUP interface Arnd Bergmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6a421da0-8479-4873-8e46-6f92aed342c6@lucifer.local \
--to=lstoakes@gmail.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=akpm@linux-foundation.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=david@redhat.com \
--cc=irogers@google.com \
--cc=jgg@nvidia.com \
--cc=jhubbard@nvidia.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=richardcochran@gmail.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox