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 BF499C761A6 for ; Thu, 30 Mar 2023 16:08:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5B796900003; Thu, 30 Mar 2023 12:08:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 568626B009C; Thu, 30 Mar 2023 12:08:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3E13F6B009D; Thu, 30 Mar 2023 12:08:21 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 2BCC56B009B for ; Thu, 30 Mar 2023 12:08:21 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 003B51A0A83 for ; Thu, 30 Mar 2023 16:08:20 +0000 (UTC) X-FDA: 80626046802.24.E56CFB4 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf29.hostedemail.com (Postfix) with ESMTP id 5F1CB120027 for ; Thu, 30 Mar 2023 16:08:18 +0000 (UTC) Authentication-Results: imf29.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LcsIBjlt; spf=pass (imf29.hostedemail.com: domain of peterx@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1680192498; 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=8NTrS8mJzWPEnPLBWSlseOL+7dIWq0u/3um5fPzddJ8=; b=68uuze/xmnEKvws6f5uIgOTAP7Kq88V6hVI7soiCaCV19b6yrE5rcYHTRnR5Ss/JAefQha BZZqxoDdnf6YLpwQS1vGbkF+Z9FlrquSB9sDDdT0vMCGIgE29bQh6nL9mul/F2rcz+4AT4 TAdd/cyTz3m066TjGo5u/4OG8StVpbQ= ARC-Authentication-Results: i=1; imf29.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=LcsIBjlt; spf=pass (imf29.hostedemail.com: domain of peterx@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1680192498; a=rsa-sha256; cv=none; b=3UhYDKhM/V4TwxEEv1HL382ARNcxCdnVI3VJ+pFL1s7PllKMCcvuiVCJFgzmCTvPwulrIZ Djkxm5KZn8O/HsQombC1CinNmwF8WGGHVWXN6pBW7NmdQ+H9ULkkQVLfyRh1WvKRobCp6+ ogX6I5XXvZh/Xc2qsEBHPTb0bwXGwcc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680192497; 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=8NTrS8mJzWPEnPLBWSlseOL+7dIWq0u/3um5fPzddJ8=; b=LcsIBjltTXhzyaYrrR5Op3z7T44Sup/r6npNPpeaVmhsmWWBiuFPnzqPMTbyabuz2PFZMG HTEoCq67XEzUD7gtCqCq720gNgpZXDTasLDU//Kgh1zrZ3RoIjiBpLUImHijSxjQXR/kGI 1nws6P12+wFhENfYsWY0snwfAde13Tg= Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-595-QRPUpWnUOkOqADGVNAqiJg-1; Thu, 30 Mar 2023 12:08:16 -0400 X-MC-Unique: QRPUpWnUOkOqADGVNAqiJg-1 Received: by mail-qv1-f71.google.com with SMTP id dl18-20020ad44e12000000b005a4d5420bc6so8440910qvb.11 for ; Thu, 30 Mar 2023 09:08:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680192496; x=1682784496; 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=8NTrS8mJzWPEnPLBWSlseOL+7dIWq0u/3um5fPzddJ8=; b=09QwH3YxeyMbo4zjmBNBD7Y117vFoL/Ig+BgCv1Gu2RHmTca4lJjbsxgk6U1ApGoAZ jHd5R29O5Fm7i9cdRuBXcnaFYt747O7Dql7jLx76QlCG6rudEBi5k3m4Axq3nL77w1F0 NwQaFYYaseou/6BlFest1JorpDNSmnfQEWDoH64iPjIDXIjJgOVzIsa0KiWq0AZxasdV 84HqqSuFNcv4Mfh2vvQc0slH5rMuiXFzCeDnusidrN+slo/PaCWg4Vc9UYzWTXZ3rEXv rA+uwyhjsyDKadKln9lhEoEhAmq1ZyW1fBnrxBhbUVGGUzdWxJudY0/CuxRK2AGpevZY 6J1Q== X-Gm-Message-State: AO0yUKVeUGYVVqfvuClz5Hi0bAYiGweJ5QQ9Etb96v6WwQ97aX/HmegO 751C196yY9pPNQzI+lJcjhTmj+QqZ/JtxDhv+1+02ScG+Lhj4YW8HKGvkZptslpxhgjlKXycCDm T7dvykX/1yqM= X-Received: by 2002:a05:622a:3c9:b0:3b8:36f8:830e with SMTP id k9-20020a05622a03c900b003b836f8830emr37733720qtx.6.1680192495914; Thu, 30 Mar 2023 09:08:15 -0700 (PDT) X-Google-Smtp-Source: AK7set+xWLH8y6GmL2ENvwzVmLLUlI8WPGbRuYB5jyqQ/eNHJax24mqyfmVMDw61Ei3HBM8optw/0w== X-Received: by 2002:a05:622a:3c9:b0:3b8:36f8:830e with SMTP id k9-20020a05622a03c900b003b836f8830emr37733689qtx.6.1680192495676; Thu, 30 Mar 2023 09:08:15 -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 bn29-20020a05620a2add00b007486052d731sm4247503qkb.10.2023.03.30.09.08.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Mar 2023 09:08:15 -0700 (PDT) From: Peter Xu To: linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: Mike Kravetz , Mike Rapoport , Andrea Arcangeli , peterx@redhat.com, Leonardo Bras Soares Passos , Andrew Morton , David Hildenbrand , Axel Rasmussen , Nadav Amit Subject: [PATCH 19/29] selftests/mm: Let uffd_handle_page_fault() takes wp parameter Date: Thu, 30 Mar 2023 12:08:12 -0400 Message-Id: <20230330160812.3107522-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 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: rspam04 X-Rspamd-Queue-Id: 5F1CB120027 X-Stat-Signature: mgh5514gnkdodo9gdecx7rnkmmgtcrcm X-HE-Tag: 1680192498-19121 X-HE-Meta: U2FsdGVkX19R7WBPo86nywQ42q4OY7x4VaiWt4tW9r1FyomBl7n26Loxx1gNTyEJK0OvUw97iodR5KOcKbymIYke/it/oGg3ix96nHReu4W0WyE61AGWj6CYarlM17uiGeeeoSE1MBPR4Srg13o+hgMpjvEuwfTKlDyqs3RVvVWMEGwFAj7YFWCCA4qrq5zNx5HfktkOi/gMJfDLHhVnqiesF+pOpO+Wti5FMKL7wNKlhLwg7vm+INijs8gaoC+Xfi9hHunixr/I93CKxSH4HALhPAYXd1VzLI50qy9S0+/f/4ALkT+A7Igc2/JEoPjhErQyi/aloQ4DqOwj7gvvdLfWa4cOaajFQjRx43Hhjc02a1E6v5GIAm9XH+cE33tt39DMGW7dYeZAfvng4FkyBpY9tYsCnA+/9BdRX8gNuIAasdxQcGDz133FZcvKZXoq8vGG1iCDjD/zzY0k1+KDBsAacP8cRXpPdW5gO8w9gK++ecVpOG+L1GfpMiO8cAd8GpRGu+WJ0oT6PEBHfNo9bMU1nklHMXzjWSZ9zNIBgxTLV3rw6ZxNcHb1UZPaQH7Us2TOCx+raZto+cVdeEPHL7oKOSAxww7G8PIFZR/v1R8uiAa/sqHZmJhnTcq2W/3Hi7f7cFzZxA/dpV+7S9nSmXLbfgxvMSJQ+kShu1bPYd2yuhpS50pqsPvXwjNPasg+sDXhbJZV2jZMdRAqLl9qJFvKApKzGPsqYjI8AaiHHHpowg1pWvYHJxUoqe8vDm7BFdvK3aYz7Nd8KUde3Ru/ua9TX/qL8n5dLPuBYRU72tBgLzA0gF60NhrTcEh+lxqLyORgDyt2+4tV4u2aCIDtZa59bdKR/AVmSfsx9/i3vhfdu31rue3T8A6vmv82L/nJ5f7dcM1XPjnb68ovYPFz5lbTuXFxAda3umBsvlcTIyHXRQ3kixoW65kqanptpgIrjxUDiihyLQg+aTTawcJ tCIGtofX TQL0QI7X+OP//fMCY7P8yupGbjcWEsZqVSw7Ancht/AtXOXiJeQoOzElU1JvlCB4FLDMoWRJCDrWJBOCHyg8V9zSkArVi9VQhSEnD4XESLlgdJHiX0MWzWCR5DAolcu/14GfZtY8q0JVToFeAfnkFawBmfMLj5T3Aa4bbxkpEW0gykkyCPfHxk7m8ICixI+0QuthKeKDKJIEU9CkUPkeLX50PU6QDd+Xps001n8BEmpASJDbj5jak/xWPT6+/A4igK/SQmCcvAVQ7k42atJn63BJExaOpCwZw68C5YvyFtAGtI05tkLnU88e3DGzInzWwCkrQEiG6f04AZ43CJWluEI90JfrMW3lqiWsc//OyfnniU1TDmeIQMBvZULOSiEDd0bwdNvG+bgw5ZdITTS+F+Qhf8kqwcgD1ikUT0+iD17IKUfQsqDhRKt4YwiDUkWNGFZ468jKZDTxjIFQ0Kb7BhVa3LCo3DGhWpVdr3fNA8SSvCWxpcZGo3uw7yPJkGYS4hVcOzLZZCNQDNzk= 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: Make the handler optionally apply WP bit when resolving page faults for either missing or minor page faults. This move towards removing global test_uffdio_wp outside of the common code. For this, slightly abuse uffd_stats to keep one more parameter on whether we'd like to resolve page faults with WP bit set. Note that only the name is abused, it'll be better to be called uffd_args or similar but let's not bother for now. Signed-off-by: Peter Xu --- tools/testing/selftests/mm/uffd-common.c | 17 +++++++++-------- tools/testing/selftests/mm/uffd-common.h | 6 ++++-- tools/testing/selftests/mm/uffd-stress.c | 16 ++++++++++------ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c index 025e40ffc7bf..92b7e00efa8a 100644 --- a/tools/testing/selftests/mm/uffd-common.c +++ b/tools/testing/selftests/mm/uffd-common.c @@ -353,7 +353,7 @@ void wp_range(int ufd, __u64 start, __u64 len, bool wp) err("clear WP failed: address=0x%"PRIx64, (uint64_t)start); } -static void continue_range(int ufd, __u64 start, __u64 len) +static void continue_range(int ufd, __u64 start, __u64 len, bool wp) { struct uffdio_continue req; int ret; @@ -361,7 +361,7 @@ static void continue_range(int ufd, __u64 start, __u64 len) req.range.start = start; req.range.len = len; req.mode = 0; - if (test_uffdio_wp) + if (wp) req.mode |= UFFDIO_CONTINUE_MODE_WP; if (ioctl(ufd, UFFDIO_CONTINUE, &req)) @@ -429,7 +429,8 @@ void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_stats *stats) area_dst_alias)); for (b = 0; b < page_size; ++b) area[b] = ~area[b]; - continue_range(uffd, msg->arg.pagefault.address, page_size); + continue_range(uffd, msg->arg.pagefault.address, page_size, + stats->apply_wp); stats->minor_faults++; } else { /* @@ -459,7 +460,7 @@ void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_stats *stats) offset = (char *)(unsigned long)msg->arg.pagefault.address - area_dst; offset &= ~(page_size-1); - if (copy_page(uffd, offset)) + if (copy_page(uffd, offset, stats->apply_wp)) stats->missing_faults++; } } @@ -555,7 +556,7 @@ static void wake_range(int ufd, unsigned long addr, unsigned long len) addr), exit(1); } -int __copy_page(int ufd, unsigned long offset, bool retry) +int __copy_page(int ufd, unsigned long offset, bool retry, bool wp) { struct uffdio_copy uffdio_copy; @@ -564,7 +565,7 @@ int __copy_page(int ufd, unsigned long offset, bool retry) uffdio_copy.dst = (unsigned long) area_dst + offset; uffdio_copy.src = (unsigned long) area_src + offset; uffdio_copy.len = page_size; - if (test_uffdio_wp) + if (wp) uffdio_copy.mode = UFFDIO_COPY_MODE_WP; else uffdio_copy.mode = 0; @@ -587,8 +588,8 @@ int __copy_page(int ufd, unsigned long offset, bool retry) return 0; } -int copy_page(int ufd, unsigned long offset) +int copy_page(int ufd, unsigned long offset, bool wp) { - return __copy_page(ufd, offset, false); + return __copy_page(ufd, offset, false, wp); } diff --git a/tools/testing/selftests/mm/uffd-common.h b/tools/testing/selftests/mm/uffd-common.h index 47565b2f2dee..f4bc73ce3b48 100644 --- a/tools/testing/selftests/mm/uffd-common.h +++ b/tools/testing/selftests/mm/uffd-common.h @@ -72,6 +72,8 @@ /* Userfaultfd test statistics */ struct uffd_stats { int cpu; + /* Whether apply wr-protects when installing pages */ + bool apply_wp; unsigned long missing_faults; unsigned long wp_faults; unsigned long minor_faults; @@ -104,8 +106,8 @@ void userfaultfd_open(uint64_t *features); int uffd_read_msg(int ufd, struct uffd_msg *msg); void wp_range(int ufd, __u64 start, __u64 len, bool wp); void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_stats *stats); -int __copy_page(int ufd, unsigned long offset, bool retry); -int copy_page(int ufd, unsigned long offset); +int __copy_page(int ufd, unsigned long offset, bool retry, bool wp); +int copy_page(int ufd, unsigned long offset, bool wp); void *uffd_poll_thread(void *arg); #define TEST_ANON 1 diff --git a/tools/testing/selftests/mm/uffd-stress.c b/tools/testing/selftests/mm/uffd-stress.c index 54fc9b4ffa3c..70cb0619354e 100644 --- a/tools/testing/selftests/mm/uffd-stress.c +++ b/tools/testing/selftests/mm/uffd-stress.c @@ -97,6 +97,7 @@ static void uffd_stats_reset(struct uffd_stats *uffd_stats, for (i = 0; i < n_cpus; i++) { uffd_stats[i].cpu = i; + uffd_stats[i].apply_wp = test_uffdio_wp; uffd_stats[i].missing_faults = 0; uffd_stats[i].wp_faults = 0; uffd_stats[i].minor_faults = 0; @@ -156,7 +157,7 @@ static void *locking_thread(void *arg) static int copy_page_retry(int ufd, unsigned long offset) { - return __copy_page(ufd, offset, true); + return __copy_page(ufd, offset, true, test_uffdio_wp); } pthread_mutex_t uffd_read_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -309,7 +310,7 @@ static void sighndl(int sig, siginfo_t *siginfo, void *ptr) * This also tests UFFD_FEATURE_EVENT_FORK event along with the signal * feature. Using monitor thread, verify no userfault events are generated. */ -static int faulting_process(int signal_test) +static int faulting_process(int signal_test, bool wp) { unsigned long nr; unsigned long long count; @@ -344,7 +345,7 @@ static int faulting_process(int signal_test) if (steps == 1) { /* This is a MISSING request */ steps++; - if (copy_page(uffd, offset)) + if (copy_page(uffd, offset, wp)) signalled++; } else { /* This is a WP request */ @@ -508,6 +509,7 @@ static int userfaultfd_events_test(void) true, test_uffdio_wp, false)) err("register failure"); + stats.apply_wp = test_uffdio_wp; if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats)) err("uffd_poll_thread create"); @@ -516,7 +518,7 @@ static int userfaultfd_events_test(void) err("fork"); if (!pid) - exit(faulting_process(0)); + exit(faulting_process(0, test_uffdio_wp)); waitpid(pid, &err, 0); if (err) @@ -552,11 +554,12 @@ static int userfaultfd_sig_test(void) true, test_uffdio_wp, false)) err("register failure"); - if (faulting_process(1)) + if (faulting_process(1, test_uffdio_wp)) err("faulting process failed"); uffd_test_ops->release_pages(area_dst); + stats.apply_wp = test_uffdio_wp; if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats)) err("uffd_poll_thread create"); @@ -565,7 +568,7 @@ static int userfaultfd_sig_test(void) err("fork"); if (!pid) - exit(faulting_process(2)); + exit(faulting_process(2, test_uffdio_wp)); waitpid(pid, &err, 0); if (err) @@ -629,6 +632,7 @@ static int userfaultfd_minor_test(void) page_size); } + stats.apply_wp = test_uffdio_wp; if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats)) err("uffd_poll_thread create"); -- 2.39.1