diff options
Diffstat (limited to 'tools/testing/selftests/vm/userfaultfd.c')
-rw-r--r-- | tools/testing/selftests/vm/userfaultfd.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index a2c53a3d223d..de2f9ec8a87f 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c | |||
@@ -397,7 +397,7 @@ static void retry_copy_page(int ufd, struct uffdio_copy *uffdio_copy, | |||
397 | } | 397 | } |
398 | } | 398 | } |
399 | 399 | ||
400 | static int copy_page(int ufd, unsigned long offset) | 400 | static int __copy_page(int ufd, unsigned long offset, bool retry) |
401 | { | 401 | { |
402 | struct uffdio_copy uffdio_copy; | 402 | struct uffdio_copy uffdio_copy; |
403 | 403 | ||
@@ -418,7 +418,7 @@ static int copy_page(int ufd, unsigned long offset) | |||
418 | fprintf(stderr, "UFFDIO_COPY unexpected copy %Ld\n", | 418 | fprintf(stderr, "UFFDIO_COPY unexpected copy %Ld\n", |
419 | uffdio_copy.copy), exit(1); | 419 | uffdio_copy.copy), exit(1); |
420 | } else { | 420 | } else { |
421 | if (test_uffdio_copy_eexist) { | 421 | if (test_uffdio_copy_eexist && retry) { |
422 | test_uffdio_copy_eexist = false; | 422 | test_uffdio_copy_eexist = false; |
423 | retry_copy_page(ufd, &uffdio_copy, offset); | 423 | retry_copy_page(ufd, &uffdio_copy, offset); |
424 | } | 424 | } |
@@ -427,6 +427,16 @@ static int copy_page(int ufd, unsigned long offset) | |||
427 | return 0; | 427 | return 0; |
428 | } | 428 | } |
429 | 429 | ||
430 | static int copy_page_retry(int ufd, unsigned long offset) | ||
431 | { | ||
432 | return __copy_page(ufd, offset, true); | ||
433 | } | ||
434 | |||
435 | static int copy_page(int ufd, unsigned long offset) | ||
436 | { | ||
437 | return __copy_page(ufd, offset, false); | ||
438 | } | ||
439 | |||
430 | static void *uffd_poll_thread(void *arg) | 440 | static void *uffd_poll_thread(void *arg) |
431 | { | 441 | { |
432 | unsigned long cpu = (unsigned long) arg; | 442 | unsigned long cpu = (unsigned long) arg; |
@@ -544,7 +554,7 @@ static void *background_thread(void *arg) | |||
544 | for (page_nr = cpu * nr_pages_per_cpu; | 554 | for (page_nr = cpu * nr_pages_per_cpu; |
545 | page_nr < (cpu+1) * nr_pages_per_cpu; | 555 | page_nr < (cpu+1) * nr_pages_per_cpu; |
546 | page_nr++) | 556 | page_nr++) |
547 | copy_page(uffd, page_nr * page_size); | 557 | copy_page_retry(uffd, page_nr * page_size); |
548 | 558 | ||
549 | return NULL; | 559 | return NULL; |
550 | } | 560 | } |
@@ -779,7 +789,7 @@ static void retry_uffdio_zeropage(int ufd, | |||
779 | } | 789 | } |
780 | } | 790 | } |
781 | 791 | ||
782 | static int uffdio_zeropage(int ufd, unsigned long offset) | 792 | static int __uffdio_zeropage(int ufd, unsigned long offset, bool retry) |
783 | { | 793 | { |
784 | struct uffdio_zeropage uffdio_zeropage; | 794 | struct uffdio_zeropage uffdio_zeropage; |
785 | int ret; | 795 | int ret; |
@@ -814,7 +824,7 @@ static int uffdio_zeropage(int ufd, unsigned long offset) | |||
814 | fprintf(stderr, "UFFDIO_ZEROPAGE unexpected %Ld\n", | 824 | fprintf(stderr, "UFFDIO_ZEROPAGE unexpected %Ld\n", |
815 | uffdio_zeropage.zeropage), exit(1); | 825 | uffdio_zeropage.zeropage), exit(1); |
816 | } else { | 826 | } else { |
817 | if (test_uffdio_zeropage_eexist) { | 827 | if (test_uffdio_zeropage_eexist && retry) { |
818 | test_uffdio_zeropage_eexist = false; | 828 | test_uffdio_zeropage_eexist = false; |
819 | retry_uffdio_zeropage(ufd, &uffdio_zeropage, | 829 | retry_uffdio_zeropage(ufd, &uffdio_zeropage, |
820 | offset); | 830 | offset); |
@@ -830,6 +840,11 @@ static int uffdio_zeropage(int ufd, unsigned long offset) | |||
830 | return 0; | 840 | return 0; |
831 | } | 841 | } |
832 | 842 | ||
843 | static int uffdio_zeropage(int ufd, unsigned long offset) | ||
844 | { | ||
845 | return __uffdio_zeropage(ufd, offset, false); | ||
846 | } | ||
847 | |||
833 | /* exercise UFFDIO_ZEROPAGE */ | 848 | /* exercise UFFDIO_ZEROPAGE */ |
834 | static int userfaultfd_zeropage_test(void) | 849 | static int userfaultfd_zeropage_test(void) |
835 | { | 850 | { |