Hi Aneesh, On Fri, Feb 11, 2022 at 05:22:13PM +0530, Aneesh Kumar K V wrote: > On 2/11/22 16:03, Mike Rapoport wrote: > > On Fri, Feb 11, 2022 at 12:03:28PM +0530, Aneesh Kumar K.V wrote: > > > Keep it simple by using a #define and limiting hugepage size to 2M. > > > This keeps the test simpler instead of dynamically finding the page size > > > and huge page size. > > > > > > Without this tests are broken w.r.t reading /proc/self/pagemap > > > > > > if (pread(pagemap_fd, ent, sizeof(ent), > > > (uintptr_t)ptr >> (PAGE_SHIFT - 3)) != sizeof(ent)) > > > err(2, "read pagemap"); > > > > > > Cc: Shuah Khan <sh...@kernel.org> > > > Cc: linux-kselft...@vger.kernel.org > > > Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com> > > > --- > > > tools/testing/selftests/vm/ksm_tests.c | 9 ++++++++- > > > tools/testing/selftests/vm/transhuge-stress.c | 9 ++++++++- > > > 2 files changed, 16 insertions(+), 2 deletions(-) > > > > > > diff --git a/tools/testing/selftests/vm/ksm_tests.c > > > b/tools/testing/selftests/vm/ksm_tests.c > > > index 1436e1a9a3d3..cae72872152b 100644 > > > --- a/tools/testing/selftests/vm/ksm_tests.c > > > +++ b/tools/testing/selftests/vm/ksm_tests.c > > > @@ -22,7 +22,14 @@ > > > #define KSM_MERGE_ACROSS_NODES_DEFAULT true > > > #define MB (1ul << 20) > > > -#define PAGE_SHIFT 12 > > > +#ifdef __powerpc64__ > > > +#define PAGE_SHIFT 16 > > > +#else > > > +#define PAGE_SHIFT 12 > > > +#endif > > > > Page size can be other than 4096 for other configurations as well. And even > > on ppc64 it's not necessarily 64k. > > > > But most common test config is with 64K page size. > > > Ideally page size in selftests/vm should be sysconf(_SC_PAGESIZE) > > > yes. As explained in commit message, the idea was to keep it simpler.
I think it's simple enough (compile tested on x86 only): >From 219577d87041f19f2c00dc7c23e0fd5aad8b02d5 Mon Sep 17 00:00:00 2001 From: Mike Rapoport <r...@linux.ibm.com> Date: Fri, 11 Feb 2022 15:24:13 +0200 Subject: [PATCH] selftest/vm: add helpers to detect PAGE_SIZE and PAGE_SHIFT PAGE_SIZE is not 4096 in many configurations, particularily ppc64 uses 64K pages in majority of cases. Add helpers to detect PAGE_SIZE and PAGE_SHIFT dynamically. Signed-off-by: Mike Rapoport <r...@linux.ibm.com> --- tools/testing/selftests/vm/gup_test.c | 3 +- tools/testing/selftests/vm/ksm_tests.c | 8 +---- tools/testing/selftests/vm/transhuge-stress.c | 9 ++---- tools/testing/selftests/vm/util.h | 29 +++++++++++++++++++ 4 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 tools/testing/selftests/vm/util.h diff --git a/tools/testing/selftests/vm/gup_test.c b/tools/testing/selftests/vm/gup_test.c index fe043f67798b..cda837a14736 100644 --- a/tools/testing/selftests/vm/gup_test.c +++ b/tools/testing/selftests/vm/gup_test.c @@ -10,8 +10,9 @@ #include <assert.h> #include "../../../../mm/gup_test.h" +#include "util.h" + #define MB (1UL << 20) -#define PAGE_SIZE sysconf(_SC_PAGESIZE) /* Just the flags we need, copied from mm.h: */ #define FOLL_WRITE 0x01 /* check pte is writable */ diff --git a/tools/testing/selftests/vm/ksm_tests.c b/tools/testing/selftests/vm/ksm_tests.c index cae72872152b..7faafd24446f 100644 --- a/tools/testing/selftests/vm/ksm_tests.c +++ b/tools/testing/selftests/vm/ksm_tests.c @@ -12,6 +12,7 @@ #include "../kselftest.h" #include "../../../../include/vdso/time64.h" +#include "util.h" #define KSM_SYSFS_PATH "/sys/kernel/mm/ksm/" #define KSM_FP(s) (KSM_SYSFS_PATH s) @@ -22,17 +23,10 @@ #define KSM_MERGE_ACROSS_NODES_DEFAULT true #define MB (1ul << 20) -#ifdef __powerpc64__ -#define PAGE_SHIFT 16 -#else -#define PAGE_SHIFT 12 -#endif /* * On ppc64 this will only work with radix 2M hugepage size */ #define HPAGE_SHIFT 21 - -#define PAGE_SIZE (1 << PAGE_SHIFT) #define HPAGE_SIZE (1 << HPAGE_SHIFT) #define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) diff --git a/tools/testing/selftests/vm/transhuge-stress.c b/tools/testing/selftests/vm/transhuge-stress.c index b1f8d98355c5..baf90a745d28 100644 --- a/tools/testing/selftests/vm/transhuge-stress.c +++ b/tools/testing/selftests/vm/transhuge-stress.c @@ -16,17 +16,12 @@ #include <string.h> #include <sys/mman.h> -#ifdef __powerpc64__ -#define PAGE_SHIFT 16 -#else -#define PAGE_SHIFT 12 -#endif +#include "util.h" + /* * On ppc64 this will only work with radix 2M hugepage size */ #define HPAGE_SHIFT 21 - -#define PAGE_SIZE (1 << PAGE_SHIFT) #define HPAGE_SIZE (1 << HPAGE_SHIFT) #define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) diff --git a/tools/testing/selftests/vm/util.h b/tools/testing/selftests/vm/util.h new file mode 100644 index 000000000000..1c85d7583bac --- /dev/null +++ b/tools/testing/selftests/vm/util.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __KSELFTEST_VM_UTIL_H +#define __KSELFTEST_VM_UTIL_H + +#include <string.h> /* ffsl() */ +#include <unistd.h> /* _SC_PAGESIZE */ + +static unsigned __page_size; +static unsigned __page_shift; + +static inline unsigned page_size(void) +{ + if (!__page_size) + __page_size = sysconf(_SC_PAGESIZE); + return __page_size; +} + +static inline unsigned page_shift(void) +{ + if (!__page_shift) + __page_shift = (ffsl(page_size()) - 1); + return __page_shift; +} + +#define PAGE_SHIFT (page_shift()) +#define PAGE_SIZE (page_size()) + +#endif /* __KSELFTEST_VM_UTIL_H */ -- 2.34.1 -- Sincerely yours, Mike.