From: David Hildenbrand <david@redhat.com>
To: Nadav Amit <nadav.amit@gmail.com>,
Axel Rasmussen <axelrasmussen@google.com>
Cc: Li Wang <liwang@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kselftest@vger.kernel.org,
"open list:MEMORY MANAGEMENT" <linux-mm@kvack.org>,
Peter Xu <peterx@redhat.com>,
Aruna Ramakrishna <aruna.ramakrishna@oracle.com>,
Bagas Sanjaya <bagasdotme@gmail.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Joey Gouly <joey.gouly@arm.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Keith Lucas <keith.lucas@oracle.com>,
Ryan Roberts <ryan.roberts@arm.com>,
Shuah Khan <shuah@kernel.org>, Mike Rapoport <rppt@kernel.org>
Subject: Re: [PATCH v2] selftests/mm: Fix UFFDIO_API usage with proper two-step feature negotiation
Date: Tue, 24 Jun 2025 13:48:50 +0200 [thread overview]
Message-ID: <495dc88a-c0b2-4090-a89c-00f000b62a2f@redhat.com> (raw)
In-Reply-To: <239f75e4-1868-4ac9-882f-664a8863b781@redhat.com>
On 24.06.25 13:39, David Hildenbrand wrote:
> On 24.06.25 13:29, Nadav Amit wrote:
>>
>>
>>> On 24 Jun 2025, at 11:22, David Hildenbrand <david@redhat.com> wrote:
>>>
>>> On 24.06.25 10:07, David Hildenbrand wrote:
>>>>>
>>>> Is that actually required?
>>>> The man page explicitly documents:
>>>> " EINVAL A previous UFFDIO_API call already enabled one or more
>>>> features for this userfaultfd. Calling UFF‐
>>>> DIO_API twice, the first time with no features set, is
>>>> explicitly allowed as per the two-step feature
>>>> detection handshake.
>>>> "
>>>> So if that doesn't work, something might be broken.
>>>
>>> CCing Nadav and Peter:
>>>
>>> Could it be that
>>>
>>> commit 22e5fe2a2a279d9a6fcbdfb4dffe73821bef1c90
>>> Author: Nadav Amit <nadav.amit@gmail.com>
>>> Date: Thu Sep 2 14:58:59 2021 -0700
>>>
>>> userfaultfd: prevent concurrent API initialization
>>> userfaultfd assumes that the enabled features are set once and never
>>> changed after UFFDIO_API ioctl succeeded.
>>> However, currently, UFFDIO_API can be called concurrently from two
>>> different threads, succeed on both threads and leave userfaultfd's
>>> features in non-deterministic state. Theoretically, other uffd operations
>>> (ioctl's and page-faults) can be dispatched while adversely affected by
>>> such changes of features.
>>> Moreover, the writes to ctx->state and ctx->features are not ordered,
>>> which can - theoretically, again - let userfaultfd_ioctl() think that
>>> userfaultfd API completed, while the features are still not initialized.
>>> To avoid races, it is arguably best to get rid of ctx->state. Since there
>>> are only 2 states, record the API initialization in ctx->features as the
>>> uppermost bit and remove ctx->state.
>>>
>>> Accidentally broke the documented two-step handshake in the man page where we
>>> can avoid closing + reopening the fd?
>>
>> I agree the code is not correct (and my patch didn’t address this issue),
>> but I don’t see it broke it either.
>>
>> Unless I’m missing something the code before my patch, when
>> uffdio_api.features == 0, also set ctx->state to UFFD_STATE_RUNNING, which
>> meant another invocation would see (ctx->state != UFFD_STATE_WAIT_API) and
>> fail.
>
> You might be right, I only checked the cmpxchg, assuming it was working
> before that.
>
> ... but staring at the history of the "ctx->state =
> UFFD_STATE_RUNNING;", I am not sure if it ever behaved that way.
>
> Do maybe, the man page is simply wrong (although I wonder why that case
> was described that detailed)
The man page was updated with
commit db3d5cc1a17b0ace008ebe1eaf0ac4d96b4b519a
Author: Axel Rasmussen <axelrasmussen@google.com>
Date: Tue Oct 3 12:45:44 2023 -0700
ioctl_userfaultfd.2: Correct and update UFFDIO_API ioctl error codes
First, it is not correct that repeated UFFDIO_API calls result in
EINVAL. This is true *if both calls enable features*, but in the case
where we're doing a two-step feature detection handshake, the kernel
explicitly expects 2 calls (one with no features set). So, correct this
description.
Then, some new error cases have been added to the kernel recently, and
the man page wasn't updated to note these. So, add in descriptions of
these new error cases.
@Axel, did you ignore the automatically-set UFFD_FEATURE_INITIALIZED and the
repeated calls never worked, or was there actually a time where repeated
UFFDIO_API calls would not result in EINVAL?
--
Cheers,
David / dhildenb
next prev parent reply other threads:[~2025-06-24 11:48 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-22 8:10 [PATCH] mm/selftests: improve UFFD-WP feature detection in KSM test Li Wang
2025-06-23 8:33 ` David Hildenbrand
2025-06-24 3:43 ` Li Wang
2025-06-24 4:24 ` [PATCH v2] selftests/mm: Fix UFFDIO_API usage with proper two-step feature negotiation Li Wang
2025-06-24 8:07 ` David Hildenbrand
2025-06-24 8:22 ` David Hildenbrand
2025-06-24 11:29 ` Nadav Amit
2025-06-24 11:39 ` David Hildenbrand
2025-06-24 11:48 ` David Hildenbrand [this message]
2025-06-24 15:03 ` Peter Xu
2025-06-24 15:17 ` David Hildenbrand
2025-06-24 15:17 ` David Hildenbrand
2025-06-25 0:34 ` Li Wang
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=495dc88a-c0b2-4090-a89c-00f000b62a2f@redhat.com \
--to=david@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=aruna.ramakrishna@oracle.com \
--cc=axelrasmussen@google.com \
--cc=bagasdotme@gmail.com \
--cc=catalin.marinas@arm.com \
--cc=dave.hansen@linux.intel.com \
--cc=hannes@cmpxchg.org \
--cc=joey.gouly@arm.com \
--cc=keith.lucas@oracle.com \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=liwang@redhat.com \
--cc=nadav.amit@gmail.com \
--cc=peterx@redhat.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shuah@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;
as well as URLs for NNTP newsgroup(s).