From: Mike Rapoport <rppt@kernel.org>
To: Mike Kravetz <mike.kravetz@oracle.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Naoya Horiguchi <naoya.horiguchi@linux.dev>,
David Hildenbrand <david@redhat.com>,
Axel Rasmussen <axelrasmussen@google.com>,
Mina Almasry <almasrymina@google.com>,
Michal Hocko <mhocko@suse.com>, Peter Xu <peterx@redhat.com>,
Andrea Arcangeli <aarcange@redhat.com>,
Shuah Khan <shuah@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v2 3/3] userfaultfd/selftests: enable huegtlb remap and remove event testing
Date: Wed, 2 Feb 2022 08:11:56 +0200 [thread overview]
Message-ID: <YfogrMM7eiHSFhav@kernel.org> (raw)
In-Reply-To: <20220202014034.182008-4-mike.kravetz@oracle.com>
On Tue, Feb 01, 2022 at 05:40:34PM -0800, Mike Kravetz wrote:
> Subject: [PATCH v2 3/3] userfaultfd/selftests: enable huegtlb remap and remove event testing
Nit: ^ hugetlb
> With MADV_DONTNEED support added to hugetlb mappings, mremap testing
> can also be enabled for hugetlb.
>
> Modify the tests to use madvise MADV_DONTNEED and MADV_REMOVE instead of
> fallocate hole puch for releasing hugetlb pages.
>
> Signed-off-by: Mike Kravetz <mike.kravetz@oracle.com>
> Reviewed-by: Axel Rasmussen <axelrasmussen@google.com>
> ---
> tools/testing/selftests/vm/run_vmtests.sh | 3 +-
> tools/testing/selftests/vm/userfaultfd.c | 69 ++++++++++++-----------
> 2 files changed, 36 insertions(+), 36 deletions(-)
>
> diff --git a/tools/testing/selftests/vm/run_vmtests.sh b/tools/testing/selftests/vm/run_vmtests.sh
> index ff901ee66838..7178d6fa8c92 100755
> --- a/tools/testing/selftests/vm/run_vmtests.sh
> +++ b/tools/testing/selftests/vm/run_vmtests.sh
> @@ -207,14 +207,13 @@ echo "running userfaultfd_hugetlb"
> echo "---------------------------"
> # Test requires source and destination huge pages. Size of source
> # (half_ufd_size_MB) is passed as argument to test.
> -./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file
> +./userfaultfd hugetlb $half_ufd_size_MB 32
> if [ $? -ne 0 ]; then
> echo "[FAIL]"
> exitcode=1
> else
> echo "[PASS]"
> fi
> -rm -f $mnt/ufd_test_file
>
> echo "-------------------------"
> echo "running userfaultfd_shmem"
> diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
> index d2480ab93037..c18beebc0dd6 100644
> --- a/tools/testing/selftests/vm/userfaultfd.c
> +++ b/tools/testing/selftests/vm/userfaultfd.c
> @@ -88,7 +88,6 @@ static bool test_uffdio_minor = false;
> static bool map_shared;
> static int shm_fd;
> static int huge_fd;
> -static char *huge_fd_off0;
> static unsigned long long *count_verify;
> static int uffd = -1;
> static int uffd_flags, finished, *pipefd;
> @@ -127,9 +126,9 @@ const char *examples =
> "./userfaultfd anon 100 99999\n\n"
> "# Run share memory test on 1GiB region with 99 bounces:\n"
> "./userfaultfd shmem 1000 99\n\n"
> - "# Run hugetlb memory test on 256MiB region with 50 bounces (using /dev/hugepages/hugefile):\n"
> - "./userfaultfd hugetlb 256 50 /dev/hugepages/hugefile\n\n"
> - "# Run the same hugetlb test but using shmem:\n"
> + "# Run hugetlb memory test on 256MiB region with 50 bounces:\n"
> + "./userfaultfd hugetlb 256 50\n\n"
> + "# Run the same hugetlb test but using shared file:\n"
> "./userfaultfd hugetlb_shared 256 50 /dev/hugepages/hugefile\n\n"
> "# 10MiB-~6GiB 999 bounces anonymous test, "
> "continue forever unless an error triggers\n"
> @@ -226,10 +225,13 @@ static void noop_alias_mapping(__u64 *start, size_t len, unsigned long offset)
>
> static void hugetlb_release_pages(char *rel_area)
> {
> - if (fallocate(huge_fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
> - rel_area == huge_fd_off0 ? 0 : nr_pages * page_size,
> - nr_pages * page_size))
> - err("fallocate() failed");
> + if (!map_shared) {
> + if (madvise(rel_area, nr_pages * page_size, MADV_DONTNEED))
> + err("madvise(MADV_DONTNEED) failed");
> + } else {
> + if (madvise(rel_area, nr_pages * page_size, MADV_REMOVE))
> + err("madvise(MADV_REMOVE) failed");
> + }
> }
>
> static void hugetlb_allocate_area(void **alloc_area)
> @@ -237,26 +239,37 @@ static void hugetlb_allocate_area(void **alloc_area)
> void *area_alias = NULL;
> char **alloc_area_alias;
>
> - *alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
> - (map_shared ? MAP_SHARED : MAP_PRIVATE) |
> - MAP_HUGETLB |
> - (*alloc_area == area_src ? 0 : MAP_NORESERVE),
> - huge_fd, *alloc_area == area_src ? 0 :
> - nr_pages * page_size);
> + if (!map_shared)
> + *alloc_area = mmap(NULL,
> + nr_pages * page_size,
> + PROT_READ | PROT_WRITE,
> + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB |
> + (*alloc_area == area_src ? 0 : MAP_NORESERVE),
> + -1,
> + 0);
> + else
> + *alloc_area = mmap(NULL,
> + nr_pages * page_size,
> + PROT_READ | PROT_WRITE,
> + MAP_SHARED |
> + (*alloc_area == area_src ? 0 : MAP_NORESERVE),
> + huge_fd,
> + *alloc_area == area_src ? 0 : nr_pages * page_size);
> if (*alloc_area == MAP_FAILED)
> err("mmap of hugetlbfs file failed");
>
> if (map_shared) {
> - area_alias = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
> - MAP_SHARED | MAP_HUGETLB,
> - huge_fd, *alloc_area == area_src ? 0 :
> - nr_pages * page_size);
> + area_alias = mmap(NULL,
> + nr_pages * page_size,
> + PROT_READ | PROT_WRITE,
> + MAP_SHARED,
> + huge_fd,
> + *alloc_area == area_src ? 0 : nr_pages * page_size);
> if (area_alias == MAP_FAILED)
> err("mmap of hugetlb file alias failed");
> }
>
> if (*alloc_area == area_src) {
> - huge_fd_off0 = *alloc_area;
> alloc_area_alias = &area_src_alias;
> } else {
> alloc_area_alias = &area_dst_alias;
> @@ -269,12 +282,7 @@ static void hugetlb_alias_mapping(__u64 *start, size_t len, unsigned long offset
> {
> if (!map_shared)
> return;
> - /*
> - * We can't zap just the pagetable with hugetlbfs because
> - * MADV_DONTEED won't work. So exercise -EEXIST on a alias
> - * mapping where the pagetables are not established initially,
> - * this way we'll exercise the -EEXEC at the fs level.
> - */
> +
> *start = (unsigned long) area_dst_alias + offset;
> }
>
> @@ -427,7 +435,6 @@ static void uffd_test_ctx_clear(void)
> uffd = -1;
> }
>
> - huge_fd_off0 = NULL;
> munmap_area((void **)&area_src);
> munmap_area((void **)&area_src_alias);
> munmap_area((void **)&area_dst);
> @@ -925,10 +932,7 @@ static int faulting_process(int signal_test)
> struct sigaction act;
> unsigned long signalled = 0;
>
> - if (test_type != TEST_HUGETLB)
> - split_nr_pages = (nr_pages + 1) / 2;
> - else
> - split_nr_pages = nr_pages;
> + split_nr_pages = (nr_pages + 1) / 2;
>
> if (signal_test) {
> sigbuf = &jbuf;
> @@ -985,9 +989,6 @@ static int faulting_process(int signal_test)
> if (signal_test)
> return signalled != split_nr_pages;
>
> - if (test_type == TEST_HUGETLB)
> - return 0;
> -
> area_dst = mremap(area_dst, nr_pages * page_size, nr_pages * page_size,
> MREMAP_MAYMOVE | MREMAP_FIXED, area_src);
> if (area_dst == MAP_FAILED)
> @@ -1670,7 +1671,7 @@ int main(int argc, char **argv)
> }
> nr_pages = nr_pages_per_cpu * nr_cpus;
>
> - if (test_type == TEST_HUGETLB) {
> + if (test_type == TEST_HUGETLB && map_shared) {
> if (argc < 5)
> usage();
> huge_fd = open(argv[4], O_CREAT | O_RDWR, 0755);
> --
> 2.34.1
>
>
--
Sincerely yours,
Mike.
prev parent reply other threads:[~2022-02-02 6:12 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-02 1:40 [PATCH v2 0/3] Add hugetlb MADV_DONTNEED support Mike Kravetz
2022-02-02 1:40 ` [PATCH v2 1/3] mm: enable MADV_DONTNEED for hugetlb mappings Mike Kravetz
2022-02-02 8:14 ` David Hildenbrand
2022-02-02 19:32 ` Mike Kravetz
2022-02-04 8:35 ` David Hildenbrand
2022-02-07 23:47 ` Mike Kravetz
2022-02-10 13:09 ` David Hildenbrand
2022-02-10 22:11 ` Mike Kravetz
2022-02-11 8:43 ` David Hildenbrand
2022-02-10 3:21 ` Peter Xu
2022-02-10 21:36 ` Mike Kravetz
2022-02-11 2:28 ` Peter Xu
2022-02-11 19:08 ` Axel Rasmussen
2022-02-11 19:18 ` Mike Kravetz
2022-02-02 1:40 ` [PATCH v2 2/3] selftests/vm: add hugetlb madvise MADV_DONTNEED MADV_REMOVE test Mike Kravetz
2022-02-02 1:40 ` [PATCH v2 3/3] userfaultfd/selftests: enable huegtlb remap and remove event testing Mike Kravetz
2022-02-02 6:11 ` Mike Rapoport [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YfogrMM7eiHSFhav@kernel.org \
--to=rppt@kernel.org \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=almasrymina@google.com \
--cc=axelrasmussen@google.com \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=mike.kravetz@oracle.com \
--cc=naoya.horiguchi@linux.dev \
--cc=peterx@redhat.com \
--cc=shuah@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).