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 C016EC83F1A for ; Thu, 17 Jul 2025 13:19:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5DDD46B00B9; Thu, 17 Jul 2025 09:19:55 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 567636B00BA; Thu, 17 Jul 2025 09:19:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3E1C86B00BB; Thu, 17 Jul 2025 09:19:55 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 274A06B00B9 for ; Thu, 17 Jul 2025 09:19:55 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id C703F5B40D for ; Thu, 17 Jul 2025 13:19:54 +0000 (UTC) X-FDA: 83673814308.16.126D0E3 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) by imf02.hostedemail.com (Postfix) with ESMTP id B6A6680005 for ; Thu, 17 Jul 2025 13:19:52 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=MWw5cBsm; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf02.hostedemail.com: domain of lianux.mm@gmail.com designates 209.85.214.182 as permitted sender) smtp.mailfrom=lianux.mm@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752758392; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=1786UljR40Ey8hUhV8xAFjRTVHePO6Fj+ZWLSNdNrEA=; b=VpgqEpkvPXuNiQfJ7yUY1qF6RlCw25sCuXmA9uP6QRqacI0KnJvIAYA9K4+T8/IGPO9KBh o/2KnBRr0jm8XAmujZe3BOcPxEbfUvnuSMieMJzoeIERZBFJJ6LvdcscSmxbWxD4WAnqIy fynmCJAlGmp1GmJpH8AndB3GMnlpZn4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752758392; a=rsa-sha256; cv=none; b=Wo1RcsLo0UP0I0nSs+edpH9yIA3rMgCY1c32EBsO1H1A2dG1VoJAcl1O1lwpZIukmn18U3 mXYNddjlrqm/euGvoW84A3J2x93PfT7fkEXJAfBYWVIa3KESFroCZLktblQIdkQHz9n9Aj pzgzkVx96gM4QqXN5n8+gTxxjaXs9Y4= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=MWw5cBsm; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf02.hostedemail.com: domain of lianux.mm@gmail.com designates 209.85.214.182 as permitted sender) smtp.mailfrom=lianux.mm@gmail.com Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-23c703c471dso21342615ad.0 for ; Thu, 17 Jul 2025 06:19:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752758391; x=1753363191; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1786UljR40Ey8hUhV8xAFjRTVHePO6Fj+ZWLSNdNrEA=; b=MWw5cBsmYva5OXSpk5HdhJSScHVO+VzFmaYq8HbHjIVfYsvV5mT8KG5eCQg/Oup/+s bsKga9hpPZeAz/LZxcbde8kWu+t5vXCXrUIIMECz4VLjp3J8dsAH11rkQQg6DearFrda fEGC6oUNblY2GhAU5RuiBwQJKErmOXb53HeFU3Kc+Gt9QBD9Zg7JrP0gVsupyziucb6T 4CtJ3y4eISwH0sydPHUO+pbHxwPPKBCBk53J9Pr5FMSKa9VUX03A6LdLXtoveYfFNDgh n5Dq3/I+mE2/l9/De+C5HSFMMPBhtgOsEZYRxLAFJtak60r3E254yfQLGjOHviYZ8dY9 HYqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752758391; x=1753363191; 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=1786UljR40Ey8hUhV8xAFjRTVHePO6Fj+ZWLSNdNrEA=; b=ZlI885ZN/o4iR7Isas4jhDyGOfEpBvbE3fwQX+MFTXQYhO7bf4Z+/tOCVCsbjV5r3J ln3e5pQLNL+7Kib2/6CjWPof5qPLxu6lOvlVYCku8SBhsQ/zZLzVQlStHzW83SKqBW1R UyEgKpsK6fRtKUO2Iv9ysxd2MS8TsoGaWQTu9alJ04ilF3R+GzLelIwm7rjpVcuDkzZ2 0wFO0hPlbrNmJlB8ZsT3PAxQM2AcUCyMd4Z3MgjjjFr7QCts8ymnC5PzgUk78kzKb1JJ mEN8fw0hjpmOvBcGDMorrXbsoY2ejfVHNL7ivhDEUMjqV8Qt37ULyoUoi/xvAPqtYzEw iYOg== X-Forwarded-Encrypted: i=1; AJvYcCURaWbN7eURbECZ43xB3dBPpgZY1F2D1soMK8nsWSWlkIRa6a1p+tqa1CMJp7EqMLg6udb8HaqwFA==@kvack.org X-Gm-Message-State: AOJu0YzOJUs6nriOLikqNoEcfJIGdCHz46UrYG4JVzyVSJPeqnbnRhCe 8g8eCL8pkAc4HjdSvStL2FuAwuSJOgrgxTAGKV9chnKm+YFxvdZrEEnd X-Gm-Gg: ASbGnctx3lzG0A6jIp+aWPZOHzQSfwkYKnDei3lQWEezBqR4zfrO6eMAuaJIVhpFDj1 zx0EelhbXxfVhE9wZyQCAqcq/UAH6KwV751EAJlWZZDkv5CyrKzIyVLDazhuAMsNJIeSQz+6mVa d+blNENbTbMzgzIuds/LDA09fVGdvcR3q6LxtwreTRomR+j6tNiRkuLHDL8eAp/y6uZ0+fppIZi hmv/MjYu10MtchSN3ugl7TmepaUk8MBWkaCkL8+65dhxL85EUS6GP4OqCNiDk8jYbUZmc6bs7V0 pyFLxDOoNDoNrNgOzinWztXeqrIRvL894L7ijkhu5iiFe+PKI0NVJ05ZX3xEE4e9ig+qcqm2d7/ PwsQ2kKCpj5snKksQj2q5p519KtcxBhuP37Y+okQFRJgD6GuL X-Google-Smtp-Source: AGHT+IGzhSD+w6oECBIJm/zoRA+a8TQX/977OHgFJOsgHWOfj6pcUAeUpMOteR864pPF5VOP/PRPnw== X-Received: by 2002:a17:902:dac1:b0:23d:dd5b:886a with SMTP id d9443c01a7336-23e2f2308e3mr55707395ad.0.1752758391456; Thu, 17 Jul 2025 06:19:51 -0700 (PDT) Received: from DESKTOP-GIED850.localdomain ([114.247.113.178]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23de4322e7fsm148053315ad.93.2025.07.17.06.19.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jul 2025 06:19:51 -0700 (PDT) From: wang lian To: akpm@linux-foundation.org, broonie@kernel.org, david@redhat.com, lorenzo.stoakes@oracle.com, sj@kernel.org, ziy@nvidia.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: brauner@kernel.org, gkwang@linx-info.com, jannh@google.com, Liam.Howlett@oracle.com, lianux.mm@gmail.com, ludovico.zy.wu@gmail.com, p1ucky0923@gmail.com, richard.weiyang@gmail.com, ryncsn@gmail.com, shuah@kernel.org, vbabka@suse.cz, zijing.zhang@proton.me Subject: [PATCH 1/2] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));" Date: Thu, 17 Jul 2025 21:18:56 +0800 Message-ID: <20250717131857.59909-2-lianux.mm@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250717131857.59909-1-lianux.mm@gmail.com> References: <20250717131857.59909-1-lianux.mm@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: 986ej5b6patgpfon6epqjokk5b4fh1y4 X-Rspamd-Queue-Id: B6A6680005 X-Rspamd-Server: rspam10 X-Rspam-User: X-HE-Tag: 1752758392-970814 X-HE-Meta: U2FsdGVkX1/VJBEJqkWbmEALVhi6USSXX6R9MSa7qpku2jF6mJImIzgy67uqdtYqQy/StbNbEtI3HBIdipEFBMBjdUMLT8xTPUpzB2mu2cQ4tIFnFyZBBlbHfMsjrXh84XIriakJRNulzwpWfvkdWOOwaWeIgIN2sqLAkVOxkPDHlFucp7zqVmmC8p0NH6q/V8IAN3hd88QR56oA8KR6/krdK9GtrxcFM3mB+SctCyx8zRd5q1mbGOmGNYqenl/SwPosPnjdmSiJ2HXmGhkMp1baZM+VFz1QiNG4An3JSN8ybE7oNYNkYs5Jx/t/zWB3qFXGMOqZ3GmdxiMAQ0I9aTZF5BFtTVPkPnUinb1YEKQVpJYo3aEA9HKjJbMbhZjbkgnuaP7pFivwrGAvmqcptROGGKP0zVtzTJ1bU30YCVGHDRzA87U8BJOJx3D8Yie5uI7j0xIRkgeB3fgL7LzWyKWjxnrPiSr1F1vN6M2rJUsVyArwDlWQcMdST8M8tDtvdVG4JflzWGnVaKdB2tAWycAE53E1HCtGp5ZoH8nmi1PRV2IPVxqi9MvIU9Jt9a9JAIpD6YAgl4C2U8hd67LjgCeEKsZyEWEZBzaybvuN+LWvz4bLjhPPOvbnJKJDtIDGGbrI1adNuXrtAXKMigbg7+BSxv9P37KxSOzBNCOdFkcQx3sAeaGf6d/wynTImfCgu8O14sYmkwav+C4REFGZHHag1lTiQ/gFLA/LrDRAFvSfpTJLz0VNKWPC3NQy1oo3G4WMnN3Fv0zIA5SZRjsjDeDzfKyZzmgXxClScIvgTnLe7VDvufNLdXS9ezlHA9nTeKZI3RaOP/LRAEe+SEr9jVIYoTEEg4Ev2qnFndUu7GEY6H6Bdew2hltPu7V5NkuwhCTloBVV8DFRHWx4ENLJ8ZuSbaTP+sHlIg2iKvixBdDHKbj+B5Gu/hsuqZkRP4MknzB/izYXO+KyS0VagL+ U+k3WYw6 NsutWYLwXLr0IKCEl3jhvtxfMgzzFQzDOX8eEmFbkqRaYSC/lJsHKc1RTHi9sPqCMvWQu/sQ7q0u54pMaPHujoj7Xes+NvL+zr585FgYf7zoxz0xrXU1UHjnH92zl+gI80T5lwQzOHftBHf6lXB2EIn58ITNn4yucTnGPju0bv1lS+pqfCHAfhTsVKK/euHw6ogkNThf5xHginNgc50tfMc1Mzrsp5OXtujO1WU28kGpRYJzXs2hpQNYssiHIs2Lcp1K+DxwfBGSPNMrRlgDBHl2/4gMuFYcdaVm0GjEWjTY9iYx3Et4jTS6R1zNY7jeK+1NlhFUbIpaIkNaWaEw5N0kvx4w4IAWgbn9oNvzHRbXrris1r7DnUQnEpFcj58H/XwAKa5t0xbvyj5snnGfKG/8wAl+DLgZsqahgtiniyaKw9FYgjR32CyfQQoz+Bn/kbJRkdkbbIrCRkKe41SSCmn+Ezb0d82hypll6WaltJ3rDtn0kQbxmERbzJi1eGGtuhcQTnYpzgWDZTpyO7LjTvTNZc+O9QZ7pGZQjNLIndAxCWoUqoyCMmkhq6ZMQaTOQrDsaWfZCRKuR6Kj6Sjp5lyUU3pTf6mwouypWyJOmQjllbriLiQbj5RNQNec2E2z4yAkd 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: List-Subscribe: List-Unsubscribe: Several mm selftests use the `asm volatile("" : "+r" (variable));` construct to force a read of a variable, preventing the compiler from optimizing away the memory access. This idiom is cryptic and duplicated across multiple test files. Following a suggestion from David[1], this patch refactors this common pattern into a FORCE_READ() macro [1] https://lore.kernel.org/lkml/4a3e0759-caa1-4cfa-bc3f-402593f1eee3@redhat.com/ Signed-off-by: wang lian Reviewed-by: Lorenzo Stoakes --- tools/testing/selftests/mm/cow.c | 30 +++++++++---------- tools/testing/selftests/mm/guard-regions.c | 7 ----- tools/testing/selftests/mm/hugetlb-madvise.c | 5 +--- tools/testing/selftests/mm/migration.c | 13 ++++---- tools/testing/selftests/mm/pagemap_ioctl.c | 4 +-- .../selftests/mm/split_huge_page_test.c | 4 +-- tools/testing/selftests/mm/vm_util.h | 7 +++++ 7 files changed, 31 insertions(+), 39 deletions(-) diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/cow.c index 788e82b00b75..d30625c18259 100644 --- a/tools/testing/selftests/mm/cow.c +++ b/tools/testing/selftests/mm/cow.c @@ -1534,7 +1534,7 @@ static void test_ro_fast_pin(char *mem, const char *smem, size_t size) static void run_with_zeropage(non_anon_test_fn fn, const char *desc) { - char *mem, *smem, tmp; + char *mem, *smem; log_test_start("%s ... with shared zeropage", desc); @@ -1554,8 +1554,8 @@ static void run_with_zeropage(non_anon_test_fn fn, const char *desc) } /* Read from the page to populate the shared zeropage. */ - tmp = *mem + *smem; - asm volatile("" : "+r" (tmp)); + FORCE_READ(mem); + FORCE_READ(smem); fn(mem, smem, pagesize); munmap: @@ -1566,7 +1566,7 @@ static void run_with_zeropage(non_anon_test_fn fn, const char *desc) static void run_with_huge_zeropage(non_anon_test_fn fn, const char *desc) { - char *mem, *smem, *mmap_mem, *mmap_smem, tmp; + char *mem, *smem, *mmap_mem, *mmap_smem; size_t mmap_size; int ret; @@ -1617,8 +1617,8 @@ static void run_with_huge_zeropage(non_anon_test_fn fn, const char *desc) * the first sub-page and test if we get another sub-page populated * automatically. */ - tmp = *mem + *smem; - asm volatile("" : "+r" (tmp)); + FORCE_READ(mem); + FORCE_READ(smem); if (!pagemap_is_populated(pagemap_fd, mem + pagesize) || !pagemap_is_populated(pagemap_fd, smem + pagesize)) { ksft_test_result_skip("Did not get THPs populated\n"); @@ -1634,7 +1634,7 @@ static void run_with_huge_zeropage(non_anon_test_fn fn, const char *desc) static void run_with_memfd(non_anon_test_fn fn, const char *desc) { - char *mem, *smem, tmp; + char *mem, *smem; int fd; log_test_start("%s ... with memfd", desc); @@ -1668,8 +1668,8 @@ static void run_with_memfd(non_anon_test_fn fn, const char *desc) } /* Fault the page in. */ - tmp = *mem + *smem; - asm volatile("" : "+r" (tmp)); + FORCE_READ(mem); + FORCE_READ(smem); fn(mem, smem, pagesize); munmap: @@ -1682,7 +1682,7 @@ static void run_with_memfd(non_anon_test_fn fn, const char *desc) static void run_with_tmpfile(non_anon_test_fn fn, const char *desc) { - char *mem, *smem, tmp; + char *mem, *smem; FILE *file; int fd; @@ -1724,8 +1724,8 @@ static void run_with_tmpfile(non_anon_test_fn fn, const char *desc) } /* Fault the page in. */ - tmp = *mem + *smem; - asm volatile("" : "+r" (tmp)); + FORCE_READ(mem); + FORCE_READ(smem); fn(mem, smem, pagesize); munmap: @@ -1740,7 +1740,7 @@ static void run_with_memfd_hugetlb(non_anon_test_fn fn, const char *desc, size_t hugetlbsize) { int flags = MFD_HUGETLB; - char *mem, *smem, tmp; + char *mem, *smem; int fd; log_test_start("%s ... with memfd hugetlb (%zu kB)", desc, @@ -1778,8 +1778,8 @@ static void run_with_memfd_hugetlb(non_anon_test_fn fn, const char *desc, } /* Fault the page in. */ - tmp = *mem + *smem; - asm volatile("" : "+r" (tmp)); + FORCE_READ(mem); + FORCE_READ(smem); fn(mem, smem, hugetlbsize); munmap: diff --git a/tools/testing/selftests/mm/guard-regions.c b/tools/testing/selftests/mm/guard-regions.c index 93af3d3760f9..4b76e72e7053 100644 --- a/tools/testing/selftests/mm/guard-regions.c +++ b/tools/testing/selftests/mm/guard-regions.c @@ -35,13 +35,6 @@ static volatile sig_atomic_t signal_jump_set; static sigjmp_buf signal_jmp_buf; -/* - * Ignore the checkpatch warning, we must read from x but don't want to do - * anything with it in order to trigger a read page fault. We therefore must use - * volatile to stop the compiler from optimising this away. - */ -#define FORCE_READ(x) (*(volatile typeof(x) *)x) - /* * How is the test backing the mapping being tested? */ diff --git a/tools/testing/selftests/mm/hugetlb-madvise.c b/tools/testing/selftests/mm/hugetlb-madvise.c index e74107185324..1afe14b9dc0c 100644 --- a/tools/testing/selftests/mm/hugetlb-madvise.c +++ b/tools/testing/selftests/mm/hugetlb-madvise.c @@ -47,14 +47,11 @@ void write_fault_pages(void *addr, unsigned long nr_pages) void read_fault_pages(void *addr, unsigned long nr_pages) { - volatile unsigned long dummy = 0; unsigned long i; for (i = 0; i < nr_pages; i++) { - dummy += *((unsigned long *)(addr + (i * huge_page_size))); - /* Prevent the compiler from optimizing out the entire loop: */ - asm volatile("" : "+r" (dummy)); + FORCE_READ(((unsigned long *)(addr + (i * huge_page_size)))); } } diff --git a/tools/testing/selftests/mm/migration.c b/tools/testing/selftests/mm/migration.c index a306f8bab087..c5a73617796a 100644 --- a/tools/testing/selftests/mm/migration.c +++ b/tools/testing/selftests/mm/migration.c @@ -16,6 +16,7 @@ #include #include #include +#include "vm_util.h" #define TWOMEG (2<<20) #define RUNTIME (20) @@ -103,15 +104,13 @@ int migrate(uint64_t *ptr, int n1, int n2) void *access_mem(void *ptr) { - volatile uint64_t y = 0; - volatile uint64_t *x = ptr; - while (1) { pthread_testcancel(); - y += *x; - - /* Prevent the compiler from optimizing out the writes to y: */ - asm volatile("" : "+r" (y)); + /* Force a read from the memory pointed to by ptr. This ensures + * the memory access actually happens and prevents the compiler + * from optimizing away this entire loop. + */ + FORCE_READ((uint64_t *)ptr); } return NULL; diff --git a/tools/testing/selftests/mm/pagemap_ioctl.c b/tools/testing/selftests/mm/pagemap_ioctl.c index c2dcda78ad31..0d4209eef0c3 100644 --- a/tools/testing/selftests/mm/pagemap_ioctl.c +++ b/tools/testing/selftests/mm/pagemap_ioctl.c @@ -1525,9 +1525,7 @@ void zeropfn_tests(void) ret = madvise(mem, hpage_size, MADV_HUGEPAGE); if (!ret) { - char tmp = *mem; - - asm volatile("" : "+r" (tmp)); + FORCE_READ(mem); ret = pagemap_ioctl(mem, hpage_size, &vec, 1, 0, 0, PAGE_IS_PFNZERO, 0, 0, PAGE_IS_PFNZERO); diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c index f0d9c035641d..05de1fc0005b 100644 --- a/tools/testing/selftests/mm/split_huge_page_test.c +++ b/tools/testing/selftests/mm/split_huge_page_test.c @@ -399,7 +399,6 @@ int create_pagecache_thp_and_fd(const char *testfile, size_t fd_size, int *fd, char **addr) { size_t i; - int dummy = 0; unsigned char buf[1024]; srand(time(NULL)); @@ -441,8 +440,7 @@ int create_pagecache_thp_and_fd(const char *testfile, size_t fd_size, int *fd, madvise(*addr, fd_size, MADV_HUGEPAGE); for (size_t i = 0; i < fd_size; i++) - dummy += *(*addr + i); - asm volatile("" : "+r" (dummy)); + FORCE_READ((*addr + i)); if (!check_huge_file(*addr, fd_size / pmd_pagesize, pmd_pagesize)) { ksft_print_msg("No large pagecache folio generated, please provide a filesystem supporting large folio\n"); diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 2b154c287591..c20298ae98ea 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -18,6 +18,13 @@ #define PM_SWAP BIT_ULL(62) #define PM_PRESENT BIT_ULL(63) +/* + * Ignore the checkpatch warning, we must read from x but don't want to do + * anything with it in order to trigger a read page fault. We therefore must use + * volatile to stop the compiler from optimising this away. + */ +#define FORCE_READ(x) (*(volatile typeof(x) *)x) + extern unsigned int __page_size; extern unsigned int __page_shift; -- 2.43.0