Skip to content

Commit

Permalink
userfaultfd: shmem: add userfaultfd_shmem test
Browse files Browse the repository at this point in the history
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/[email protected]
Signed-off-by: Mike Rapoport <[email protected]>
Signed-off-by: Andrea Arcangeli <[email protected]>
Cc: "Dr. David Alan Gilbert" <[email protected]>
Cc: Hillf Danton <[email protected]>
Cc: Michael Rapoport <[email protected]>
Cc: Mike Kravetz <[email protected]>
Cc: Pavel Emelyanov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
rppt authored and torvalds committed Feb 23, 2017
1 parent 1c9e8de commit 419624d
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 2 deletions.
4 changes: 4 additions & 0 deletions tools/testing/selftests/vm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ BINARIES += thuge-gen
BINARIES += transhuge-stress
BINARIES += userfaultfd
BINARIES += userfaultfd_hugetlb
BINARIES += userfaultfd_shmem
BINARIES += mlock-random-test

all: $(BINARIES)
Expand All @@ -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

Expand Down
11 changes: 11 additions & 0 deletions tools/testing/selftests/vm/run_vmtests
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 35 additions & 2 deletions tools/testing/selftests/vm/userfaultfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 419624d

Please sign in to comment.