linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: Li Wang <liwang@redhat.com>,
	akpm@linux-foundation.org, linux-kselftest@vger.kernel.org,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org
Cc: 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>
Subject: Re: [PATCH] mm/selftests: improve UFFD-WP feature detection in KSM test
Date: Mon, 23 Jun 2025 10:33:30 +0200	[thread overview]
Message-ID: <ce92ebb5-92fd-47e0-a7f6-445655e60999@redhat.com> (raw)
In-Reply-To: <20250622081035.378164-1-liwang@redhat.com>

On 22.06.25 10:10, Li Wang wrote:
> The current implementation of test_unmerge_uffd_wp() explicitly sets
> `uffdio_api.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP` before calling
> UFFDIO_API. This can cause the ioctl() call to fail with EINVAL on kernels
> that do not support UFFD-WP, leading the test to fail unnecessarily:
> 
>    # ------------------------------
>    # running ./ksm_functional_tests
>    # ------------------------------
>    # TAP version 13
>    # 1..9
>    # # [RUN] test_unmerge
>    # ok 1 Pages were unmerged
>    # # [RUN] test_unmerge_zero_pages
>    # ok 2 KSM zero pages were unmerged
>    # # [RUN] test_unmerge_discarded
>    # ok 3 Pages were unmerged
>    # # [RUN] test_unmerge_uffd_wp
>    # not ok 4 UFFDIO_API failed     <-----
>    # # [RUN] test_prot_none
>    # ok 5 Pages were unmerged
>    # # [RUN] test_prctl
>    # ok 6 Setting/clearing PR_SET_MEMORY_MERGE works
>    # # [RUN] test_prctl_fork
>    # # No pages got merged
>    # # [RUN] test_prctl_fork_exec
>    # ok 7 PR_SET_MEMORY_MERGE value is inherited
>    # # [RUN] test_prctl_unmerge
>    # ok 8 Pages were unmerged
>    # Bail out! 1 out of 8 tests failed
>    # # Planned tests != run tests (9 != 8)
>    # # Totals: pass:7 fail:1 xfail:0 xpass:0 skip:0 error:0
>    # [FAIL]
> 
> This patch improves compatibility and error handling by:
> 
> 1. Changes the feature check to first query supported features (features=0)
>     rather than specifically requesting WP support.
> 
> 2. Gracefully skipping the test if:
>     - UFFDIO_API fails with EINVAL (feature not supported), or
>     - UFFD_FEATURE_PAGEFAULT_FLAG_WP is not advertised by the kernel.
> 
> 3. Providing better diagnostics by distinguishing expected failures (e.g.,
>     EINVAL) from unexpected ones and reporting them using strerror().
> 
> The updated logic makes the test more robust across different kernel versions
> and configurations, while preserving existing behavior on systems that do
> support UFFD-WP.
> 
> Signed-off-by: Li Wang <liwang@redhat.com>
> Cc: Aruna Ramakrishna <aruna.ramakrishna@oracle.com>
> Cc: Bagas Sanjaya <bagasdotme@gmail.com>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Dave Hansen <dave.hansen@linux.intel.com>
> Cc: David Hildenbrand <david@redhat.com>
> Cc: Joey Gouly <joey.gouly@arm.com>
> Cc: Johannes Weiner <hannes@cmpxchg.org>
> Cc: Keith Lucas <keith.lucas@oracle.com>
> Cc: Ryan Roberts <ryan.roberts@arm.com>
> Cc: Shuah Khan <shuah@kernel.org>
> ---
>   tools/testing/selftests/mm/ksm_functional_tests.c | 8 ++++++--
>   1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c
> index b61803e36d1c..f3db257dc555 100644
> --- a/tools/testing/selftests/mm/ksm_functional_tests.c
> +++ b/tools/testing/selftests/mm/ksm_functional_tests.c
> @@ -393,9 +393,13 @@ static void test_unmerge_uffd_wp(void)
>   
>   	/* See if UFFD-WP is around. */
>   	uffdio_api.api = UFFD_API;
> -	uffdio_api.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP;
> +	uffdio_api.features = 0;
>   	if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) {
> -		ksft_test_result_fail("UFFDIO_API failed\n");
> +		if (errno == EINVAL)
> +			ksft_test_result_skip("UFFDIO_API not supported (EINVAL)\n");
> +		else
> +			ksft_test_result_fail("UFFDIO_API failed: %s\n", strerror(errno));
> +
>   		goto close_uffd;
>   	}
>   	if (!(uffdio_api.features & UFFD_FEATURE_PAGEFAULT_FLAG_WP)) {


The man page (man UFFDIO_API) documents:

        Since  Linux  4.11,  applications should use the features field to perform a two-step handshake.
        First, UFFDIO_API is called with the features field set to zero.  The kernel responds by setting
        all supported feature bits.

        Applications which do not require any specific features can begin using the userfaultfd  immedi‐
        ately.   Applications which do need specific features should call UFFDIO_API again with a subset
        of the reported feature bits set to enable those features.

So likely, what you want in this patch here is something like:

diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c
index b61803e36d1cf..5cf819ac958d0 100644
--- a/tools/testing/selftests/mm/ksm_functional_tests.c
+++ b/tools/testing/selftests/mm/ksm_functional_tests.c
@@ -393,7 +393,7 @@ static void test_unmerge_uffd_wp(void)
  
         /* See if UFFD-WP is around. */
         uffdio_api.api = UFFD_API;
-       uffdio_api.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP;
+       uffdio_api.features = 0;
         if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) {
                 ksft_test_result_fail("UFFDIO_API failed\n");
                 goto close_uffd;
@@ -403,6 +403,14 @@ static void test_unmerge_uffd_wp(void)
                 goto close_uffd;
         }
  
+       /* Now, enable it ("two-step handshake") */
+       uffdio_api.api = UFFD_API;
+       uffdio_api.features = UFFD_FEATURE_PAGEFAULT_FLAG_WP;
+       if (ioctl(uffd, UFFDIO_API, &uffdio_api) < 0) {
+               ksft_test_result_fail("UFFDIO_API failed\n");
+               goto close_uffd;
+       }
+
         /* Register UFFD-WP, no need for an actual handler. */
         if (uffd_register(uffd, map, size, false, true, false)) {
                 ksft_test_result_fail("UFFDIO_REGISTER_MODE_WP failed\n");


-- 
Cheers,

David / dhildenb



  reply	other threads:[~2025-06-23  8:33 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-22  8:10 Li Wang
2025-06-23  8:33 ` David Hildenbrand [this message]
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
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=ce92ebb5-92fd-47e0-a7f6-445655e60999@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=aruna.ramakrishna@oracle.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-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=liwang@redhat.com \
    --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