Message ID | 20230330160649.3106916-1-peterx@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | selftests/mm: Split / Refactor userfault test | expand |
On Thu, Mar 30, 2023 at 9:07 AM Peter Xu <peterx@redhat.com> wrote: > > There're two util headers under mm/ kselftest. Merge one with another. It > turns out util.h is the easy one to move. > > When merging, drop PAGE_SIZE / PAGE_SHIFT because they're unnecessary > wrappers to page_size() / page_shift(), meanwhile rename them to psize() > and pshift() so as to not conflict with some existing definitions in some > test files that includes vm_util.h. > > Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Axel Rasmussen <axelrasmussen@google.com> > --- > tools/testing/selftests/mm/Makefile | 4 ++ > tools/testing/selftests/mm/gup_test.c | 5 +- > tools/testing/selftests/mm/ksm_tests.c | 2 +- > tools/testing/selftests/mm/mrelease_test.c | 11 ++- > tools/testing/selftests/mm/transhuge-stress.c | 12 ++-- > tools/testing/selftests/mm/util.h | 69 ------------------- > tools/testing/selftests/mm/vm_util.c | 31 +++++++++ > tools/testing/selftests/mm/vm_util.h | 31 +++++++++ > 8 files changed, 80 insertions(+), 85 deletions(-) > delete mode 100644 tools/testing/selftests/mm/util.h > > diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile > index fbf5646b1072..4188435967ed 100644 > --- a/tools/testing/selftests/mm/Makefile > +++ b/tools/testing/selftests/mm/Makefile > @@ -111,6 +111,10 @@ $(OUTPUT)/madv_populate: vm_util.c > $(OUTPUT)/soft-dirty: vm_util.c > $(OUTPUT)/split_huge_page_test: vm_util.c > $(OUTPUT)/userfaultfd: vm_util.c > +$(OUTPUT)/gup_test: vm_util.c > +$(OUTPUT)/mrelease_test: vm_util.c > +$(OUTPUT)/transhuge-stress: vm_util.c > +$(OUTPUT)/ksm_tests: vm_util.c > > ifeq ($(MACHINE),x86_64) > BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32)) > diff --git a/tools/testing/selftests/mm/gup_test.c b/tools/testing/selftests/mm/gup_test.c > index e43879291dac..ec2229136384 100644 > --- a/tools/testing/selftests/mm/gup_test.c > +++ b/tools/testing/selftests/mm/gup_test.c > @@ -12,8 +12,7 @@ > #include <assert.h> > #include <mm/gup_test.h> > #include "../kselftest.h" > - > -#include "util.h" > +#include "vm_util.h" > > #define MB (1UL << 20) > > @@ -251,7 +250,7 @@ int main(int argc, char **argv) > if (touch) { > gup.gup_flags |= FOLL_TOUCH; > } else { > - for (; (unsigned long)p < gup.addr + size; p += PAGE_SIZE) > + for (; (unsigned long)p < gup.addr + size; p += psize()) > p[0] = 0; > } > > diff --git a/tools/testing/selftests/mm/ksm_tests.c b/tools/testing/selftests/mm/ksm_tests.c > index 9fb21b982dc9..85a49aea3ab8 100644 > --- a/tools/testing/selftests/mm/ksm_tests.c > +++ b/tools/testing/selftests/mm/ksm_tests.c > @@ -14,7 +14,7 @@ > > #include "../kselftest.h" > #include <include/vdso/time64.h> > -#include "util.h" > +#include "vm_util.h" > > #define KSM_SYSFS_PATH "/sys/kernel/mm/ksm/" > #define KSM_FP(s) (KSM_SYSFS_PATH s) > diff --git a/tools/testing/selftests/mm/mrelease_test.c b/tools/testing/selftests/mm/mrelease_test.c > index 6c62966ab5db..37b6d33b9e84 100644 > --- a/tools/testing/selftests/mm/mrelease_test.c > +++ b/tools/testing/selftests/mm/mrelease_test.c > @@ -9,8 +9,7 @@ > #include <stdlib.h> > #include <sys/wait.h> > #include <unistd.h> > - > -#include "util.h" > +#include "vm_util.h" > > #include "../kselftest.h" > > @@ -32,7 +31,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) > unsigned long i; > char *buf; > > - buf = (char *)mmap(NULL, nr_pages * PAGE_SIZE, PROT_READ | PROT_WRITE, > + buf = (char *)mmap(NULL, nr_pages * psize(), PROT_READ | PROT_WRITE, > MAP_PRIVATE | MAP_ANON, 0, 0); > if (buf == MAP_FAILED) { > perror("mmap failed, halting the test"); > @@ -40,7 +39,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) > } > > for (i = 0; i < nr_pages; i++) > - *((unsigned long *)(buf + (i * PAGE_SIZE))) = i; > + *((unsigned long *)(buf + (i * psize()))) = i; > > /* Signal the parent that the child is ready */ > if (write(pipefd, "", 1) < 0) { > @@ -54,7 +53,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) > timeout--; > } > > - munmap(buf, nr_pages * PAGE_SIZE); > + munmap(buf, nr_pages * psize()); > > return (timeout > 0) ? KSFT_PASS : KSFT_FAIL; > } > @@ -87,7 +86,7 @@ static int child_main(int pipefd[], size_t size) > > /* Allocate and fault-in memory and wait to be killed */ > close(pipefd[0]); > - res = alloc_noexit(MB(size) / PAGE_SIZE, pipefd[1]); > + res = alloc_noexit(MB(size) / psize(), pipefd[1]); > close(pipefd[1]); > return res; > } > diff --git a/tools/testing/selftests/mm/transhuge-stress.c b/tools/testing/selftests/mm/transhuge-stress.c > index e3f00adb1b82..ba9d37ad3a89 100644 > --- a/tools/testing/selftests/mm/transhuge-stress.c > +++ b/tools/testing/selftests/mm/transhuge-stress.c > @@ -15,7 +15,7 @@ > #include <fcntl.h> > #include <string.h> > #include <sys/mman.h> > -#include "util.h" > +#include "vm_util.h" > > int backing_fd = -1; > int mmap_flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE; > @@ -34,10 +34,10 @@ int main(int argc, char **argv) > int pagemap_fd; > > ram = sysconf(_SC_PHYS_PAGES); > - if (ram > SIZE_MAX / sysconf(_SC_PAGESIZE) / 4) > + if (ram > SIZE_MAX / psize() / 4) > ram = SIZE_MAX / 4; > else > - ram *= sysconf(_SC_PAGESIZE); > + ram *= psize(); > len = ram; > > while (++i < argc) { > @@ -58,7 +58,7 @@ int main(int argc, char **argv) > > warnx("allocate %zd transhuge pages, using %zd MiB virtual memory" > " and %zd MiB of ram", len >> HPAGE_SHIFT, len >> 20, > - ram >> (20 + HPAGE_SHIFT - PAGE_SHIFT - 1)); > + ram >> (20 + HPAGE_SHIFT - pshift() - 1)); > > pagemap_fd = open("/proc/self/pagemap", O_RDONLY); > if (pagemap_fd < 0) > @@ -92,7 +92,7 @@ int main(int argc, char **argv) > if (pfn < 0) { > nr_failed++; > } else { > - size_t idx = pfn >> (HPAGE_SHIFT - PAGE_SHIFT); > + size_t idx = pfn >> (HPAGE_SHIFT - pshift()); > > nr_succeed++; > if (idx >= map_len) { > @@ -108,7 +108,7 @@ int main(int argc, char **argv) > } > > /* split transhuge page, keep last page */ > - if (madvise(p, HPAGE_SIZE - PAGE_SIZE, MADV_DONTNEED)) > + if (madvise(p, HPAGE_SIZE - psize(), MADV_DONTNEED)) > err(2, "MADV_DONTNEED"); > } > clock_gettime(CLOCK_MONOTONIC, &b); > diff --git a/tools/testing/selftests/mm/util.h b/tools/testing/selftests/mm/util.h > deleted file mode 100644 > index b27d26199334..000000000000 > --- a/tools/testing/selftests/mm/util.h > +++ /dev/null > @@ -1,69 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0 */ > - > -#ifndef __KSELFTEST_VM_UTIL_H > -#define __KSELFTEST_VM_UTIL_H > - > -#include <stdint.h> > -#include <sys/mman.h> > -#include <err.h> > -#include <string.h> /* ffsl() */ > -#include <unistd.h> /* _SC_PAGESIZE */ > - > -static unsigned int __page_size; > -static unsigned int __page_shift; > - > -static inline unsigned int page_size(void) > -{ > - if (!__page_size) > - __page_size = sysconf(_SC_PAGESIZE); > - return __page_size; > -} > - > -static inline unsigned int 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()) > -/* > - * On ppc64 this will only work with radix 2M hugepage size > - */ > -#define HPAGE_SHIFT 21 > -#define HPAGE_SIZE (1 << HPAGE_SHIFT) > - > -#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) > -#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1)) > - > - > -static inline int64_t allocate_transhuge(void *ptr, int pagemap_fd) > -{ > - uint64_t ent[2]; > - > - /* drop pmd */ > - if (mmap(ptr, HPAGE_SIZE, PROT_READ | PROT_WRITE, > - MAP_FIXED | MAP_ANONYMOUS | > - MAP_NORESERVE | MAP_PRIVATE, -1, 0) != ptr) > - errx(2, "mmap transhuge"); > - > - if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE)) > - err(2, "MADV_HUGEPAGE"); > - > - /* allocate transparent huge page */ > - *(volatile void **)ptr = ptr; > - > - if (pread(pagemap_fd, ent, sizeof(ent), > - (uintptr_t)ptr >> (PAGE_SHIFT - 3)) != sizeof(ent)) > - err(2, "read pagemap"); > - > - if (PAGEMAP_PRESENT(ent[0]) && PAGEMAP_PRESENT(ent[1]) && > - PAGEMAP_PFN(ent[0]) + 1 == PAGEMAP_PFN(ent[1]) && > - !(PAGEMAP_PFN(ent[0]) & ((1 << (HPAGE_SHIFT - PAGE_SHIFT)) - 1))) > - return PAGEMAP_PFN(ent[0]); > - > - return -1; > -} > - > -#endif > diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c > index 40e795624ff3..0204c469be43 100644 > --- a/tools/testing/selftests/mm/vm_util.c > +++ b/tools/testing/selftests/mm/vm_util.c > @@ -8,6 +8,9 @@ > #define SMAP_FILE_PATH "/proc/self/smaps" > #define MAX_LINE_LENGTH 500 > > +unsigned int __page_size; > +unsigned int __page_shift; > + > uint64_t pagemap_get_entry(int fd, char *start) > { > const unsigned long pfn = (unsigned long)start / getpagesize(); > @@ -149,3 +152,31 @@ bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size) > { > return __check_huge(addr, "ShmemPmdMapped:", nr_hpages, hpage_size); > } > + > +int64_t allocate_transhuge(void *ptr, int pagemap_fd) > +{ > + uint64_t ent[2]; > + > + /* drop pmd */ > + if (mmap(ptr, HPAGE_SIZE, PROT_READ | PROT_WRITE, > + MAP_FIXED | MAP_ANONYMOUS | > + MAP_NORESERVE | MAP_PRIVATE, -1, 0) != ptr) > + errx(2, "mmap transhuge"); > + > + if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE)) > + err(2, "MADV_HUGEPAGE"); > + > + /* allocate transparent huge page */ > + *(volatile void **)ptr = ptr; > + > + if (pread(pagemap_fd, ent, sizeof(ent), > + (uintptr_t)ptr >> (pshift() - 3)) != sizeof(ent)) > + err(2, "read pagemap"); > + > + if (PAGEMAP_PRESENT(ent[0]) && PAGEMAP_PRESENT(ent[1]) && > + PAGEMAP_PFN(ent[0]) + 1 == PAGEMAP_PFN(ent[1]) && > + !(PAGEMAP_PFN(ent[0]) & ((1 << (HPAGE_SHIFT - pshift())) - 1))) > + return PAGEMAP_PFN(ent[0]); > + > + return -1; > +} > diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h > index 1995ee911ef2..6edeb531afc6 100644 > --- a/tools/testing/selftests/mm/vm_util.h > +++ b/tools/testing/selftests/mm/vm_util.h > @@ -1,6 +1,27 @@ > /* SPDX-License-Identifier: GPL-2.0 */ > #include <stdint.h> > #include <stdbool.h> > +#include <sys/mman.h> > +#include <err.h> > +#include <string.h> /* ffsl() */ > +#include <unistd.h> /* _SC_PAGESIZE */ > + > +extern unsigned int __page_size; > +extern unsigned int __page_shift; > + > +static inline unsigned int psize(void) > +{ > + if (!__page_size) > + __page_size = sysconf(_SC_PAGESIZE); > + return __page_size; > +} > + > +static inline unsigned int pshift(void) > +{ > + if (!__page_shift) > + __page_shift = (ffsl(psize()) - 1); > + return __page_shift; > +} > > uint64_t pagemap_get_entry(int fd, char *start); > bool pagemap_is_softdirty(int fd, char *start); > @@ -13,3 +34,13 @@ uint64_t read_pmd_pagesize(void); > bool check_huge_anon(void *addr, int nr_hpages, uint64_t hpage_size); > bool check_huge_file(void *addr, int nr_hpages, uint64_t hpage_size); > bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size); > +int64_t allocate_transhuge(void *ptr, int pagemap_fd); > + > +/* > + * On ppc64 this will only work with radix 2M hugepage size > + */ > +#define HPAGE_SHIFT 21 > +#define HPAGE_SIZE (1 << HPAGE_SHIFT) > + > +#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) > +#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1)) > -- > 2.39.1 >
On 30.03.23 18:06, Peter Xu wrote: > There're two util headers under mm/ kselftest. Merge one with another. It > turns out util.h is the easy one to move. > > When merging, drop PAGE_SIZE / PAGE_SHIFT because they're unnecessary > wrappers to page_size() / page_shift(), meanwhile rename them to psize() > and pshift() so as to not conflict with some existing definitions in some > test files that includes vm_util.h. > > Signed-off-by: Peter Xu <peterx@redhat.com> > --- Reviewed-by: David Hildenbrand <david@redhat.com>
On Thu, Mar 30, 2023 at 12:06:49PM -0400, Peter Xu wrote: > There're two util headers under mm/ kselftest. Merge one with another. It > turns out util.h is the easy one to move. > > When merging, drop PAGE_SIZE / PAGE_SHIFT because they're unnecessary > wrappers to page_size() / page_shift(), meanwhile rename them to psize() > and pshift() so as to not conflict with some existing definitions in some > test files that includes vm_util.h. For me this sounds like two patches, but it's not really important with diffstat that small. > Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org> > --- > tools/testing/selftests/mm/Makefile | 4 ++ > tools/testing/selftests/mm/gup_test.c | 5 +- > tools/testing/selftests/mm/ksm_tests.c | 2 +- > tools/testing/selftests/mm/mrelease_test.c | 11 ++- > tools/testing/selftests/mm/transhuge-stress.c | 12 ++-- > tools/testing/selftests/mm/util.h | 69 ------------------- > tools/testing/selftests/mm/vm_util.c | 31 +++++++++ > tools/testing/selftests/mm/vm_util.h | 31 +++++++++ > 8 files changed, 80 insertions(+), 85 deletions(-) > delete mode 100644 tools/testing/selftests/mm/util.h > > diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile > index fbf5646b1072..4188435967ed 100644 > --- a/tools/testing/selftests/mm/Makefile > +++ b/tools/testing/selftests/mm/Makefile > @@ -111,6 +111,10 @@ $(OUTPUT)/madv_populate: vm_util.c > $(OUTPUT)/soft-dirty: vm_util.c > $(OUTPUT)/split_huge_page_test: vm_util.c > $(OUTPUT)/userfaultfd: vm_util.c > +$(OUTPUT)/gup_test: vm_util.c > +$(OUTPUT)/mrelease_test: vm_util.c > +$(OUTPUT)/transhuge-stress: vm_util.c > +$(OUTPUT)/ksm_tests: vm_util.c > > ifeq ($(MACHINE),x86_64) > BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32)) > diff --git a/tools/testing/selftests/mm/gup_test.c b/tools/testing/selftests/mm/gup_test.c > index e43879291dac..ec2229136384 100644 > --- a/tools/testing/selftests/mm/gup_test.c > +++ b/tools/testing/selftests/mm/gup_test.c > @@ -12,8 +12,7 @@ > #include <assert.h> > #include <mm/gup_test.h> > #include "../kselftest.h" > - > -#include "util.h" > +#include "vm_util.h" > > #define MB (1UL << 20) > > @@ -251,7 +250,7 @@ int main(int argc, char **argv) > if (touch) { > gup.gup_flags |= FOLL_TOUCH; > } else { > - for (; (unsigned long)p < gup.addr + size; p += PAGE_SIZE) > + for (; (unsigned long)p < gup.addr + size; p += psize()) > p[0] = 0; > } > > diff --git a/tools/testing/selftests/mm/ksm_tests.c b/tools/testing/selftests/mm/ksm_tests.c > index 9fb21b982dc9..85a49aea3ab8 100644 > --- a/tools/testing/selftests/mm/ksm_tests.c > +++ b/tools/testing/selftests/mm/ksm_tests.c > @@ -14,7 +14,7 @@ > > #include "../kselftest.h" > #include <include/vdso/time64.h> > -#include "util.h" > +#include "vm_util.h" > > #define KSM_SYSFS_PATH "/sys/kernel/mm/ksm/" > #define KSM_FP(s) (KSM_SYSFS_PATH s) > diff --git a/tools/testing/selftests/mm/mrelease_test.c b/tools/testing/selftests/mm/mrelease_test.c > index 6c62966ab5db..37b6d33b9e84 100644 > --- a/tools/testing/selftests/mm/mrelease_test.c > +++ b/tools/testing/selftests/mm/mrelease_test.c > @@ -9,8 +9,7 @@ > #include <stdlib.h> > #include <sys/wait.h> > #include <unistd.h> > - > -#include "util.h" > +#include "vm_util.h" > > #include "../kselftest.h" > > @@ -32,7 +31,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) > unsigned long i; > char *buf; > > - buf = (char *)mmap(NULL, nr_pages * PAGE_SIZE, PROT_READ | PROT_WRITE, > + buf = (char *)mmap(NULL, nr_pages * psize(), PROT_READ | PROT_WRITE, > MAP_PRIVATE | MAP_ANON, 0, 0); > if (buf == MAP_FAILED) { > perror("mmap failed, halting the test"); > @@ -40,7 +39,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) > } > > for (i = 0; i < nr_pages; i++) > - *((unsigned long *)(buf + (i * PAGE_SIZE))) = i; > + *((unsigned long *)(buf + (i * psize()))) = i; > > /* Signal the parent that the child is ready */ > if (write(pipefd, "", 1) < 0) { > @@ -54,7 +53,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) > timeout--; > } > > - munmap(buf, nr_pages * PAGE_SIZE); > + munmap(buf, nr_pages * psize()); > > return (timeout > 0) ? KSFT_PASS : KSFT_FAIL; > } > @@ -87,7 +86,7 @@ static int child_main(int pipefd[], size_t size) > > /* Allocate and fault-in memory and wait to be killed */ > close(pipefd[0]); > - res = alloc_noexit(MB(size) / PAGE_SIZE, pipefd[1]); > + res = alloc_noexit(MB(size) / psize(), pipefd[1]); > close(pipefd[1]); > return res; > } > diff --git a/tools/testing/selftests/mm/transhuge-stress.c b/tools/testing/selftests/mm/transhuge-stress.c > index e3f00adb1b82..ba9d37ad3a89 100644 > --- a/tools/testing/selftests/mm/transhuge-stress.c > +++ b/tools/testing/selftests/mm/transhuge-stress.c > @@ -15,7 +15,7 @@ > #include <fcntl.h> > #include <string.h> > #include <sys/mman.h> > -#include "util.h" > +#include "vm_util.h" > > int backing_fd = -1; > int mmap_flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE; > @@ -34,10 +34,10 @@ int main(int argc, char **argv) > int pagemap_fd; > > ram = sysconf(_SC_PHYS_PAGES); > - if (ram > SIZE_MAX / sysconf(_SC_PAGESIZE) / 4) > + if (ram > SIZE_MAX / psize() / 4) > ram = SIZE_MAX / 4; > else > - ram *= sysconf(_SC_PAGESIZE); > + ram *= psize(); > len = ram; > > while (++i < argc) { > @@ -58,7 +58,7 @@ int main(int argc, char **argv) > > warnx("allocate %zd transhuge pages, using %zd MiB virtual memory" > " and %zd MiB of ram", len >> HPAGE_SHIFT, len >> 20, > - ram >> (20 + HPAGE_SHIFT - PAGE_SHIFT - 1)); > + ram >> (20 + HPAGE_SHIFT - pshift() - 1)); > > pagemap_fd = open("/proc/self/pagemap", O_RDONLY); > if (pagemap_fd < 0) > @@ -92,7 +92,7 @@ int main(int argc, char **argv) > if (pfn < 0) { > nr_failed++; > } else { > - size_t idx = pfn >> (HPAGE_SHIFT - PAGE_SHIFT); > + size_t idx = pfn >> (HPAGE_SHIFT - pshift()); > > nr_succeed++; > if (idx >= map_len) { > @@ -108,7 +108,7 @@ int main(int argc, char **argv) > } > > /* split transhuge page, keep last page */ > - if (madvise(p, HPAGE_SIZE - PAGE_SIZE, MADV_DONTNEED)) > + if (madvise(p, HPAGE_SIZE - psize(), MADV_DONTNEED)) > err(2, "MADV_DONTNEED"); > } > clock_gettime(CLOCK_MONOTONIC, &b); > diff --git a/tools/testing/selftests/mm/util.h b/tools/testing/selftests/mm/util.h > deleted file mode 100644 > index b27d26199334..000000000000 > --- a/tools/testing/selftests/mm/util.h > +++ /dev/null > @@ -1,69 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0 */ > - > -#ifndef __KSELFTEST_VM_UTIL_H > -#define __KSELFTEST_VM_UTIL_H > - > -#include <stdint.h> > -#include <sys/mman.h> > -#include <err.h> > -#include <string.h> /* ffsl() */ > -#include <unistd.h> /* _SC_PAGESIZE */ > - > -static unsigned int __page_size; > -static unsigned int __page_shift; > - > -static inline unsigned int page_size(void) > -{ > - if (!__page_size) > - __page_size = sysconf(_SC_PAGESIZE); > - return __page_size; > -} > - > -static inline unsigned int 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()) > -/* > - * On ppc64 this will only work with radix 2M hugepage size > - */ > -#define HPAGE_SHIFT 21 > -#define HPAGE_SIZE (1 << HPAGE_SHIFT) > - > -#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) > -#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1)) > - > - > -static inline int64_t allocate_transhuge(void *ptr, int pagemap_fd) > -{ > - uint64_t ent[2]; > - > - /* drop pmd */ > - if (mmap(ptr, HPAGE_SIZE, PROT_READ | PROT_WRITE, > - MAP_FIXED | MAP_ANONYMOUS | > - MAP_NORESERVE | MAP_PRIVATE, -1, 0) != ptr) > - errx(2, "mmap transhuge"); > - > - if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE)) > - err(2, "MADV_HUGEPAGE"); > - > - /* allocate transparent huge page */ > - *(volatile void **)ptr = ptr; > - > - if (pread(pagemap_fd, ent, sizeof(ent), > - (uintptr_t)ptr >> (PAGE_SHIFT - 3)) != sizeof(ent)) > - err(2, "read pagemap"); > - > - if (PAGEMAP_PRESENT(ent[0]) && PAGEMAP_PRESENT(ent[1]) && > - PAGEMAP_PFN(ent[0]) + 1 == PAGEMAP_PFN(ent[1]) && > - !(PAGEMAP_PFN(ent[0]) & ((1 << (HPAGE_SHIFT - PAGE_SHIFT)) - 1))) > - return PAGEMAP_PFN(ent[0]); > - > - return -1; > -} > - > -#endif > diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c > index 40e795624ff3..0204c469be43 100644 > --- a/tools/testing/selftests/mm/vm_util.c > +++ b/tools/testing/selftests/mm/vm_util.c > @@ -8,6 +8,9 @@ > #define SMAP_FILE_PATH "/proc/self/smaps" > #define MAX_LINE_LENGTH 500 > > +unsigned int __page_size; > +unsigned int __page_shift; > + > uint64_t pagemap_get_entry(int fd, char *start) > { > const unsigned long pfn = (unsigned long)start / getpagesize(); > @@ -149,3 +152,31 @@ bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size) > { > return __check_huge(addr, "ShmemPmdMapped:", nr_hpages, hpage_size); > } > + > +int64_t allocate_transhuge(void *ptr, int pagemap_fd) > +{ > + uint64_t ent[2]; > + > + /* drop pmd */ > + if (mmap(ptr, HPAGE_SIZE, PROT_READ | PROT_WRITE, > + MAP_FIXED | MAP_ANONYMOUS | > + MAP_NORESERVE | MAP_PRIVATE, -1, 0) != ptr) > + errx(2, "mmap transhuge"); > + > + if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE)) > + err(2, "MADV_HUGEPAGE"); > + > + /* allocate transparent huge page */ > + *(volatile void **)ptr = ptr; > + > + if (pread(pagemap_fd, ent, sizeof(ent), > + (uintptr_t)ptr >> (pshift() - 3)) != sizeof(ent)) > + err(2, "read pagemap"); > + > + if (PAGEMAP_PRESENT(ent[0]) && PAGEMAP_PRESENT(ent[1]) && > + PAGEMAP_PFN(ent[0]) + 1 == PAGEMAP_PFN(ent[1]) && > + !(PAGEMAP_PFN(ent[0]) & ((1 << (HPAGE_SHIFT - pshift())) - 1))) > + return PAGEMAP_PFN(ent[0]); > + > + return -1; > +} > diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h > index 1995ee911ef2..6edeb531afc6 100644 > --- a/tools/testing/selftests/mm/vm_util.h > +++ b/tools/testing/selftests/mm/vm_util.h > @@ -1,6 +1,27 @@ > /* SPDX-License-Identifier: GPL-2.0 */ > #include <stdint.h> > #include <stdbool.h> > +#include <sys/mman.h> > +#include <err.h> > +#include <string.h> /* ffsl() */ > +#include <unistd.h> /* _SC_PAGESIZE */ > + > +extern unsigned int __page_size; > +extern unsigned int __page_shift; > + > +static inline unsigned int psize(void) > +{ > + if (!__page_size) > + __page_size = sysconf(_SC_PAGESIZE); > + return __page_size; > +} > + > +static inline unsigned int pshift(void) > +{ > + if (!__page_shift) > + __page_shift = (ffsl(psize()) - 1); > + return __page_shift; > +} > > uint64_t pagemap_get_entry(int fd, char *start); > bool pagemap_is_softdirty(int fd, char *start); > @@ -13,3 +34,13 @@ uint64_t read_pmd_pagesize(void); > bool check_huge_anon(void *addr, int nr_hpages, uint64_t hpage_size); > bool check_huge_file(void *addr, int nr_hpages, uint64_t hpage_size); > bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size); > +int64_t allocate_transhuge(void *ptr, int pagemap_fd); > + > +/* > + * On ppc64 this will only work with radix 2M hugepage size > + */ > +#define HPAGE_SHIFT 21 > +#define HPAGE_SIZE (1 << HPAGE_SHIFT) > + > +#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) > +#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1)) > -- > 2.39.1 >
diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile index fbf5646b1072..4188435967ed 100644 --- a/tools/testing/selftests/mm/Makefile +++ b/tools/testing/selftests/mm/Makefile @@ -111,6 +111,10 @@ $(OUTPUT)/madv_populate: vm_util.c $(OUTPUT)/soft-dirty: vm_util.c $(OUTPUT)/split_huge_page_test: vm_util.c $(OUTPUT)/userfaultfd: vm_util.c +$(OUTPUT)/gup_test: vm_util.c +$(OUTPUT)/mrelease_test: vm_util.c +$(OUTPUT)/transhuge-stress: vm_util.c +$(OUTPUT)/ksm_tests: vm_util.c ifeq ($(MACHINE),x86_64) BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32)) diff --git a/tools/testing/selftests/mm/gup_test.c b/tools/testing/selftests/mm/gup_test.c index e43879291dac..ec2229136384 100644 --- a/tools/testing/selftests/mm/gup_test.c +++ b/tools/testing/selftests/mm/gup_test.c @@ -12,8 +12,7 @@ #include <assert.h> #include <mm/gup_test.h> #include "../kselftest.h" - -#include "util.h" +#include "vm_util.h" #define MB (1UL << 20) @@ -251,7 +250,7 @@ int main(int argc, char **argv) if (touch) { gup.gup_flags |= FOLL_TOUCH; } else { - for (; (unsigned long)p < gup.addr + size; p += PAGE_SIZE) + for (; (unsigned long)p < gup.addr + size; p += psize()) p[0] = 0; } diff --git a/tools/testing/selftests/mm/ksm_tests.c b/tools/testing/selftests/mm/ksm_tests.c index 9fb21b982dc9..85a49aea3ab8 100644 --- a/tools/testing/selftests/mm/ksm_tests.c +++ b/tools/testing/selftests/mm/ksm_tests.c @@ -14,7 +14,7 @@ #include "../kselftest.h" #include <include/vdso/time64.h> -#include "util.h" +#include "vm_util.h" #define KSM_SYSFS_PATH "/sys/kernel/mm/ksm/" #define KSM_FP(s) (KSM_SYSFS_PATH s) diff --git a/tools/testing/selftests/mm/mrelease_test.c b/tools/testing/selftests/mm/mrelease_test.c index 6c62966ab5db..37b6d33b9e84 100644 --- a/tools/testing/selftests/mm/mrelease_test.c +++ b/tools/testing/selftests/mm/mrelease_test.c @@ -9,8 +9,7 @@ #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> - -#include "util.h" +#include "vm_util.h" #include "../kselftest.h" @@ -32,7 +31,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) unsigned long i; char *buf; - buf = (char *)mmap(NULL, nr_pages * PAGE_SIZE, PROT_READ | PROT_WRITE, + buf = (char *)mmap(NULL, nr_pages * psize(), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, 0, 0); if (buf == MAP_FAILED) { perror("mmap failed, halting the test"); @@ -40,7 +39,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) } for (i = 0; i < nr_pages; i++) - *((unsigned long *)(buf + (i * PAGE_SIZE))) = i; + *((unsigned long *)(buf + (i * psize()))) = i; /* Signal the parent that the child is ready */ if (write(pipefd, "", 1) < 0) { @@ -54,7 +53,7 @@ static int alloc_noexit(unsigned long nr_pages, int pipefd) timeout--; } - munmap(buf, nr_pages * PAGE_SIZE); + munmap(buf, nr_pages * psize()); return (timeout > 0) ? KSFT_PASS : KSFT_FAIL; } @@ -87,7 +86,7 @@ static int child_main(int pipefd[], size_t size) /* Allocate and fault-in memory and wait to be killed */ close(pipefd[0]); - res = alloc_noexit(MB(size) / PAGE_SIZE, pipefd[1]); + res = alloc_noexit(MB(size) / psize(), pipefd[1]); close(pipefd[1]); return res; } diff --git a/tools/testing/selftests/mm/transhuge-stress.c b/tools/testing/selftests/mm/transhuge-stress.c index e3f00adb1b82..ba9d37ad3a89 100644 --- a/tools/testing/selftests/mm/transhuge-stress.c +++ b/tools/testing/selftests/mm/transhuge-stress.c @@ -15,7 +15,7 @@ #include <fcntl.h> #include <string.h> #include <sys/mman.h> -#include "util.h" +#include "vm_util.h" int backing_fd = -1; int mmap_flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE; @@ -34,10 +34,10 @@ int main(int argc, char **argv) int pagemap_fd; ram = sysconf(_SC_PHYS_PAGES); - if (ram > SIZE_MAX / sysconf(_SC_PAGESIZE) / 4) + if (ram > SIZE_MAX / psize() / 4) ram = SIZE_MAX / 4; else - ram *= sysconf(_SC_PAGESIZE); + ram *= psize(); len = ram; while (++i < argc) { @@ -58,7 +58,7 @@ int main(int argc, char **argv) warnx("allocate %zd transhuge pages, using %zd MiB virtual memory" " and %zd MiB of ram", len >> HPAGE_SHIFT, len >> 20, - ram >> (20 + HPAGE_SHIFT - PAGE_SHIFT - 1)); + ram >> (20 + HPAGE_SHIFT - pshift() - 1)); pagemap_fd = open("/proc/self/pagemap", O_RDONLY); if (pagemap_fd < 0) @@ -92,7 +92,7 @@ int main(int argc, char **argv) if (pfn < 0) { nr_failed++; } else { - size_t idx = pfn >> (HPAGE_SHIFT - PAGE_SHIFT); + size_t idx = pfn >> (HPAGE_SHIFT - pshift()); nr_succeed++; if (idx >= map_len) { @@ -108,7 +108,7 @@ int main(int argc, char **argv) } /* split transhuge page, keep last page */ - if (madvise(p, HPAGE_SIZE - PAGE_SIZE, MADV_DONTNEED)) + if (madvise(p, HPAGE_SIZE - psize(), MADV_DONTNEED)) err(2, "MADV_DONTNEED"); } clock_gettime(CLOCK_MONOTONIC, &b); diff --git a/tools/testing/selftests/mm/util.h b/tools/testing/selftests/mm/util.h deleted file mode 100644 index b27d26199334..000000000000 --- a/tools/testing/selftests/mm/util.h +++ /dev/null @@ -1,69 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ - -#ifndef __KSELFTEST_VM_UTIL_H -#define __KSELFTEST_VM_UTIL_H - -#include <stdint.h> -#include <sys/mman.h> -#include <err.h> -#include <string.h> /* ffsl() */ -#include <unistd.h> /* _SC_PAGESIZE */ - -static unsigned int __page_size; -static unsigned int __page_shift; - -static inline unsigned int page_size(void) -{ - if (!__page_size) - __page_size = sysconf(_SC_PAGESIZE); - return __page_size; -} - -static inline unsigned int 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()) -/* - * On ppc64 this will only work with radix 2M hugepage size - */ -#define HPAGE_SHIFT 21 -#define HPAGE_SIZE (1 << HPAGE_SHIFT) - -#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) -#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1)) - - -static inline int64_t allocate_transhuge(void *ptr, int pagemap_fd) -{ - uint64_t ent[2]; - - /* drop pmd */ - if (mmap(ptr, HPAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_FIXED | MAP_ANONYMOUS | - MAP_NORESERVE | MAP_PRIVATE, -1, 0) != ptr) - errx(2, "mmap transhuge"); - - if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE)) - err(2, "MADV_HUGEPAGE"); - - /* allocate transparent huge page */ - *(volatile void **)ptr = ptr; - - if (pread(pagemap_fd, ent, sizeof(ent), - (uintptr_t)ptr >> (PAGE_SHIFT - 3)) != sizeof(ent)) - err(2, "read pagemap"); - - if (PAGEMAP_PRESENT(ent[0]) && PAGEMAP_PRESENT(ent[1]) && - PAGEMAP_PFN(ent[0]) + 1 == PAGEMAP_PFN(ent[1]) && - !(PAGEMAP_PFN(ent[0]) & ((1 << (HPAGE_SHIFT - PAGE_SHIFT)) - 1))) - return PAGEMAP_PFN(ent[0]); - - return -1; -} - -#endif diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c index 40e795624ff3..0204c469be43 100644 --- a/tools/testing/selftests/mm/vm_util.c +++ b/tools/testing/selftests/mm/vm_util.c @@ -8,6 +8,9 @@ #define SMAP_FILE_PATH "/proc/self/smaps" #define MAX_LINE_LENGTH 500 +unsigned int __page_size; +unsigned int __page_shift; + uint64_t pagemap_get_entry(int fd, char *start) { const unsigned long pfn = (unsigned long)start / getpagesize(); @@ -149,3 +152,31 @@ bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size) { return __check_huge(addr, "ShmemPmdMapped:", nr_hpages, hpage_size); } + +int64_t allocate_transhuge(void *ptr, int pagemap_fd) +{ + uint64_t ent[2]; + + /* drop pmd */ + if (mmap(ptr, HPAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_FIXED | MAP_ANONYMOUS | + MAP_NORESERVE | MAP_PRIVATE, -1, 0) != ptr) + errx(2, "mmap transhuge"); + + if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE)) + err(2, "MADV_HUGEPAGE"); + + /* allocate transparent huge page */ + *(volatile void **)ptr = ptr; + + if (pread(pagemap_fd, ent, sizeof(ent), + (uintptr_t)ptr >> (pshift() - 3)) != sizeof(ent)) + err(2, "read pagemap"); + + if (PAGEMAP_PRESENT(ent[0]) && PAGEMAP_PRESENT(ent[1]) && + PAGEMAP_PFN(ent[0]) + 1 == PAGEMAP_PFN(ent[1]) && + !(PAGEMAP_PFN(ent[0]) & ((1 << (HPAGE_SHIFT - pshift())) - 1))) + return PAGEMAP_PFN(ent[0]); + + return -1; +} diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 1995ee911ef2..6edeb531afc6 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -1,6 +1,27 @@ /* SPDX-License-Identifier: GPL-2.0 */ #include <stdint.h> #include <stdbool.h> +#include <sys/mman.h> +#include <err.h> +#include <string.h> /* ffsl() */ +#include <unistd.h> /* _SC_PAGESIZE */ + +extern unsigned int __page_size; +extern unsigned int __page_shift; + +static inline unsigned int psize(void) +{ + if (!__page_size) + __page_size = sysconf(_SC_PAGESIZE); + return __page_size; +} + +static inline unsigned int pshift(void) +{ + if (!__page_shift) + __page_shift = (ffsl(psize()) - 1); + return __page_shift; +} uint64_t pagemap_get_entry(int fd, char *start); bool pagemap_is_softdirty(int fd, char *start); @@ -13,3 +34,13 @@ uint64_t read_pmd_pagesize(void); bool check_huge_anon(void *addr, int nr_hpages, uint64_t hpage_size); bool check_huge_file(void *addr, int nr_hpages, uint64_t hpage_size); bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size); +int64_t allocate_transhuge(void *ptr, int pagemap_fd); + +/* + * On ppc64 this will only work with radix 2M hugepage size + */ +#define HPAGE_SHIFT 21 +#define HPAGE_SIZE (1 << HPAGE_SHIFT) + +#define PAGEMAP_PRESENT(ent) (((ent) & (1ull << 63)) != 0) +#define PAGEMAP_PFN(ent) ((ent) & ((1ull << 55) - 1))
There're two util headers under mm/ kselftest. Merge one with another. It turns out util.h is the easy one to move. When merging, drop PAGE_SIZE / PAGE_SHIFT because they're unnecessary wrappers to page_size() / page_shift(), meanwhile rename them to psize() and pshift() so as to not conflict with some existing definitions in some test files that includes vm_util.h. Signed-off-by: Peter Xu <peterx@redhat.com> --- tools/testing/selftests/mm/Makefile | 4 ++ tools/testing/selftests/mm/gup_test.c | 5 +- tools/testing/selftests/mm/ksm_tests.c | 2 +- tools/testing/selftests/mm/mrelease_test.c | 11 ++- tools/testing/selftests/mm/transhuge-stress.c | 12 ++-- tools/testing/selftests/mm/util.h | 69 ------------------- tools/testing/selftests/mm/vm_util.c | 31 +++++++++ tools/testing/selftests/mm/vm_util.h | 31 +++++++++ 8 files changed, 80 insertions(+), 85 deletions(-) delete mode 100644 tools/testing/selftests/mm/util.h