Message ID | 20220211063330.99648-1-aneesh.kumar@linux.ibm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2,1/2] selftest/vm: Use correct PAGE_SHIFT value for ppc64 | expand |
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 <shuah@kernel.org> > Cc: linux-kselftest@vger.kernel.org > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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. Ideally page size in selftests/vm should be sysconf(_SC_PAGESIZE) > +/* > + * On ppc64 this will only work with radix 2M hugepage size > + */ > #define HPAGE_SHIFT 21 > > #define PAGE_SIZE (1 << PAGE_SHIFT) > diff --git a/tools/testing/selftests/vm/transhuge-stress.c b/tools/testing/selftests/vm/transhuge-stress.c > index 5e4c036f6ad3..b1f8d98355c5 100644 > --- a/tools/testing/selftests/vm/transhuge-stress.c > +++ b/tools/testing/selftests/vm/transhuge-stress.c > @@ -16,7 +16,14 @@ > #include <string.h> > #include <sys/mman.h> > > -#define PAGE_SHIFT 12 > +#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) > -- > 2.34.1 > >
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 <shuah@kernel.org> >> Cc: linux-kselftest@vger.kernel.org >> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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. "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" We can definitely look at updating multiple tests in selftest/vm to work with dynamic value of pagesize and huagepage size. But that can be outside this patch? > >> +/* >> + * On ppc64 this will only work with radix 2M hugepage size >> + */ >> #define HPAGE_SHIFT 21 >> >> #define PAGE_SIZE (1 << PAGE_SHIFT) >> diff --git a/tools/testing/selftests/vm/transhuge-stress.c b/tools/testing/selftests/vm/transhuge-stress.c >> index 5e4c036f6ad3..b1f8d98355c5 100644 >> --- a/tools/testing/selftests/vm/transhuge-stress.c >> +++ b/tools/testing/selftests/vm/transhuge-stress.c >> @@ -16,7 +16,14 @@ >> #include <string.h> >> #include <sys/mman.h> >> >> -#define PAGE_SHIFT 12 >> +#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) >> -- >> 2.34.1 >> >> >
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 <shuah@kernel.org> > > > Cc: linux-kselftest@vger.kernel.org > > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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 <rppt@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 <rppt@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 */
On 2/11/22 18:58, Mike Rapoport wrote: > 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 <shuah@kernel.org> >>>> Cc: linux-kselftest@vger.kernel.org >>>> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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 <rppt@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 <rppt@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 */ This is on top of patch 1 I sent i guess. Should I add it to the series because v2 also consolidate allocate_transhuge()? Or do you want to sent it as an independent patch? -aneesh
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 +/* + * On ppc64 this will only work with radix 2M hugepage size + */ #define HPAGE_SHIFT 21 #define PAGE_SIZE (1 << PAGE_SHIFT) diff --git a/tools/testing/selftests/vm/transhuge-stress.c b/tools/testing/selftests/vm/transhuge-stress.c index 5e4c036f6ad3..b1f8d98355c5 100644 --- a/tools/testing/selftests/vm/transhuge-stress.c +++ b/tools/testing/selftests/vm/transhuge-stress.c @@ -16,7 +16,14 @@ #include <string.h> #include <sys/mman.h> -#define PAGE_SHIFT 12 +#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)
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 <shuah@kernel.org> Cc: linux-kselftest@vger.kernel.org Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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(-)