selftests/vm/transhuge-stress: Support file-backed PMD folios
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sun, 25 Jul 2021 03:43:58 +0000 (23:43 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 21 Mar 2022 17:01:36 +0000 (13:01 -0400)
Add a -f <filename> option to test PMD folios on files

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
tools/testing/selftests/vm/transhuge-stress.c

index 5e4c036..a03cb3f 100644 (file)
 #define PAGEMAP_PFN(ent)       ((ent) & ((1ull << 55) - 1))
 
 int pagemap_fd;
+int backing_fd = -1;
+int mmap_flags = MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE;
+#define PROT_RW (PROT_READ | PROT_WRITE)
 
 int64_t allocate_transhuge(void *ptr)
 {
        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)
+       if (mmap(ptr, HPAGE_SIZE, PROT_RW, MAP_FIXED | mmap_flags,
+                backing_fd, 0) != ptr)
                errx(2, "mmap transhuge");
 
        if (madvise(ptr, HPAGE_SIZE, MADV_HUGEPAGE))
@@ -60,6 +62,8 @@ int main(int argc, char **argv)
        size_t ram, len;
        void *ptr, *p;
        struct timespec a, b;
+       int i = 0;
+       char *name = NULL;
        double s;
        uint8_t *map;
        size_t map_len;
@@ -69,13 +73,23 @@ int main(int argc, char **argv)
                ram = SIZE_MAX / 4;
        else
                ram *= sysconf(_SC_PAGESIZE);
+       len = ram;
+
+       while (++i < argc) {
+               if (!strcmp(argv[i], "-h"))
+                       errx(1, "usage: %s [size in MiB]", argv[0]);
+               else if (!strcmp(argv[i], "-f"))
+                       name = argv[++i];
+               else
+                       len = atoll(argv[i]) << 20;
+       }
 
-       if (argc == 1)
-               len = ram;
-       else if (!strcmp(argv[1], "-h"))
-               errx(1, "usage: %s [size in MiB]", argv[0]);
-       else
-               len = atoll(argv[1]) << 20;
+       if (name) {
+               backing_fd = open(name, O_RDWR);
+               if (backing_fd == -1)
+                       errx(2, "open %s", name);
+               mmap_flags = MAP_SHARED;
+       }
 
        warnx("allocate %zd transhuge pages, using %zd MiB virtual memory"
              " and %zd MiB of ram", len >> HPAGE_SHIFT, len >> 20,
@@ -86,8 +100,7 @@ int main(int argc, char **argv)
                err(2, "open pagemap");
 
        len -= len % HPAGE_SIZE;
-       ptr = mmap(NULL, len + HPAGE_SIZE, PROT_READ | PROT_WRITE,
-                       MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE, -1, 0);
+       ptr = mmap(NULL, len + HPAGE_SIZE, PROT_RW, mmap_flags, backing_fd, 0);
        if (ptr == MAP_FAILED)
                err(2, "initial mmap");
        ptr += HPAGE_SIZE - (uintptr_t)ptr % HPAGE_SIZE;