Message ID | 20240606203619.677276-1-kernel@pankajraghav.com (mailing list archive) |
---|---|
State | Accepted |
Commit | ecc1793b2d08efeb2d1795814d2ea350c9d6992b |
Headers | show |
Series | [v3] selftests/mm: use asm volatile to not optimize mmap read variable | expand |
On 6 Jun 2024, at 13:36, Pankaj Raghav (Samsung) wrote: > From: Pankaj Raghav <p.raghav@samsung.com> > > create_pagecache_thp_and_fd() in split_huge_page_test.c used the > variable dummy to perform mmap read. > > However, this test was skipped even on XFS which has large folio > support. The issue was compiler (gcc 13.2.0) was optimizing out the > dummy variable, therefore, not creating huge page in the page cache. > > Use asm volatile() trick to force the compiler not to optimize out > the loop where we read from the mmaped addr. This is similar to what is > being done in other tests (cow.c, etc) > > As the variable is now used in the asm statement, remove the unused > attribute. > > Signed-off-by: Pankaj Raghav <p.raghav@samsung.com> > --- > Changes since v2: > - Use the asm volatile trick to force the compiler to not optimize the > read into dummy variable. (David) > > tools/testing/selftests/mm/split_huge_page_test.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > LGTM. Reviewed-by: Zi Yan <ziy@nvidia.com> Best Regards, Yan, Zi
On 06.06.24 22:36, Pankaj Raghav (Samsung) wrote: > From: Pankaj Raghav <p.raghav@samsung.com> > > create_pagecache_thp_and_fd() in split_huge_page_test.c used the > variable dummy to perform mmap read. > > However, this test was skipped even on XFS which has large folio > support. The issue was compiler (gcc 13.2.0) was optimizing out the > dummy variable, therefore, not creating huge page in the page cache. > > Use asm volatile() trick to force the compiler not to optimize out > the loop where we read from the mmaped addr. This is similar to what is > being done in other tests (cow.c, etc) > > As the variable is now used in the asm statement, remove the unused > attribute. > > Signed-off-by: Pankaj Raghav <p.raghav@samsung.com> > --- > Changes since v2: > - Use the asm volatile trick to force the compiler to not optimize the > read into dummy variable. (David) > > tools/testing/selftests/mm/split_huge_page_test.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c > index d3c7f5fb3e7b..e5e8dafc9d94 100644 > --- a/tools/testing/selftests/mm/split_huge_page_test.c > +++ b/tools/testing/selftests/mm/split_huge_page_test.c > @@ -300,7 +300,7 @@ int create_pagecache_thp_and_fd(const char *testfile, size_t fd_size, int *fd, > char **addr) > { > size_t i; > - int __attribute__((unused)) dummy = 0; > + int dummy = 0; > > srand(time(NULL)); > > @@ -341,6 +341,7 @@ int create_pagecache_thp_and_fd(const char *testfile, size_t fd_size, int *fd, > > for (size_t i = 0; i < fd_size; i++) > dummy += *(*addr + i); > + asm volatile("" : "+r" (dummy)); > > 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"); > > base-commit: d97496ca23a2d4ee80b7302849404859d9058bcd Acked-by: David Hildenbrand <david@redhat.com> I was wondering if we should factor that out into a mm-selftest helper function, but that can be done later.
On Thu, 6 Jun 2024 20:36:19 +0000 "Pankaj Raghav (Samsung)" <kernel@pankajraghav.com> wrote: > From: Pankaj Raghav <p.raghav@samsung.com> > > create_pagecache_thp_and_fd() in split_huge_page_test.c used the > variable dummy to perform mmap read. > > However, this test was skipped even on XFS which has large folio > support. The issue was compiler (gcc 13.2.0) was optimizing out the > dummy variable, therefore, not creating huge page in the page cache. > > Use asm volatile() trick to force the compiler not to optimize out > the loop where we read from the mmaped addr. This is similar to what is > being done in other tests (cow.c, etc) > > As the variable is now used in the asm statement, remove the unused > attribute. > What are the runtime effects of this change? An inappropriate test failure? If so, shouldn't we fix 6.9.x kernels also? And is fc4d182316bd ("mm: huge_memory: enable debugfs to split huge pages to any order") an appropriate Fixes: target?
On Fri, Jun 07, 2024 at 09:39:36PM -0700, Andrew Morton wrote: > On Thu, 6 Jun 2024 20:36:19 +0000 "Pankaj Raghav (Samsung)" <kernel@pankajraghav.com> wrote: > > > From: Pankaj Raghav <p.raghav@samsung.com> > > > > create_pagecache_thp_and_fd() in split_huge_page_test.c used the > > variable dummy to perform mmap read. > > > > However, this test was skipped even on XFS which has large folio > > support. The issue was compiler (gcc 13.2.0) was optimizing out the > > dummy variable, therefore, not creating huge page in the page cache. > > > > Use asm volatile() trick to force the compiler not to optimize out > > the loop where we read from the mmaped addr. This is similar to what is > > being done in other tests (cow.c, etc) > > > > As the variable is now used in the asm statement, remove the unused > > attribute. > > > > What are the runtime effects of this change? An inappropriate test > failure? If so, shouldn't we fix 6.9.x kernels also? And is > fc4d182316bd ("mm: huge_memory: enable debugfs to split huge pages to > any order") an appropriate Fixes: target? I mentioned it here in the commit message: However, this test was skipped even on XFS which has large folio support. So the test just skip these cases and does not fail. That is why I didn't use the Fixes tag. Let me know if it needs one. -- Pankaj
diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c index d3c7f5fb3e7b..e5e8dafc9d94 100644 --- a/tools/testing/selftests/mm/split_huge_page_test.c +++ b/tools/testing/selftests/mm/split_huge_page_test.c @@ -300,7 +300,7 @@ int create_pagecache_thp_and_fd(const char *testfile, size_t fd_size, int *fd, char **addr) { size_t i; - int __attribute__((unused)) dummy = 0; + int dummy = 0; srand(time(NULL)); @@ -341,6 +341,7 @@ int create_pagecache_thp_and_fd(const char *testfile, size_t fd_size, int *fd, for (size_t i = 0; i < fd_size; i++) dummy += *(*addr + i); + asm volatile("" : "+r" (dummy)); 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");