Make them common functions to be reused. Signed-off-by: Peter Xu <peterx@xxxxxxxxxx> --- tools/testing/selftests/mm/uffd-common.c | 46 ++++++++++++++++++++++ tools/testing/selftests/mm/uffd-common.h | 4 ++ tools/testing/selftests/mm/uffd-stress.c | 49 ++++-------------------- 3 files changed, 57 insertions(+), 42 deletions(-) diff --git a/tools/testing/selftests/mm/uffd-common.c b/tools/testing/selftests/mm/uffd-common.c index aded06cab285..851284395b29 100644 --- a/tools/testing/selftests/mm/uffd-common.c +++ b/tools/testing/selftests/mm/uffd-common.c @@ -555,6 +555,52 @@ void *uffd_poll_thread(void *arg) return NULL; } +void *uffd_read_thread(void *arg) +{ + struct uffd_args *args = (struct uffd_args *)arg; + struct uffd_msg msg; + + sem_post(&uffd_read_sem); + /* from here cancellation is ok */ + + for (;;) { + if (uffd_read_msg(uffd, &msg)) + continue; + uffd_handle_page_fault(&msg, args); + } + + return NULL; +} + +void uffd_fault_thread_create(pthread_t *thread, pthread_attr_t *attr, + struct uffd_args *args, bool poll) +{ + if (poll) { + if (pthread_create(thread, attr, uffd_poll_thread, args)) + err("uffd_poll_thread create"); + } else { + if (pthread_create(thread, attr, uffd_read_thread, args)) + err("uffd_read_thread create"); + sem_wait(&uffd_read_sem); + } +} + +void uffd_fault_thread_join(pthread_t thread, int cpu, bool poll) +{ + char c = 1; + + if (poll) { + if (write(pipefd[cpu*2+1], &c, 1) != 1) + err("pipefd write error"); + } else { + if (pthread_cancel(thread)) + err("pthread_cancel()"); + } + + if (pthread_join(thread, NULL)) + err("pthread_join()"); +} + static void retry_copy_page(int ufd, struct uffdio_copy *uffdio_copy, unsigned long offset) { diff --git a/tools/testing/selftests/mm/uffd-common.h b/tools/testing/selftests/mm/uffd-common.h index 521523baded1..9d66ad5c52cb 100644 --- a/tools/testing/selftests/mm/uffd-common.h +++ b/tools/testing/selftests/mm/uffd-common.h @@ -114,6 +114,10 @@ void uffd_handle_page_fault(struct uffd_msg *msg, struct uffd_args *args); int __copy_page(int ufd, unsigned long offset, bool retry, bool wp); int copy_page(int ufd, unsigned long offset, bool wp); void *uffd_poll_thread(void *arg); +void *uffd_read_thread(void *arg); +void uffd_fault_thread_create(pthread_t *thread, pthread_attr_t *attr, + struct uffd_args *args, bool poll); +void uffd_fault_thread_join(pthread_t thread, int cpu, bool poll); int uffd_open_dev(unsigned int flags); int uffd_open_sys(unsigned int flags); diff --git a/tools/testing/selftests/mm/uffd-stress.c b/tools/testing/selftests/mm/uffd-stress.c index 7219f55ae794..915795e33432 100644 --- a/tools/testing/selftests/mm/uffd-stress.c +++ b/tools/testing/selftests/mm/uffd-stress.c @@ -125,23 +125,6 @@ static int copy_page_retry(int ufd, unsigned long offset) return __copy_page(ufd, offset, true, test_uffdio_wp); } -static void *uffd_read_thread(void *arg) -{ - struct uffd_args *args = (struct uffd_args *)arg; - struct uffd_msg msg; - - sem_post(&uffd_read_sem); - /* from here cancellation is ok */ - - for (;;) { - if (uffd_read_msg(uffd, &msg)) - continue; - uffd_handle_page_fault(&msg, args); - } - - return NULL; -} - static void *background_thread(void *arg) { unsigned long cpu = (unsigned long) arg; @@ -186,16 +169,10 @@ static int stress(struct uffd_args *args) if (pthread_create(&locking_threads[cpu], &attr, locking_thread, (void *)cpu)) return 1; - if (bounces & BOUNCE_POLL) { - if (pthread_create(&uffd_threads[cpu], &attr, uffd_poll_thread, &args[cpu])) - err("uffd_poll_thread create"); - } else { - if (pthread_create(&uffd_threads[cpu], &attr, - uffd_read_thread, - (void *)&args[cpu])) - return 1; - sem_wait(&uffd_read_sem); - } + + uffd_fault_thread_create(&uffd_threads[cpu], &attr, + &args[cpu], bounces & BOUNCE_POLL); + if (pthread_create(&background_threads[cpu], &attr, background_thread, (void *)cpu)) return 1; @@ -220,21 +197,9 @@ static int stress(struct uffd_args *args) if (pthread_join(locking_threads[cpu], NULL)) return 1; - for (cpu = 0; cpu < nr_cpus; cpu++) { - char c; - if (bounces & BOUNCE_POLL) { - if (write(pipefd[cpu*2+1], &c, 1) != 1) - err("pipefd write error"); - if (pthread_join(uffd_threads[cpu], - (void *)&args[cpu])) - return 1; - } else { - if (pthread_cancel(uffd_threads[cpu])) - return 1; - if (pthread_join(uffd_threads[cpu], NULL)) - return 1; - } - } + for (cpu = 0; cpu < nr_cpus; cpu++) + uffd_fault_thread_join(uffd_threads[cpu], cpu, + bounces & BOUNCE_POLL); return 0; } -- 2.41.0