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: Mike Rapoport <rppt@linux.vnet.ibm.com>
Signed-off-by: Andrea 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Mike Rapoport
2017-02-22 15:43:46 -08:00
committed by Linus Torvalds
parent 1c9e8def43
commit 419624daf0
3 changed files with 50 additions and 2 deletions

View File

@@ -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;