linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
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



  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).