From patchwork Thu Sep 30 21:23:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Axel Rasmussen X-Patchwork-Id: 12529343 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F59AC433EF for ; Thu, 30 Sep 2021 21:23:23 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 13EEC61A38 for ; Thu, 30 Sep 2021 21:23:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 13EEC61A38 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id B09DE9400D2; Thu, 30 Sep 2021 17:23:22 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A91BA94003A; Thu, 30 Sep 2021 17:23:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9A6189400D2; Thu, 30 Sep 2021 17:23:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0109.hostedemail.com [216.40.44.109]) by kanga.kvack.org (Postfix) with ESMTP id 85F0794003A for ; Thu, 30 Sep 2021 17:23:22 -0400 (EDT) Received: from smtpin04.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 44EEB39F47 for ; Thu, 30 Sep 2021 21:23:22 +0000 (UTC) X-FDA: 78645515844.04.4FC59C9 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) by imf25.hostedemail.com (Postfix) with ESMTP id 0574EB0001B4 for ; Thu, 30 Sep 2021 21:23:21 +0000 (UTC) Received: by mail-yb1-f201.google.com with SMTP id z2-20020a254c02000000b005b68ef4fe24so10471868yba.11 for ; Thu, 30 Sep 2021 14:23:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=O1Wk2DsZzjmvOi9GlXjWLcYlkQVsSE0/3HMwsEB5v90=; b=p5N9OfoJnRryV2eKQy7VJj+QvmddfN6dQLK1yKEYuT0+MEdaPYTk0F1gSb0XuI4m/C UOSfrWwVYnKcg9i4VTVBWBoyzlr5D/4tCJHL+keAjsGNCgUG4CkTUALdSFqGuL1rUIfW eJiSFq5kNK2QYiOhfHBTWkEVNQXnH5xkx3SF77V8LMdO+UwtxoCiJaacEOdGcUhQjaMX LiFJIX6epwBcRsVVwO6fsb777Dm9tQI3wml4GWagAl575ckhhUU4KI4NIuPEbxf2z0yy 9KrwvWJ9b+hSfVCQwJjcfsfhMhG6YWBrH+TQJgm5EXPp85Q0LyoSYm9H6b9xm/wA2pgj OdZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=O1Wk2DsZzjmvOi9GlXjWLcYlkQVsSE0/3HMwsEB5v90=; b=eKnF+SBGgm5jI4BLipp4C2n5CyFn5E6aYy/pLUFcdKLNBMJU8NiJGRA67GVnsl4R9x pn+Q7IVeX9DvDl81IyopWC4AgRLLLngkxZ0Njr6R0hlQ1DDuwyUtOZHxMBeocQUD5G9c kR34u/IEYzh+LK0+IAkK+JZbMPERKd6cUZphRnCcScBpuwXZ4uA+nWgrKQXnI6U0X96x peHrQNGD1rv7vIDEe2CDSGea6Q3vxLWA95fAdKzJ4VxzE5WNUSbd/6BtSK+9I0JyvnAr 1X/ISyfoPWrENH8NX61pHXlads1MmX8xIfN6lQ25N6pxxIueQVdjl711XEVb3yujVo8h iQBg== X-Gm-Message-State: AOAM531MxavXRYSxuSlZez2ygkOxxOAM2t1w/EMyZPPGRDMX55FJCAXa IW6ln7hnVd2pobOkHWVtdtKiMHe18plFNz/JCjhB X-Google-Smtp-Source: ABdhPJzQJP1Tci6sbmHJjYHkBqAym/flLRBcDla+uZ6luLw59DtIioxJBp4LVRUhA0wkrCyLNd6qTLK3ikD9/a+QM2T2 X-Received: from ajr0.svl.corp.google.com ([2620:15c:2cd:203:fa06:3b29:d3c:37e6]) (user=axelrasmussen job=sendgmr) by 2002:a05:6902:705:: with SMTP id k5mr1886040ybt.490.1633037001347; Thu, 30 Sep 2021 14:23:21 -0700 (PDT) Date: Thu, 30 Sep 2021 14:23:08 -0700 In-Reply-To: <20210930212309.4001967-1-axelrasmussen@google.com> Message-Id: <20210930212309.4001967-3-axelrasmussen@google.com> Mime-Version: 1.0 References: <20210930212309.4001967-1-axelrasmussen@google.com> X-Mailer: git-send-email 2.33.0.800.g4c38ced690-goog Subject: [PATCH v2 2/3] userfaultfd/selftests: fix feature support detection From: Axel Rasmussen To: Andrew Morton , Peter Xu , Shuah Khan Cc: linux-mm@kvack.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, Axel Rasmussen Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=google.com header.s=20210112 header.b=p5N9OfoJ; spf=pass (imf25.hostedemail.com: domain of 3ySpWYQ0KCIgm9qx3m4y644qzs00sxq.o0yxuz69-yyw7mow.03s@flex--axelrasmussen.bounces.google.com designates 209.85.219.201 as permitted sender) smtp.mailfrom=3ySpWYQ0KCIgm9qx3m4y644qzs00sxq.o0yxuz69-yyw7mow.03s@flex--axelrasmussen.bounces.google.com; dmarc=pass (policy=reject) header.from=google.com X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 0574EB0001B4 X-Stat-Signature: y4s7yb8tyf3d4wyjgh5ppbbugxhju7ck X-HE-Tag: 1633037001-769207 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Before any tests are run, in set_test_type, we decide what feature(s) we are going to be testing, based upon our command line arguments. However, the supported features are not just a function of the memory type being used, so this is broken. For instance, consider writeprotect support. It is "normally" supported for anonymous memory, but furthermore it requires that the kernel has CONFIG_HAVE_ARCH_USERFAULTFD_WP. So, it is *not* supported at all on aarch64, for example. So, this commit fixes this by querying the kernel for the set of features it supports in set_test_type, by opening a userfaultfd and issuing a UFFDIO_API ioctl. Based upon the reported features, we toggle what tests are enabled. Signed-off-by: Axel Rasmussen Reviewed-by: Peter Xu --- tools/testing/selftests/vm/userfaultfd.c | 54 ++++++++++++++---------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index 2a71a91559a7..00d1b7555865 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -346,6 +346,16 @@ static struct uffd_test_ops hugetlb_uffd_test_ops = { static struct uffd_test_ops *uffd_test_ops; +static inline uint64_t uffd_minor_feature(void) +{ + if (test_type == TEST_HUGETLB && map_shared) + return UFFD_FEATURE_MINOR_HUGETLBFS; + else if (test_type == TEST_SHMEM) + return UFFD_FEATURE_MINOR_SHMEM; + else + return 0; +} + static void userfaultfd_open(uint64_t *features) { struct uffdio_api uffdio_api; @@ -406,7 +416,7 @@ static void uffd_test_ctx_clear(void) munmap_area((void **)&area_dst_alias); } -static void uffd_test_ctx_init_ext(uint64_t *features) +static void uffd_test_ctx_init(uint64_t features) { unsigned long nr, cpu; @@ -418,7 +428,7 @@ static void uffd_test_ctx_init_ext(uint64_t *features) uffd_test_ops->release_pages(area_src); uffd_test_ops->release_pages(area_dst); - userfaultfd_open(features); + userfaultfd_open(&features); count_verify = malloc(nr_pages * sizeof(unsigned long long)); if (!count_verify) @@ -446,11 +456,6 @@ static void uffd_test_ctx_init_ext(uint64_t *features) err("pipe"); } -static inline void uffd_test_ctx_init(uint64_t features) -{ - uffd_test_ctx_init_ext(&features); -} - static int my_bcmp(char *str1, char *str2, size_t n) { unsigned long i; @@ -1191,7 +1196,6 @@ static int userfaultfd_minor_test(void) void *expected_page; char c; struct uffd_stats stats = { 0 }; - uint64_t req_features, features_out; if (!test_uffdio_minor) return 0; @@ -1199,21 +1203,7 @@ static int userfaultfd_minor_test(void) printf("testing minor faults: "); fflush(stdout); - if (test_type == TEST_HUGETLB) - req_features = UFFD_FEATURE_MINOR_HUGETLBFS; - else if (test_type == TEST_SHMEM) - req_features = UFFD_FEATURE_MINOR_SHMEM; - else - return 1; - - features_out = req_features; - uffd_test_ctx_init_ext(&features_out); - /* If kernel reports required features aren't supported, skip test. */ - if ((features_out & req_features) != req_features) { - printf("skipping test due to lack of feature support\n"); - fflush(stdout); - return 0; - } + uffd_test_ctx_init(uffd_minor_feature()); uffdio_register.range.start = (unsigned long)area_dst_alias; uffdio_register.range.len = nr_pages * page_size; @@ -1574,6 +1564,8 @@ unsigned long default_huge_page_size(void) static void set_test_type(const char *type) { + uint64_t features = UFFD_API_FEATURES; + if (!strcmp(type, "anon")) { test_type = TEST_ANON; uffd_test_ops = &anon_uffd_test_ops; @@ -1607,6 +1599,22 @@ static void set_test_type(const char *type) if ((unsigned long) area_count(NULL, 0) + sizeof(unsigned long long) * 2 > page_size) err("Impossible to run this test"); + + /* + * Whether we can test certain features depends not just on test type, + * but also on whether or not this particular kernel supports the + * feature. + */ + + userfaultfd_open(&features); + + test_uffdio_wp = test_uffdio_wp && + (features & UFFD_FEATURE_PAGEFAULT_FLAG_WP); + test_uffdio_minor = test_uffdio_minor && + (features & uffd_minor_feature()); + + close(uffd); + uffd = -1; } static void sigalrm(int sig)