Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 419624da authored by Mike Rapoport's avatar Mike Rapoport Committed by Linus Torvalds
Browse files

userfaultfd: shmem: add userfaultfd_shmem test

The test verifies that anonymous shared mapping can be used with userfault
using the existing testing method.  The shared memory area is allocated
using mmap(..., MAP_SHARED | MAP_ANONYMOUS, ...) and released using
madvise(MADV_REMOVE)

Link: http://lkml.kernel.org/r/20161216144821.5183-35-aarcange@redhat.com


Signed-off-by: default avatarMike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
Cc: Hillf Danton <hillf.zj@alibaba-inc.com>
Cc: Michael Rapoport <RAPOPORT@il.ibm.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 1c9e8def
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ BINARIES += thuge-gen
BINARIES += transhuge-stress
BINARIES += userfaultfd
BINARIES += userfaultfd_hugetlb
BINARIES += userfaultfd_shmem
BINARIES += mlock-random-test

all: $(BINARIES)
@@ -22,6 +23,9 @@ userfaultfd: userfaultfd.c ../../../../usr/include/linux/kernel.h
userfaultfd_hugetlb: userfaultfd.c ../../../../usr/include/linux/kernel.h
	$(CC) $(CFLAGS) -DHUGETLB_TEST -O2 -o $@ $< -lpthread

userfaultfd_shmem: userfaultfd.c ../../../../usr/include/linux/kernel.h
	$(CC) $(CFLAGS) -DSHMEM_TEST -O2 -o $@ $< -lpthread

mlock-random-test: mlock-random-test.c
	$(CC) $(CFLAGS) -o $@ $< -lcap

+11 −0
Original line number Diff line number Diff line
@@ -116,6 +116,17 @@ else
fi
rm -f $mnt/ufd_test_file

echo "----------------------------"
echo "running userfaultfd_shmem"
echo "----------------------------"
./userfaultfd_shmem 128 32
if [ $? -ne 0 ]; then
	echo "[FAIL]"
	exitcode=1
else
	echo "[PASS]"
fi

#cleanup
umount $mnt
rm -rf $mnt
+35 −2
Original line number Diff line number Diff line
@@ -101,8 +101,9 @@ pthread_attr_t attr;
				 ~(unsigned long)(sizeof(unsigned long long) \
						  -  1)))

#ifndef HUGETLB_TEST
#if !defined(HUGETLB_TEST) && !defined(SHMEM_TEST)

/* Anonymous memory */
#define EXPECTED_IOCTLS		((1 << _UFFDIO_WAKE) | \
				 (1 << _UFFDIO_COPY) | \
				 (1 << _UFFDIO_ZEROPAGE))
@@ -127,10 +128,13 @@ static void allocate_area(void **alloc_area)
	}
}

#else /* HUGETLB_TEST */
#else /* HUGETLB_TEST or SHMEM_TEST */

#define EXPECTED_IOCTLS		UFFD_API_RANGE_IOCTLS_BASIC

#ifdef HUGETLB_TEST

/* HugeTLB memory */
static int release_pages(char *rel_area)
{
	int ret = 0;
@@ -162,8 +166,37 @@ static void allocate_area(void **alloc_area)
		huge_fd_off0 = *alloc_area;
}

#elif defined(SHMEM_TEST)

/* Shared memory */
static int release_pages(char *rel_area)
{
	int ret = 0;

	if (madvise(rel_area, nr_pages * page_size, MADV_REMOVE)) {
		perror("madvise");
		ret = 1;
	}

	return ret;
}

static void allocate_area(void **alloc_area)
{
	*alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
			   MAP_ANONYMOUS | MAP_SHARED, -1, 0);
	if (*alloc_area == MAP_FAILED) {
		fprintf(stderr, "shared memory mmap failed\n");
		*alloc_area = NULL;
	}
}

#else /* SHMEM_TEST */
#error "Undefined test type"
#endif /* HUGETLB_TEST */

#endif /* !defined(HUGETLB_TEST) && !defined(SHMEM_TEST) */

static int my_bcmp(char *str1, char *str2, size_t n)
{
	unsigned long i;