From: Mike Rapoport <rppt@linux.ibm.com>
To: Peter Xu <peterx@redhat.com>
Cc: David Hildenbrand <david@redhat.com>,
Axel Rasmussen <axelrasmussen@google.com>,
Mike Kravetz <mike.kravetz@oracle.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Andrea Arcangeli <aarcange@redhat.com>,
Leonardo Bras Soares Passos <lsoaresp@redhat.com>,
Mike Rapoport <rppt@linux.vnet.ibm.com>,
Nadav Amit <nadav.amit@gmail.com>
Subject: Re: [PATCH 10/29] selftests/mm: Test UFFDIO_ZEROPAGE only when !hugetlb
Date: Fri, 7 Apr 2023 12:42:29 +0300 [thread overview]
Message-ID: <ZC/lhZlcDaDCErsz@linux.ibm.com> (raw)
In-Reply-To: <ZCr6g3RDwt1pWTkx@x1n>
On Mon, Apr 03, 2023 at 12:10:43PM -0400, Peter Xu wrote:
> On Mon, Apr 03, 2023 at 09:55:41AM +0200, David Hildenbrand wrote:
> > On 01.04.23 03:57, Axel Rasmussen wrote:
> > > On Fri, Mar 31, 2023 at 11:37 AM Mike Kravetz <mike.kravetz@oracle.com> wrote:
> > > >
> > > > On 03/30/23 12:07, Peter Xu wrote:
> > > > > Make the check as simple as "test_type == TEST_HUGETLB" because that's the
> > > > > only mem that doesn't support ZEROPAGE.
> > > > >
> > > > > Signed-off-by: Peter Xu <peterx@redhat.com>
> > > > > ---
> > > > > tools/testing/selftests/mm/userfaultfd.c | 2 +-
> > > > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/tools/testing/selftests/mm/userfaultfd.c b/tools/testing/selftests/mm/userfaultfd.c
> > > > > index 795fbc4d84f8..d724f1c78847 100644
> > > > > --- a/tools/testing/selftests/mm/userfaultfd.c
> > > > > +++ b/tools/testing/selftests/mm/userfaultfd.c
> > > > > @@ -1118,7 +1118,7 @@ static int __uffdio_zeropage(int ufd, unsigned long offset, bool retry)
> > > > > {
> > > > > struct uffdio_zeropage uffdio_zeropage;
> > > > > int ret;
> > > > > - bool has_zeropage = get_expected_ioctls(0) & (1 << _UFFDIO_ZEROPAGE);
> > > > > + bool has_zeropage = !(test_type == TEST_HUGETLB);
> > > >
> > > > It is true that hugetlb is the only mem type that does not support zeropage.
> > > > So, the change is correct.
> > > >
> > > > However, I actually prefer the explicit check that is there today. It seems
> > > > more like a test of the API. And, is more future proof is code changes.
> > > >
> > > > Just my opinion/thoughts, not a strong objection.
> > >
> > > I agree. The existing code is more robust to future changes where we
> > > might support or stop supporting this ioctl in some cases. It also
> > > proves that the ioctl works, any time the API reports that it is
> > > supported / ought to work, independent of when the *test* thinks it
> > > should be supported.
> > >
> > > Then again, I think this is unlikely to change in the future, so I
> > > also agree with Mike that it's not the biggest deal.
> >
> > As there were already discussions on eventually supporting UFFDIO_ZEROPAGE
> > that doesn't place the shared zeropage but ... a fresh zeropage, it might
> > make sense to keep it as is.
>
> Thanks everyone.
>
> So here the major goal is to drop get_expected_ioctls(), and I think it's
> really unwanted here. Besides it's a blocker for split the test in a clean
> way, a major reason is get_expected_ioctls() fetches "wheter we support
> zeropage for this mem" from UFFD_API_RANGE_IOCTLS, rather than from the
> UFFDIO_REGISTER anyway:
>
> uint64_t get_expected_ioctls(uint64_t mode)
> {
> uint64_t ioctls = UFFD_API_RANGE_IOCTLS;
>
> if (test_type == TEST_HUGETLB)
> ioctls &= ~(1 << _UFFDIO_ZEROPAGE);
>
> if (!((mode & UFFDIO_REGISTER_MODE_WP) && test_uffdio_wp))
> ioctls &= ~(1 << _UFFDIO_WRITEPROTECT);
>
> if (!((mode & UFFDIO_REGISTER_MODE_MINOR) && test_uffdio_minor))
> ioctls &= ~(1 << _UFFDIO_CONTINUE);
>
> return ioctls;
> }
>
> It means it'll succeed or fail depending on what kernel we run this test
> on, and also on what headers we compile the test against.
>
> I actually mentioned some of the reasoning in a follow up patch (sorry
> maybe the split here caused some confusion):
>
> selftests/mm: uffd_[un]register()
>
> Add two helpers to register/unregister to an uffd. Use them to drop
> duplicate codes.
>
> This patch also drops assert_expected_ioctls_present() and
> get_expected_ioctls(). Reasons:
>
> - It'll need a lot of effort to pass test_type==HUGETLB into it from the
> upper, so it's the simplest way to get rid of another global var
>
> - The ioctls returned in UFFDIO_REGISTER is hardly useful at all, because
> any app can already detect kernel support on any ioctl via its
> corresponding UFFD_FEATURE_*. The check here is for sanity mostly but
> it's probably destined no user app will even use it.
>
> - It's not friendly to one future goal of uffd to run on old kernels, the
> problem is get_expected_ioctls() compiles against UFFD_API_RANGE_IOCTLS,
> which is a value that can change depending on where the test is compiled,
> rather than reflecting what the kernel underneath has. It means it'll
> report false negatives on old kernels so it's against our will.
>
> So let's make our live easier.
>
> But I do agree that it's helpful to keep a test against
> uffdio_register.ioctls in this case against _UFFDIO_ZEROPAGE, so it can be
> detected dynamically. IOW, even if we would like to avoid "test !=
> HUGETLB" here, at least we should like to fix that with the UFFDIO_REGISTER
> results.
>
> Here's my offer below. :)
>
> Could I keep this patch as-is (as part of getting rid of
> get_expected_ioctls() effort; I can squash this one into "selftests/mm:
> uffd_[un]register()" if any of you think proper), meanwhile I'll squash a
> fixup to the "move zeropage test into uffd-unit-tests" explicitly check
> uffdio_register.ioctls in the same patchset? IOW, we'll have a few test
> commits missing this specific ioctl test, but then we'll have a better one
> dynamically detected from the kernel.
>
> The fixup patch attached. I think it'll automatically work when someone
> would like to introduce UFFDIO_ZEROPAGE to hugetlb too, another side
> benefit is I merged the zeropage test into one, which does look better too.
I agree that it makes sense. A nit below :)
> Thanks,
>
> --
> Peter Xu
> From 5b06f921cf8420600c697a3072a1459a5cb4956b Mon Sep 17 00:00:00 2001
> From: Peter Xu <peterx@redhat.com>
> Date: Mon, 3 Apr 2023 11:57:07 -0400
> Subject: [PATCH] fixup! selftests/mm: Move zeropage test into uffd unit tests
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> tools/testing/selftests/mm/uffd-unit-tests.c | 62 +++++++++++---------
> 1 file changed, 33 insertions(+), 29 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c
> index 793931da5056..247700bb4dd0 100644
> --- a/tools/testing/selftests/mm/uffd-unit-tests.c
> +++ b/tools/testing/selftests/mm/uffd-unit-tests.c
> @@ -711,54 +711,58 @@ static bool do_uffdio_zeropage(int ufd, bool has_zeropage)
> return false;
> }
>
> +/*
> + * Registers a range with MISSING mode only for zeropage test. Return true
> + * if UFFDIO_ZEROPAGE supported, false otherwise. Can't use uffd_register()
> + * because we want to detect .ioctls along the way.
> + */
> +static bool
> +uffd_register_detect_zp(int uffd, void *addr, uint64_t len)
Let's spell out 'zp' as zeropage, what do you say?
> +{
> + struct uffdio_register uffdio_register = { 0 };
> + uint64_t mode = UFFDIO_REGISTER_MODE_MISSING;
> +
> + uffdio_register.range.start = (unsigned long)addr;
> + uffdio_register.range.len = len;
> + uffdio_register.mode = mode;
> +
> + if (ioctl(uffd, UFFDIO_REGISTER, &uffdio_register) == -1)
> + err("zeropage test register fail");
> +
> + return uffdio_register.ioctls & (1 << _UFFDIO_ZEROPAGE);
> +}
> +
> +
> /* exercise UFFDIO_ZEROPAGE */
> -static void uffd_zeropage_test_common(bool has_zeropage)
> +static void uffd_zeropage_test(void)
> {
> - if (uffd_register(uffd, area_dst, page_size,
> - true, false, false))
> - err("register");
> + bool has_zeropage;
> + int i;
>
> + has_zeropage = uffd_register_detect_zp(uffd, area_dst, page_size);
> if (area_dst_alias)
> - if (uffd_register(uffd, area_dst_alias, page_size,
> - true, false, false))
> - err("register");
> -
> - if (do_uffdio_zeropage(uffd, has_zeropage)) {
> - int i;
> + /* Ignore the retval; we already have it */
> + uffd_register_detect_zp(uffd, area_dst_alias, page_size);
>
> + if (do_uffdio_zeropage(uffd, has_zeropage))
> for (i = 0; i < page_size; i++)
> if (area_dst[i] != 0)
> err("data non-zero at offset %d\n", i);
> - }
>
> + if (uffd_unregister(uffd, area_dst, page_size))
> + err("unregister");
>
> - if (uffd_unregister(uffd, area_dst, page_size * nr_pages))
> + if (area_dst_alias && uffd_unregister(uffd, area_dst_alias, page_size))
> err("unregister");
>
> uffd_test_pass();
> }
>
> -static void uffd_zeropage_test(void)
> -{
> - uffd_zeropage_test_common(true);
> -}
> -
> -static void uffd_zeropage_hugetlb_test(void)
> -{
> - uffd_zeropage_test_common(false);
> -}
> -
> uffd_test_case_t uffd_tests[] = {
> {
> .name = "zeropage",
> .uffd_fn = uffd_zeropage_test,
> - .mem_targets = MEM_ANON | MEM_SHMEM | MEM_SHMEM_PRIVATE,
> - .uffd_feature_required = 0,
> - },
> - {
> - .name = "zeropage-hugetlb",
> - .uffd_fn = uffd_zeropage_hugetlb_test,
> - .mem_targets = MEM_HUGETLB | MEM_HUGETLB_PRIVATE,
> + .mem_targets = MEM_ALL,
> .uffd_feature_required = 0,
> },
> {
> --
> 2.39.1
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2023-04-07 9:42 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-30 15:56 [PATCH 00/29] selftests/mm: Split / Refactor userfault test Peter Xu
2023-03-30 15:56 ` [PATCH 01/29] Revert "userfaultfd: don't fail on unrecognized features" Peter Xu
2023-03-30 18:31 ` David Hildenbrand
2023-03-30 22:22 ` Peter Xu
2023-03-30 19:04 ` Axel Rasmussen
2023-03-30 22:27 ` Peter Xu
2023-03-31 16:52 ` Axel Rasmussen
2023-03-31 18:08 ` Dmitry Safonov
2023-03-31 20:04 ` Axel Rasmussen
2023-04-03 7:48 ` David Hildenbrand
2023-03-30 16:06 ` [PATCH 02/29] selftests/mm: Update .gitignore with two missing tests Peter Xu
2023-04-03 7:48 ` David Hildenbrand
2023-04-07 9:09 ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 03/29] selftests/mm: Dump a summary in run_vmtests.sh Peter Xu
2023-03-30 19:07 ` Axel Rasmussen
2023-03-30 22:28 ` Peter Xu
2023-04-03 7:49 ` David Hildenbrand
2023-04-07 9:15 ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 04/29] selftests/mm: Merge util.h into vm_util.h Peter Xu
2023-03-30 19:14 ` Axel Rasmussen
2023-04-03 7:50 ` David Hildenbrand
2023-04-07 9:18 ` Mike Rapoport
2023-03-30 16:06 ` [PATCH 05/29] selftests/mm: Use TEST_GEN_PROGS where proper Peter Xu
2023-04-03 7:52 ` David Hildenbrand
2023-04-07 9:22 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 06/29] selftests/mm: Link vm_util.c always Peter Xu
2023-04-03 7:52 ` David Hildenbrand
2023-04-07 9:23 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 07/29] selftests/mm: Merge default_huge_page_size() into one Peter Xu
2023-03-30 20:30 ` Axel Rasmussen
2023-03-31 18:15 ` Mike Kravetz
2023-04-03 15:16 ` Peter Xu
2023-04-03 7:53 ` David Hildenbrand
2023-04-07 9:24 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 08/29] selftests/mm: Use PM_* macros in vm_utils.h Peter Xu
2023-03-31 18:24 ` Mike Kravetz
2023-04-03 7:53 ` David Hildenbrand
2023-04-07 9:28 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 09/29] selftests/mm: Reuse pagemap_get_entry() in vm_util.h Peter Xu
2023-03-30 21:08 ` Axel Rasmussen
2023-03-31 18:27 ` Mike Kravetz
2023-04-03 7:54 ` David Hildenbrand
2023-04-07 9:32 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 10/29] selftests/mm: Test UFFDIO_ZEROPAGE only when !hugetlb Peter Xu
2023-03-31 18:37 ` Mike Kravetz
2023-04-01 1:57 ` Axel Rasmussen
2023-04-03 7:55 ` David Hildenbrand
2023-04-03 16:10 ` Peter Xu
2023-04-07 9:42 ` Mike Rapoport [this message]
2023-04-11 19:03 ` Peter Xu
2023-03-30 16:07 ` [PATCH 11/29] selftests/mm: Drop test_uffdio_zeropage_eexist Peter Xu
2023-04-01 0:03 ` Mike Kravetz
2023-04-03 16:16 ` Peter Xu
2023-04-03 7:56 ` David Hildenbrand
2023-04-07 9:48 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 12/29] selftests/mm: Create uffd-common.[ch] Peter Xu
2023-04-07 10:10 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 13/29] selftests/mm: Split uffd tests into uffd-stress and uffd-unit-tests Peter Xu
2023-04-07 11:02 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 14/29] selftests/mm: uffd_[un]register() Peter Xu
2023-04-05 19:12 ` Peter Xu
2023-04-07 11:08 ` Mike Rapoport
2023-04-11 19:13 ` Peter Xu
2023-04-12 16:42 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 15/29] selftests/mm: uffd_open_{dev|sys}() Peter Xu
2023-04-03 8:00 ` David Hildenbrand
2023-04-07 11:11 ` Mike Rapoport
2023-03-30 16:07 ` [PATCH 16/29] selftests/mm: UFFDIO_API test Peter Xu
2023-04-03 7:59 ` David Hildenbrand
2023-04-03 16:43 ` Peter Xu
2023-04-03 19:06 ` David Hildenbrand
2023-04-03 20:24 ` Peter Xu
2023-04-04 12:48 ` David Hildenbrand
2023-04-05 16:21 ` Peter Xu
2023-03-30 16:08 ` [PATCH 17/29] selftests/mm: Drop global mem_fd in uffd tests Peter Xu
2023-04-11 10:39 ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 18/29] selftests/mm: Drop global hpage_size " Peter Xu
2023-04-11 10:41 ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 19/29] selftests/mm: Let uffd_handle_page_fault() takes wp parameter Peter Xu
2023-04-11 10:52 ` Mike Rapoport
2023-04-11 19:36 ` Peter Xu
2023-03-30 16:08 ` [PATCH 20/29] selftests/mm: Allow allocate_area() to fail properly Peter Xu
2023-04-11 11:02 ` Mike Rapoport
2023-04-11 19:42 ` Peter Xu
2023-03-30 16:08 ` [PATCH 21/29] selftests/mm: Add framework for uffd-unit-test Peter Xu
2023-04-11 11:09 ` Mike Rapoport
2023-04-11 20:09 ` Peter Xu
2023-03-30 16:08 ` [PATCH 22/29] selftests/mm: Move uffd pagemap test to unit test Peter Xu
2023-04-11 12:41 ` Mike Rapoport
2023-03-30 16:08 ` [PATCH 23/29] selftests/mm: Move uffd minor " Peter Xu
2023-03-30 16:08 ` [PATCH 24/29] selftests/mm: Move uffd sig/events tests into uffd unit tests Peter Xu
2023-03-30 16:08 ` [PATCH 25/29] selftests/mm: Move zeropage test " Peter Xu
2023-03-30 16:08 ` [PATCH 26/29] selftests/mm: Workaround no way to detect uffd-minor + wp Peter Xu
2023-03-30 16:08 ` [PATCH 27/29] selftests/mm: Allow uffd test to skip properly with no privilege Peter Xu
2023-03-30 16:08 ` [PATCH 28/29] selftests/mm: Drop sys/dev test in uffd-stress test Peter Xu
2023-03-30 16:08 ` [PATCH 29/29] selftests/mm: Add shmem-private test to uffd-stress Peter Xu
2023-03-31 16:47 ` [PATCH 00/29] selftests/mm: Split / Refactor userfault test Peter Xu
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=ZC/lhZlcDaDCErsz@linux.ibm.com \
--to=rppt@linux.ibm.com \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lsoaresp@redhat.com \
--cc=mike.kravetz@oracle.com \
--cc=nadav.amit@gmail.com \
--cc=peterx@redhat.com \
--cc=rppt@linux.vnet.ibm.com \
/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).