On Thu, Mar 30, 2023 at 9:07 AM Peter Xu <peterx@xxxxxxxxxx> 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@xxxxxxxxxx> Reviewed-by: Axel Rasmussen <axelrasmussen@xxxxxxxxxx> > --- > 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 >