Commit 72e72588 authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle)
Browse files

selftests/vm/transhuge-stress: Support file-backed PMD folios



Add a -f <filename> option to test PMD folios on files

Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
parent 4687fdbb
Loading
Loading
Loading
Loading
+24 −11
Original line number Diff line number Diff line
@@ -26,15 +26,17 @@
#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);

	if (argc == 1)
	len = ram;
	else if (!strcmp(argv[1], "-h"))

	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[1]) << 20;
			len = atoll(argv[i]) << 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;