Message ID | 20230330160714.3106999-1-peterx@redhat.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1250653vqo; Thu, 30 Mar 2023 09:22:41 -0700 (PDT) X-Google-Smtp-Source: AKy350Y+5WFI2KWhxOJa3FtywN5KUIvoCMRMhxup+SV4JPhqrtOtQ6CujymymzhsrsmfmH2cIZkF X-Received: by 2002:a17:90a:1a05:b0:23d:5485:b80e with SMTP id 5-20020a17090a1a0500b0023d5485b80emr26386480pjk.6.1680193360880; Thu, 30 Mar 2023 09:22:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680193360; cv=none; d=google.com; s=arc-20160816; b=jOFU66hgMJd9eqB0hBGAzDX4s1B64E5BMFvimkMsWKH8UbvtErVsvdufY8OzGPxNIq QmiFbgvIQNGfzqBBm6E5xForUdmZBtI0AUyp6aWkNzPiD7NJjgFprMLacUOgJ3on47Rg PP6YbvpOn5z0cnGvn95v5kaQDE2ktABdeLLC3QKYVnUO+56foIki4W6m4CCWA9LdXp0b WZxWpjzyII1RN6rEcTipLG9vsCBnAoO/+PwKlUXZ+rcRgKhbxpXki33vG6Kr1nT/OdI9 HfwpSRxuQ2mnEL7AnFdY72SJmV1pSD7qhsx07qHx0jX+VOzS+VMHVvr4f/Njs/4AB8hd SpKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ASfRfnQJTCdEglytu7DR/J7BYjWDsPlfNboYF8myg6I=; b=RfhhWk3VzAXDagpY62p8nGCD/pabXAkikDD2DMuf9IIt44k0C6TytaGyh+WcaxHZOV k8Waz8bMvETspp0otGo2Ezf2AFMIuXHL3txoxE2B8qqqKf79CTGuUYRH/dlNRkXbZ8LK KaJIgtRxRMVvtD3mWCYegZsy2lD0cuJLhltBQJ1ysRp1r/Un6Uvd1+PdpU79OhjB/7oT ZshtwnewvlcR4X2wY97bnBCiFEXzPH+vn6ZagDdBcfiZZZMxwTcq1+S4NiUzrQvQ/xTE jCi/egx8OCSlulzkhZ5xbYAUv7FqYnb0WzjW0vqw1hTPpAtqHm63mGjZPuFeyp+D9mSj Mw0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=PGXCY5M6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x11-20020a17090aca0b00b00233c5363cdcsi1586911pjt.142.2023.03.30.09.22.24; Thu, 30 Mar 2023 09:22:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=PGXCY5M6; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232885AbjC3QIT (ORCPT <rfc822;rua109.linux@gmail.com> + 99 others); Thu, 30 Mar 2023 12:08:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59974 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231566AbjC3QIE (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Thu, 30 Mar 2023 12:08:04 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BE9B9EE0 for <linux-kernel@vger.kernel.org>; Thu, 30 Mar 2023 09:07:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680192439; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ASfRfnQJTCdEglytu7DR/J7BYjWDsPlfNboYF8myg6I=; b=PGXCY5M6uUnCD/BeXnzDKcl0fDTXAAjNvz52OAHFA4JAQBOYz2lwPuz0jLLzGovVCwHUsB MQcphRsgYLkY7vASdD6xpV4wnrT69B1ACQ8rvfQfU8iTzW4zrQ6EK1iVlHm7CmkBCkuh2j +mEx+xs0JF1mSucFjSBE5K09ZQEG7rM= Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-259-wGpkg7j2OGm4_IpG_jxung-1; Thu, 30 Mar 2023 12:07:18 -0400 X-MC-Unique: wGpkg7j2OGm4_IpG_jxung-1 Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-746bae78af3so60157885a.1 for <linux-kernel@vger.kernel.org>; Thu, 30 Mar 2023 09:07:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680192437; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ASfRfnQJTCdEglytu7DR/J7BYjWDsPlfNboYF8myg6I=; b=gE7BtTKQsYzebb4aHofOTIkNAODIp1rEKlkU9bWqFL71eErsxiz9euOrdsUYQZnLJk 5LEPZXtSJWRReyeuwc2l/tb9gJ88R7xJrgspCDP9jn4VE9gF03gYXVJJZCJ+AHu1lWBa c6awuLq7QreM0X+KSZziG0fzewgb2mP+OV54y8GiTx4X6H98h4e948Pd4D6D1kFCwlyf xyb+vTBH4c5ngzcADwLbguK/Asiy0Kck5Xaci3i8xZa/eGmBnBdJxKxYUdsBpzXH43f8 lOgDdMpZB+zzmYzKuRe9YRysTcdmT2GJICFvIcOFo9f9kryGFaUA45Hz7xeaJD/7lyXx l9gA== X-Gm-Message-State: AAQBX9d+dfRbaFXc7NQVsbW/3Xz/CiOd4CjHrelp1yTR2UctiRsU+EEp 7TqA4AmqbAaNH0DGBYXalGflDij6uRjqGzJyC1XqiIEoAJbZlxWOutI5LaVxN7nq4442VBG213t 8dOtA+a+WPFZpZOlg2+57odZ2Z0m9VXMh X-Received: by 2002:a05:622a:1802:b0:3e2:4280:bc58 with SMTP id t2-20020a05622a180200b003e24280bc58mr4246277qtc.3.1680192437027; Thu, 30 Mar 2023 09:07:17 -0700 (PDT) X-Received: by 2002:a05:622a:1802:b0:3e2:4280:bc58 with SMTP id t2-20020a05622a180200b003e24280bc58mr4246240qtc.3.1680192436773; Thu, 30 Mar 2023 09:07:16 -0700 (PDT) Received: from x1n.redhat.com (bras-base-aurron9127w-grc-40-70-52-229-124.dsl.bell.ca. [70.52.229.124]) by smtp.gmail.com with ESMTPSA id s80-20020a37a953000000b00741a984943fsm11749352qke.40.2023.03.30.09.07.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Mar 2023 09:07:15 -0700 (PDT) From: Peter Xu <peterx@redhat.com> To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: David Hildenbrand <david@redhat.com>, Andrew Morton <akpm@linux-foundation.org>, Andrea Arcangeli <aarcange@redhat.com>, peterx@redhat.com, Axel Rasmussen <axelrasmussen@google.com>, Mike Kravetz <mike.kravetz@oracle.com>, Leonardo Bras Soares Passos <lsoaresp@redhat.com>, Mike Rapoport <rppt@linux.vnet.ibm.com>, Nadav Amit <nadav.amit@gmail.com> Subject: [PATCH 10/29] selftests/mm: Test UFFDIO_ZEROPAGE only when !hugetlb Date: Thu, 30 Mar 2023 12:07:14 -0400 Message-Id: <20230330160714.3106999-1-peterx@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230330155707.3106228-1-peterx@redhat.com> References: <20230330155707.3106228-1-peterx@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1761810433412766043?= X-GMAIL-MSGID: =?utf-8?q?1761810433412766043?= |
Series |
selftests/mm: Split / Refactor userfault test
|
|
Commit Message
Peter Xu
March 30, 2023, 4:07 p.m. UTC
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(-)
Comments
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.
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. > -- > Mike Kravetz
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.
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. Thanks,
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 >
On Fri, Apr 07, 2023 at 12:42:29PM +0300, Mike Rapoport wrote: > > +/* > > + * 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? Definitely can do. :) Thanks,
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); __s64 res; if (offset >= nr_pages * page_size)