linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
@ 2025-07-16 12:31 wang lian
  2025-07-16 13:16 ` David Hildenbrand
  2025-07-16 22:15 ` Andrew Morton
  0 siblings, 2 replies; 9+ messages in thread
From: wang lian @ 2025-07-16 12:31 UTC (permalink / raw)
  To: akpm, broonie, david, lorenzo.stoakes, sj, ziy, linux-mm,
	linux-kernel
  Cc: brauner, jannh, Liam.Howlett, shuah, vbabka, ludovico.zy.wu,
	gkwang, p1ucky0923, ryncsn, zijing.zhang, lianux.mm

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 <lianux.mm@gmail.com>
Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>

---
 tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
 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 +--
 5 files changed, 24 insertions(+), 32 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/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 <sys/types.h>
 #include <signal.h>
 #include <time.h>
+#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");
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-16 12:31 [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));" wang lian
@ 2025-07-16 13:16 ` David Hildenbrand
  2025-07-16 22:15 ` Andrew Morton
  1 sibling, 0 replies; 9+ messages in thread
From: David Hildenbrand @ 2025-07-16 13:16 UTC (permalink / raw)
  To: wang lian, akpm, broonie, lorenzo.stoakes, sj, ziy, linux-mm,
	linux-kernel
  Cc: brauner, jannh, Liam.Howlett, shuah, vbabka, ludovico.zy.wu,
	gkwang, p1ucky0923, ryncsn, zijing.zhang

On 16.07.25 14:31, wang lian wrote:
> 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 <lianux.mm@gmail.com>
> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>

Acked-by: David Hildenbrand <david@redhat.com>

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-16 12:31 [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));" wang lian
  2025-07-16 13:16 ` David Hildenbrand
@ 2025-07-16 22:15 ` Andrew Morton
  2025-07-17  6:58   ` Wei Yang
  2025-07-17 10:48   ` wang lian
  1 sibling, 2 replies; 9+ messages in thread
From: Andrew Morton @ 2025-07-16 22:15 UTC (permalink / raw)
  To: wang lian
  Cc: broonie, david, lorenzo.stoakes, sj, ziy, linux-mm, linux-kernel,
	brauner, jannh, Liam.Howlett, shuah, vbabka, ludovico.zy.wu,
	gkwang, p1ucky0923, ryncsn, zijing.zhang

On Wed, 16 Jul 2025 20:31:26 +0800 wang lian <lianux.mm@gmail.com> wrote:

> 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
> 
>  tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
>  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 +--
>  5 files changed, 24 insertions(+), 32 deletions(-)

The patch forgot to move the FORCE_READ definition into a header?



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-16 22:15 ` Andrew Morton
@ 2025-07-17  6:58   ` Wei Yang
  2025-07-17 10:48   ` wang lian
  1 sibling, 0 replies; 9+ messages in thread
From: Wei Yang @ 2025-07-17  6:58 UTC (permalink / raw)
  To: Andrew Morton
  Cc: wang lian, broonie, david, lorenzo.stoakes, sj, ziy, linux-mm,
	linux-kernel, brauner, jannh, Liam.Howlett, shuah, vbabka,
	ludovico.zy.wu, gkwang, p1ucky0923, ryncsn, zijing.zhang

On Wed, Jul 16, 2025 at 03:15:43PM -0700, Andrew Morton wrote:
>On Wed, 16 Jul 2025 20:31:26 +0800 wang lian <lianux.mm@gmail.com> wrote:
>
>> 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
>> 
>>  tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
>>  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 +--
>>  5 files changed, 24 insertions(+), 32 deletions(-)
>
>The patch forgot to move the FORCE_READ definition into a header?
>

I get this after applying the patch.

cow.c:1559:9: warning: implicit declaration of function ‘FORCE_READ’; did you mean ‘LOCK_READ’? [-Wimplicit-function-declaration]
 1559 |         FORCE_READ(mem);

-- 
Wei Yang
Help you, Help me


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-16 22:15 ` Andrew Morton
  2025-07-17  6:58   ` Wei Yang
@ 2025-07-17 10:48   ` wang lian
  2025-07-17 11:43     ` David Hildenbrand
  1 sibling, 1 reply; 9+ messages in thread
From: wang lian @ 2025-07-17 10:48 UTC (permalink / raw)
  To: akpm
  Cc: Liam.Howlett, brauner, broonie, david, gkwang, jannh, lianux.mm,
	linux-kernel, linux-mm, lorenzo.stoakes, ludovico.zy.wu,
	p1ucky0923, ryncsn, shuah, sj, vbabka, zijing.zhang, ziy

> On Wed, 16 Jul 2025 20:31:26 +0800 wang lian <lianux.mm@gmail.com> wrote:

> > 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
> > 
> >  tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
> >  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 +--
> >  5 files changed, 24 insertions(+), 32 deletions(-)

> The patch forgot to move the FORCE_READ definition into a header?

Hi Andrew,
You are absolutely right. My apologies for the inconvenience.
This patch was sent standalone based on a suggestion from David during 
the discussion of a previous, larger patch series. In that original series, 
I had already moved the FORCE_READ() macro definition into vm_util.h.

You can find the original patch series and discussion at this link:
https://lore.kernel.org/lkml/20250714130009.14581-1-lianux.mm@gmail.com/
It should also be in your mailing list archive.

To make this easier to review and apply, I can send a new, small patch series 
that first introduces the FORCE_READ() macro in vm_util.h and then applies this refactoring. 
Please let me know if you'd prefer that.
Sorry again for the confusion.


Best regards,
wang lian


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-17 10:48   ` wang lian
@ 2025-07-17 11:43     ` David Hildenbrand
  2025-07-19  9:27       ` David Laight
  0 siblings, 1 reply; 9+ messages in thread
From: David Hildenbrand @ 2025-07-17 11:43 UTC (permalink / raw)
  To: wang lian, akpm
  Cc: Liam.Howlett, brauner, broonie, gkwang, jannh, linux-kernel,
	linux-mm, lorenzo.stoakes, ludovico.zy.wu, p1ucky0923, ryncsn,
	shuah, sj, vbabka, zijing.zhang, ziy

On 17.07.25 12:48, wang lian wrote:
>> On Wed, 16 Jul 2025 20:31:26 +0800 wang lian <lianux.mm@gmail.com> wrote:
> 
>>> 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
>>>
>>>   tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
>>>   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 +--
>>>   5 files changed, 24 insertions(+), 32 deletions(-)
> 
>> The patch forgot to move the FORCE_READ definition into a header?
> 
> Hi Andrew,
> You are absolutely right. My apologies for the inconvenience.
> This patch was sent standalone based on a suggestion from David during
> the discussion of a previous, larger patch series. In that original series,
> I had already moved the FORCE_READ() macro definition into vm_util.h.
> 
> You can find the original patch series and discussion at this link:
> https://lore.kernel.org/lkml/20250714130009.14581-1-lianux.mm@gmail.com/
> It should also be in your mailing list archive.
> 
> To make this easier to review and apply, I can send a new, small patch series
> that first introduces the FORCE_READ() macro in vm_util.h and then applies this refactoring.

Please simply perform the move of FORCE_READ() in this very patch where 
you also use it elswehere.

I missed that when skimming over this patch.

-- 
Cheers,

David / dhildenb



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-17 11:43     ` David Hildenbrand
@ 2025-07-19  9:27       ` David Laight
  2025-07-20  9:23         ` Lorenzo Stoakes
  0 siblings, 1 reply; 9+ messages in thread
From: David Laight @ 2025-07-19  9:27 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: wang lian, akpm, Liam.Howlett, brauner, broonie, gkwang, jannh,
	linux-kernel, linux-mm, lorenzo.stoakes, ludovico.zy.wu,
	p1ucky0923, ryncsn, shuah, sj, vbabka, zijing.zhang, ziy

On Thu, 17 Jul 2025 13:43:45 +0200
David Hildenbrand <david@redhat.com> wrote:

> On 17.07.25 12:48, wang lian wrote:
> >> On Wed, 16 Jul 2025 20:31:26 +0800 wang lian <lianux.mm@gmail.com> wrote:  
> >   
> >>> 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
> >>>
> >>>   tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
> >>>   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 +--
> >>>   5 files changed, 24 insertions(+), 32 deletions(-)  
> >   
> >> The patch forgot to move the FORCE_READ definition into a header?  
> > 
> > Hi Andrew,
> > You are absolutely right. My apologies for the inconvenience.
> > This patch was sent standalone based on a suggestion from David during
> > the discussion of a previous, larger patch series. In that original series,
> > I had already moved the FORCE_READ() macro definition into vm_util.h.
> > 
> > You can find the original patch series and discussion at this link:
> > https://lore.kernel.org/lkml/20250714130009.14581-1-lianux.mm@gmail.com/
> > It should also be in your mailing list archive.
> > 
> > To make this easier to review and apply, I can send a new, small patch series
> > that first introduces the FORCE_READ() macro in vm_util.h and then applies this refactoring.  
> 
> Please simply perform the move of FORCE_READ() in this very patch where 
> you also use it elswehere.

Why not use READ_ONCE() instead (or even just make all the variables 'volatile char *').
I had to look up the definition to find the hidden indirection in FORCE_READ().

It has to be said that now writes to variables that are READ_ONCE() have to be
WRITE_ONCE() why not just make the variables 'volatile'.
That will stop things bleating about missing READ/WRITE_ONCE() wrappers.
There was a rational for not using volatile, but it is getting to be moot.

	David


> 
> I missed that when skimming over this patch.
> 



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-19  9:27       ` David Laight
@ 2025-07-20  9:23         ` Lorenzo Stoakes
  2025-07-20 11:03           ` wang lian
  0 siblings, 1 reply; 9+ messages in thread
From: Lorenzo Stoakes @ 2025-07-20  9:23 UTC (permalink / raw)
  To: David Laight
  Cc: David Hildenbrand, wang lian, akpm, Liam.Howlett, brauner, gkwang,
	jannh, linux-kernel, linux-mm, ludovico.zy.wu, p1ucky0923, ryncsn,
	sj, vbabka, zijing.zhang, ziy, shuah, broonie

On Sat, Jul 19, 2025 at 10:27:38AM +0100, David Laight wrote:
> On Thu, 17 Jul 2025 13:43:45 +0200
> David Hildenbrand <david@redhat.com> wrote:
>
> > On 17.07.25 12:48, wang lian wrote:
> > >> On Wed, 16 Jul 2025 20:31:26 +0800 wang lian <lianux.mm@gmail.com> wrote:
> > >
> > >>> 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
> > >>>
> > >>>   tools/testing/selftests/mm/cow.c              | 30 +++++++++----------
> > >>>   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 +--
> > >>>   5 files changed, 24 insertions(+), 32 deletions(-)
> > >
> > >> The patch forgot to move the FORCE_READ definition into a header?
> > >
> > > Hi Andrew,
> > > You are absolutely right. My apologies for the inconvenience.
> > > This patch was sent standalone based on a suggestion from David during
> > > the discussion of a previous, larger patch series. In that original series,
> > > I had already moved the FORCE_READ() macro definition into vm_util.h.
> > >
> > > You can find the original patch series and discussion at this link:
> > > https://lore.kernel.org/lkml/20250714130009.14581-1-lianux.mm@gmail.com/
> > > It should also be in your mailing list archive.
> > >
> > > To make this easier to review and apply, I can send a new, small patch series
> > > that first introduces the FORCE_READ() macro in vm_util.h and then applies this refactoring.
> >
> > Please simply perform the move of FORCE_READ() in this very patch where
> > you also use it elswehere.
>
> Why not use READ_ONCE() instead (or even just make all the variables 'volatile char *').
> I had to look up the definition to find the hidden indirection in FORCE_READ().

Honestly this is an incredible level of nitpicking for a _self test_
patch.

I don't think you need to look up definitions to understand that volatile
prevents the compiler from optimising out a read like this. And what
exactly is hidden? We cast to the volatile type of the pointer, then deref
it in a fashion that cannot be optimised out?

But I mean, maybe I'm missing some complexity here? I am always happy to be
corrected :)

The point is to read fault a page for testing purposes.

This is fine, works, and it's _test code_.

Overall though, this discussion is not helpful and this is a moot point,
sorry.

>
> It has to be said that now writes to variables that are READ_ONCE() have to be
> WRITE_ONCE() why not just make the variables 'volatile'.
> That will stop things bleating about missing READ/WRITE_ONCE() wrappers.
> There was a rational for not using volatile, but it is getting to be moot.

I'm struggling to understand what on earth you're talking about here, what
would bleat about self test code missing READ/WRITE_ONCE() wrappers?

And you're suggesting going through and changing all pointers to be
volatile... because why? What? That'd be awful and very very silly.

Note that checkpatch.pl _will_ bleat about this.

TL;DR: No, absolutely not.

Wang - do not do anything like this, please!

>
> 	David
>
>
> >
> > I missed that when skimming over this patch.
> >
>

Let's all have some empathy for this being one of Wang's first patches. I
appreciate this patch and it's a strict improvement on the past situation
AFAIC.

Cheers, Lorenzo


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));"
  2025-07-20  9:23         ` Lorenzo Stoakes
@ 2025-07-20 11:03           ` wang lian
  0 siblings, 0 replies; 9+ messages in thread
From: wang lian @ 2025-07-20 11:03 UTC (permalink / raw)
  To: lorenzo.stoakes
  Cc: Liam.Howlett, akpm, brauner, broonie, david.laight.linux, david,
	gkwang, jannh, lianux.mm, linux-kernel, linux-mm, ludovico.zy.wu,
	p1ucky0923, ryncsn, shuah, sj, vbabka, zijing.zhang, ziy

> Wang - do not do anything like this, please!


> Let's all have some empathy for this being one of Wang's first patches. I
> appreciate this patch and it's a strict improvement on the past situation
> AFAIC.

> Cheers, Lorenzo

Hi Lorenzo,
Thank you so much for your kind words and support. I truly appreciate 
you stepping in to provide clarity and encouragement.

This discussion has been a great learning experience. It's support like yours 
that makes me feel so welcome and passionate about contributing to the kernel.

Please rest assured, I will follow the correct guidance. I am working on the 
updated process_madv patch now.

Thank you again for everything.
Best regards,
Wang Lian


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2025-07-20 11:03 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-07-16 12:31 [PATCH] selftests/mm: reuse FORCE_READ to replace "asm volatile("" : "+r" (XXX));" wang lian
2025-07-16 13:16 ` David Hildenbrand
2025-07-16 22:15 ` Andrew Morton
2025-07-17  6:58   ` Wei Yang
2025-07-17 10:48   ` wang lian
2025-07-17 11:43     ` David Hildenbrand
2025-07-19  9:27       ` David Laight
2025-07-20  9:23         ` Lorenzo Stoakes
2025-07-20 11:03           ` wang lian

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).