From mboxrd@z Thu Jan 1 00:00:00 1970 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 67723C77B6F for ; Wed, 12 Apr 2023 16:45:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 01CE090000E; Wed, 12 Apr 2023 12:45:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id EE69D900003; Wed, 12 Apr 2023 12:45:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CF5C290000E; Wed, 12 Apr 2023 12:45:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id B58D1900003 for ; Wed, 12 Apr 2023 12:45:56 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 730B8AACD1 for ; Wed, 12 Apr 2023 16:45:56 +0000 (UTC) X-FDA: 80673315912.24.C60CE2D Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf16.hostedemail.com (Postfix) with ESMTP id 493D1180016 for ; Wed, 12 Apr 2023 16:45:54 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=b2thj6Ce; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf16.hostedemail.com: domain of peterx@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=peterx@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1681317954; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=TwrBVEbuHxz2Oj1oTVxriRpco4XXvHrMi+8R/zKrUWA=; b=KTs8wVx6XV69tkq22QiYs7xOws8I4R3oVvGrRB/vs8n5HB4ahbDFMBZsS/pguPoWHyOYHp moXf1nkQNB3WtX/J8+aQ8oX0OjsP7jYlEuRwCibnZiBVbxcs80HPT42fxJc6S8q5Gtph5W bw1bbVaq16rEYKA48OC1wbbgvSSEoRU= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=b2thj6Ce; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf16.hostedemail.com: domain of peterx@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=peterx@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1681317954; a=rsa-sha256; cv=none; b=r+Qa8sxmFm+fVf3Ud2v5e1EIqdRyOG/Z4ovoxZAgc5DXb2y5xB10X6vlDiq40Jhput6QKH 6x8E8QF8NFsxee2iKCIeP/KcTGZhsW2LPihKerm8kiMPjCGJHkjrLCgZD7YjJ08IF40dBs NVUT2zq7yLk9vrARbH2+714l1beYHgI= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1681317953; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TwrBVEbuHxz2Oj1oTVxriRpco4XXvHrMi+8R/zKrUWA=; b=b2thj6Cex2dSOyDUefUFUzk7RMnD49NFLqXZsf4/KfGgYgLTAaWkb+2K1vVBItNwVKTeAX 77gxs0LNZ/hN339JFAa4YQsSWGwvmm+8uIzhToiAYs/c3h7XmyemM5M/BwiZFdiB+lHGdq eGP+TcVMlTthXdsCj9Z167Ss9+jIiaM= Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-329-6rj1cC3bMtag-7s7Ru0AJQ-1; Wed, 12 Apr 2023 12:45:52 -0400 X-MC-Unique: 6rj1cC3bMtag-7s7Ru0AJQ-1 Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-74acb477be6so2339985a.1 for ; Wed, 12 Apr 2023 09:45:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681317951; x=1683909951; 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=TwrBVEbuHxz2Oj1oTVxriRpco4XXvHrMi+8R/zKrUWA=; b=KXdni2mIRr7yK9bBo5oU4c36KanSWN86T+1NStNx/oEWRmhyUM5hEEYTuk2/bnl2Lj fueRygQllrfxa2DK2xh16qU2dAgwYQNdvSw26E4pvRm6uVlQ5DWw47MPcdFbwjedQ7dO G9EsjPfTW2G9et//g53bdNtuwhhhyLP2lTrqQ0cQp3+KsN64IcznmMSefPYC6cBbL8Tp L8UAfLEDcIbq//IdsTuwzkQPw+Yr8GfA5d28yhGbQeZIy0a+aGk0hId4rmp8iWP7SMCx LUnOlg+2L13GrF3kzqHxurXx4PYPOmeeEfsNLB3pRRRhx1BkocwWtKPSR/clyfxA3+Hg gZDQ== X-Gm-Message-State: AAQBX9fFhnbuPBUWt5ENlnieSxJJLl7F+g7K6TvoDG3ZFwe/w3ZNHdjC Q+oqS1i2lJLlblt/WO2sAiUSdsIyJkHFQxaq9+jzalySql18eTAamFHnP9mbB6tlUZbHEDEbXcL Dzm328M/F1VSOfaFz6SzGVWPQLGqbqahaY87Y6meC9oxdryenQxb5+6YQ/L7vO89tHK+X X-Received: by 2002:a05:6214:529e:b0:532:141d:3750 with SMTP id kj30-20020a056214529e00b00532141d3750mr4520016qvb.2.1681317951219; Wed, 12 Apr 2023 09:45:51 -0700 (PDT) X-Google-Smtp-Source: AKy350bpuR8W/T8tBiH5wpuCxkcIk4HxIzNVlOw/zbLXydj3bE4PGonuqRLOxkqDMl9QuHI+HTiqgA== X-Received: by 2002:a05:6214:529e:b0:532:141d:3750 with SMTP id kj30-20020a056214529e00b00532141d3750mr4519973qvb.2.1681317950777; Wed, 12 Apr 2023 09:45:50 -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 k5-20020ad44205000000b005ef447e24adsm416733qvp.19.2023.04.12.09.45.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Apr 2023 09:45:50 -0700 (PDT) From: Peter Xu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Leonardo Bras Soares Passos , peterx@redhat.com, Mike Rapoport , Nadav Amit , Andrea Arcangeli , Mike Kravetz , David Hildenbrand , Andrew Morton , Axel Rasmussen Subject: [PATCH v2 31/31] selftests/mm: Add uffdio register ioctls test Date: Wed, 12 Apr 2023 12:45:48 -0400 Message-Id: <20230412164548.329376-1-peterx@redhat.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230412163922.327282-1-peterx@redhat.com> References: <20230412163922.327282-1-peterx@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 493D1180016 X-Stat-Signature: cbewbm5o561fhzitdwwwyqhh8nisfi34 X-HE-Tag: 1681317954-653383 X-HE-Meta: U2FsdGVkX18aUr96IogbY+7K46AY81W0E9LB66o9lVLGfDcWt3rP1x51cVyxBC5M5Nqtp03L1QyGk7WeR1N2ImCY/SDC923BESxuU0YaFf8PqJMe2glLj2XqqVhA46TemZEZQWxPcN1GQyyhT2pu66/XoW1Q6D0a4mp9NCPKAyBWGB3QvuNucUjFKSYoZjvpqHml/j2WYYbRX36czNemi8UR1IPTnS+DO6t5sOak4Ulk2ubT8/Oi0tvlO85GeNnVJmWT3Gst56hYTCBUh2m2weSXV/wK0mIT3D4dm7zok0hTVq88MnINbUIXkluB1nXGJrJ1LFHq+I/NEz/K/uIDcxOVcej6XttE3XIzhkDRB8BeU2xlhcmiFOU7MAOBagdlBoH1zc4witFqPJTLwzTKq6KK8VMC7E7xzdAO9cUOnpO7j4nj8uazDaUV2ONK2AYLSEI6mMSOFHTmFMLX2zarPLZp8NEV/35dInu6SIIUALcLqagPfMaas7FJSrrS08Z1LOYLGAAsb+0zIaQ6CuhxPQCfKUYo2ZYE6EE/OtQ3CiaV5ntQRKsCXScVPWKncjuBSqXcAkSyoAn9CCTdAva0Ew4zMr36CmzLtcaa9B9a0yLLJN7A3tvhfUe5e2wou+yX8S6p8KaS3QSoqtGjmT9MOj/WM5D+WyFks6V2FCUrA64lhSMuS8eY5e5xn+E9ShQCASBx3DqHyRKX4lce0gQkgj/LU3RMTxsoVMSnnGGBvQRNnjmM+iKh6LiSE49cUybYMQk4S4pCiWwjQNSYA8qGXk4dx7E/5Bggdz6SnTNRFwJKlE9l7qjFPglbICT/yXN/TFC4OvG55xWgjGkXZP6hduUMnnfrusEmkUKiqxsqSWvzgs3QGcSix8dCKPMnvfSe8+fOp68BVpgJKEenuwuyyf+OOIuXslOyCfnsFR7JKnfrtXQhVPT2t5TB/7BP5oK5TKeRS8qT1R/YkIfzUII mbMa4gyx hrgPwuTJscciyE+80/bKgtMAs8eclVCukqeMSzDj0wSbAVpp96r1AC1d65B0XgI7WvhQwv+b/+/qPHSFd58Q5MzNqZyQqUJ5m7yWK/XPYC+f6tQ0oXrCxZ4YWUzyyvCTHdb4dHCD4D/mL7h1zh1mbK9J+Km/N1vMfQRFZRBpEoLLsyDKBFlB1dZiBPKY5TKTe3cT36o51aPvBneMKAJUld5jpa5saw+vuMZ1Gf/zX3foFiZqlHVXGf2qTFvDVIFZyrpDPRdhBd5gFjx4YEkkbw9E3Xm7axV/RNLLEEI/+5kVzJE66uQ2nOFRm/WVvCUHCEU6HUNpYWLVuVTAcUQXZb1XMWxw6iW6Q+1qJjwy15zsDDg+jAPPfGhez25u+QIg5tG1JFkcHNUggOeNoUC1YnUyYfSR3lKVPoaubdBzSRzKupu1ggrOmP7y9m/eC7TiSWU84jC5wA5+IU8VG3P6MsNVoDu6M7wETyNuB 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: This new test tests against the returned ioctls from UFFDIO_REGISTER, where put into uffdio_register.ioctls. This also tests the expected failure cases of UFFDIO_REGISTER, aka: - Register with empty mode should fail with -EINVAL - Register minor without page cache (anon) should fail with -EINVAL Signed-off-by: Peter Xu --- tools/testing/selftests/mm/uffd-unit-tests.c | 112 ++++++++++++++++--- 1 file changed, 97 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/mm/uffd-unit-tests.c b/tools/testing/selftests/mm/uffd-unit-tests.c index b0acf558e8cb..d871bf732e62 100644 --- a/tools/testing/selftests/mm/uffd-unit-tests.c +++ b/tools/testing/selftests/mm/uffd-unit-tests.c @@ -62,8 +62,14 @@ mem_type_t mem_types[] = { }, }; +/* Arguments to be passed over to each uffd unit test */ +struct uffd_test_args { + mem_type_t *mem_type; +}; +typedef struct uffd_test_args uffd_test_args_t; + /* Returns: UFFD_TEST_* */ -typedef void (*uffd_test_fn)(void); +typedef void (*uffd_test_fn)(uffd_test_args_t *); typedef struct { const char *name; @@ -172,8 +178,9 @@ static int test_uffd_api(bool use_dev) * This function initializes the global variables. TODO: remove global * vars and then remove this. */ -static int uffd_setup_environment(uffd_test_case_t *test, mem_type_t *mem_type, - const char **errmsg) +static int +uffd_setup_environment(uffd_test_args_t *args, uffd_test_case_t *test, + mem_type_t *mem_type, const char **errmsg) { map_shared = mem_type->shared; uffd_test_ops = mem_type->mem_ops; @@ -187,6 +194,9 @@ static int uffd_setup_environment(uffd_test_case_t *test, mem_type_t *mem_type, /* TODO: remove this global var.. it's so ugly */ nr_cpus = 1; + /* Initialize test arguments */ + args->mem_type = mem_type; + return uffd_test_ctx_init(test->uffd_feature_required, errmsg); } @@ -239,7 +249,7 @@ static int pagemap_test_fork(bool present) return result; } -static void uffd_wp_unpopulated_test(void) +static void uffd_wp_unpopulated_test(uffd_test_args_t *args) { uint64_t value; int pagemap_fd; @@ -285,7 +295,7 @@ static void uffd_wp_unpopulated_test(void) uffd_test_pass(); } -static void uffd_pagemap_test(void) +static void uffd_pagemap_test(uffd_test_args_t *args) { int pagemap_fd; uint64_t value; @@ -415,17 +425,17 @@ static void uffd_minor_test_common(bool test_collapse, bool test_wp) uffd_test_pass(); } -void uffd_minor_test(void) +void uffd_minor_test(uffd_test_args_t *args) { uffd_minor_test_common(false, false); } -void uffd_minor_wp_test(void) +void uffd_minor_wp_test(uffd_test_args_t *args) { uffd_minor_test_common(false, true); } -void uffd_minor_collapse_test(void) +void uffd_minor_collapse_test(uffd_test_args_t *args) { uffd_minor_test_common(true, false); } @@ -603,12 +613,12 @@ static void uffd_sigbus_test_common(bool wp) uffd_test_pass(); } -static void uffd_sigbus_test(void) +static void uffd_sigbus_test(uffd_test_args_t *args) { uffd_sigbus_test_common(false); } -static void uffd_sigbus_wp_test(void) +static void uffd_sigbus_wp_test(uffd_test_args_t *args) { uffd_sigbus_test_common(true); } @@ -651,12 +661,12 @@ static void uffd_events_test_common(bool wp) uffd_test_pass(); } -static void uffd_events_test(void) +static void uffd_events_test(uffd_test_args_t *args) { uffd_events_test_common(false); } -static void uffd_events_wp_test(void) +static void uffd_events_wp_test(uffd_test_args_t *args) { uffd_events_test_common(true); } @@ -724,7 +734,7 @@ uffd_register_detect_zeropage(int uffd, void *addr, uint64_t len) } /* exercise UFFDIO_ZEROPAGE */ -static void uffd_zeropage_test(void) +static void uffd_zeropage_test(uffd_test_args_t *args) { bool has_zeropage; int i; @@ -748,7 +758,77 @@ static void uffd_zeropage_test(void) uffd_test_pass(); } +/* + * Test the returned uffdio_register.ioctls with different register modes. + * Note that _UFFDIO_ZEROPAGE is tested separately in the zeropage test. + */ +static void +do_register_ioctls_test(uffd_test_args_t *args, bool miss, bool wp, bool minor) +{ + uint64_t ioctls = 0, expected = BIT_ULL(_UFFDIO_WAKE); + mem_type_t *mem_type = args->mem_type; + int ret; + + ret = uffd_register_with_ioctls(uffd, area_dst, page_size, + miss, wp, minor, &ioctls); + + /* + * Handle special cases of UFFDIO_REGISTER here where it should + * just fail with -EINVAL first.. + * + * Case 1: register MINOR on anon + * Case 2: register with no mode selected + */ + if ((minor && (mem_type->mem_flag == MEM_ANON)) || + (!miss && !wp && !minor)) { + if (ret != -EINVAL) + err("register (miss=%d, wp=%d, minor=%d) failed " + "with wrong errno=%d", miss, wp, minor, ret); + return; + } + + /* UFFDIO_REGISTER should succeed, then check ioctls returned */ + if (miss) + expected |= BIT_ULL(_UFFDIO_COPY); + if (wp) + expected |= BIT_ULL(_UFFDIO_WRITEPROTECT); + if (minor) + expected |= BIT_ULL(_UFFDIO_CONTINUE); + + if ((ioctls & expected) != expected) + err("unexpected uffdio_register.ioctls " + "(miss=%d, wp=%d, minor=%d): expected=0x%"PRIx64", " + "returned=0x%"PRIx64, miss, wp, minor, expected, ioctls); + + if (uffd_unregister(uffd, area_dst, page_size)) + err("unregister"); +} + +static void uffd_register_ioctls_test(uffd_test_args_t *args) +{ + int miss, wp, minor; + + for (miss = 0; miss <= 1; miss++) + for (wp = 0; wp <= 1; wp++) + for (minor = 0; minor <= 1; minor++) + do_register_ioctls_test(args, miss, wp, minor); + + uffd_test_pass(); +} + uffd_test_case_t uffd_tests[] = { + { + /* Test returned uffdio_register.ioctls. */ + .name = "register-ioctls", + .uffd_fn = uffd_register_ioctls_test, + .mem_targets = MEM_ALL, + .uffd_feature_required = UFFD_FEATURE_MISSING_HUGETLBFS | + UFFD_FEATURE_MISSING_SHMEM | + UFFD_FEATURE_PAGEFAULT_FLAG_WP | + UFFD_FEATURE_WP_HUGETLBFS_SHMEM | + UFFD_FEATURE_MINOR_HUGETLBFS | + UFFD_FEATURE_MINOR_SHMEM, + }, { .name = "zeropage", .uffd_fn = uffd_zeropage_test, @@ -835,6 +915,7 @@ int main(int argc, char *argv[]) int n_mems = sizeof(mem_types) / sizeof(mem_type_t); uffd_test_case_t *test; mem_type_t *mem_type; + uffd_test_args_t args; char test_name[128]; const char *errmsg; int has_uffd; @@ -862,11 +943,12 @@ int main(int argc, char *argv[]) uffd_test_skip("feature missing"); continue; } - if (uffd_setup_environment(test, mem_type, &errmsg)) { + if (uffd_setup_environment(&args, test, mem_type, + &errmsg)) { uffd_test_skip(errmsg); continue; } - test->uffd_fn(); + test->uffd_fn(&args); } } -- 2.39.1