From: Mike Rapoport <rppt@linux.ibm.com>
To: Peter Xu <peterx@redhat.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
David Hildenbrand <david@redhat.com>,
Hugh Dickins <hughd@google.com>, Maya Gokhale <gokhale2@llnl.gov>,
Jerome Glisse <jglisse@redhat.com>,
Pavel Emelyanov <xemul@virtuozzo.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Martin Cracauer <cracauer@cons.org>, Shaohua Li <shli@fb.com>,
Marty McFadden <mcfadden8@llnl.gov>,
Andrea Arcangeli <aarcange@redhat.com>,
Mike Kravetz <mike.kravetz@oracle.com>,
Denis Plotnikov <dplotnikov@virtuozzo.com>,
Mike Rapoport <rppt@linux.vnet.ibm.com>,
Mel Gorman <mgorman@suse.de>,
"Kirill A . Shutemov" <kirill@shutemov.name>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [PATCH v2 25/26] userfaultfd: selftests: refactor statistics
Date: Tue, 26 Feb 2019 08:50:32 +0200 [thread overview]
Message-ID: <20190226065032.GC5873@rapoport-lnx> (raw)
In-Reply-To: <20190212025632.28946-26-peterx@redhat.com>
On Tue, Feb 12, 2019 at 10:56:31AM +0800, Peter Xu wrote:
> Introduce uffd_stats structure for statistics of the self test, at the
> same time refactor the code to always pass in the uffd_stats for either
> read() or poll() typed fault handling threads instead of using two
> different ways to return the statistic results. No functional change.
>
> With the new structure, it's very easy to introduce new statistics.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>
> ---
> tools/testing/selftests/vm/userfaultfd.c | 76 +++++++++++++++---------
> 1 file changed, 49 insertions(+), 27 deletions(-)
>
> diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c
> index 5d1db824f73a..e5d12c209e09 100644
> --- a/tools/testing/selftests/vm/userfaultfd.c
> +++ b/tools/testing/selftests/vm/userfaultfd.c
> @@ -88,6 +88,12 @@ static char *area_src, *area_src_alias, *area_dst, *area_dst_alias;
> static char *zeropage;
> pthread_attr_t attr;
>
> +/* Userfaultfd test statistics */
> +struct uffd_stats {
> + int cpu;
> + unsigned long missing_faults;
> +};
> +
> /* pthread_mutex_t starts at page offset 0 */
> #define area_mutex(___area, ___nr) \
> ((pthread_mutex_t *) ((___area) + (___nr)*page_size))
> @@ -127,6 +133,17 @@ static void usage(void)
> exit(1);
> }
>
> +static void uffd_stats_reset(struct uffd_stats *uffd_stats,
> + unsigned long n_cpus)
> +{
> + int i;
> +
> + for (i = 0; i < n_cpus; i++) {
> + uffd_stats[i].cpu = i;
> + uffd_stats[i].missing_faults = 0;
> + }
> +}
> +
> static int anon_release_pages(char *rel_area)
> {
> int ret = 0;
> @@ -469,8 +486,8 @@ static int uffd_read_msg(int ufd, struct uffd_msg *msg)
> return 0;
> }
>
> -/* Return 1 if page fault handled by us; otherwise 0 */
> -static int uffd_handle_page_fault(struct uffd_msg *msg)
> +static void uffd_handle_page_fault(struct uffd_msg *msg,
> + struct uffd_stats *stats)
> {
> unsigned long offset;
>
> @@ -485,18 +502,19 @@ static int uffd_handle_page_fault(struct uffd_msg *msg)
> offset = (char *)(unsigned long)msg->arg.pagefault.address - area_dst;
> offset &= ~(page_size-1);
>
> - return copy_page(uffd, offset);
> + if (copy_page(uffd, offset))
> + stats->missing_faults++;
> }
>
> static void *uffd_poll_thread(void *arg)
> {
> - unsigned long cpu = (unsigned long) arg;
> + struct uffd_stats *stats = (struct uffd_stats *)arg;
> + unsigned long cpu = stats->cpu;
> struct pollfd pollfd[2];
> struct uffd_msg msg;
> struct uffdio_register uffd_reg;
> int ret;
> char tmp_chr;
> - unsigned long userfaults = 0;
>
> pollfd[0].fd = uffd;
> pollfd[0].events = POLLIN;
> @@ -526,7 +544,7 @@ static void *uffd_poll_thread(void *arg)
> msg.event), exit(1);
> break;
> case UFFD_EVENT_PAGEFAULT:
> - userfaults += uffd_handle_page_fault(&msg);
> + uffd_handle_page_fault(&msg, stats);
> break;
> case UFFD_EVENT_FORK:
> close(uffd);
> @@ -545,28 +563,27 @@ static void *uffd_poll_thread(void *arg)
> break;
> }
> }
> - return (void *)userfaults;
> +
> + return NULL;
> }
>
> pthread_mutex_t uffd_read_mutex = PTHREAD_MUTEX_INITIALIZER;
>
> static void *uffd_read_thread(void *arg)
> {
> - unsigned long *this_cpu_userfaults;
> + struct uffd_stats *stats = (struct uffd_stats *)arg;
> struct uffd_msg msg;
>
> - this_cpu_userfaults = (unsigned long *) arg;
> - *this_cpu_userfaults = 0;
> -
> pthread_mutex_unlock(&uffd_read_mutex);
> /* from here cancellation is ok */
>
> for (;;) {
> if (uffd_read_msg(uffd, &msg))
> continue;
> - (*this_cpu_userfaults) += uffd_handle_page_fault(&msg);
> + uffd_handle_page_fault(&msg, stats);
> }
> - return (void *)NULL;
> +
> + return NULL;
> }
>
> static void *background_thread(void *arg)
> @@ -582,13 +599,12 @@ static void *background_thread(void *arg)
> return NULL;
> }
>
> -static int stress(unsigned long *userfaults)
> +static int stress(struct uffd_stats *uffd_stats)
> {
> unsigned long cpu;
> pthread_t locking_threads[nr_cpus];
> pthread_t uffd_threads[nr_cpus];
> pthread_t background_threads[nr_cpus];
> - void **_userfaults = (void **) userfaults;
>
> finished = 0;
> for (cpu = 0; cpu < nr_cpus; cpu++) {
> @@ -597,12 +613,13 @@ static int stress(unsigned long *userfaults)
> return 1;
> if (bounces & BOUNCE_POLL) {
> if (pthread_create(&uffd_threads[cpu], &attr,
> - uffd_poll_thread, (void *)cpu))
> + uffd_poll_thread,
> + (void *)&uffd_stats[cpu]))
> return 1;
> } else {
> if (pthread_create(&uffd_threads[cpu], &attr,
> uffd_read_thread,
> - &_userfaults[cpu]))
> + (void *)&uffd_stats[cpu]))
> return 1;
> pthread_mutex_lock(&uffd_read_mutex);
> }
> @@ -639,7 +656,8 @@ static int stress(unsigned long *userfaults)
> fprintf(stderr, "pipefd write error\n");
> return 1;
> }
> - if (pthread_join(uffd_threads[cpu], &_userfaults[cpu]))
> + if (pthread_join(uffd_threads[cpu],
> + (void *)&uffd_stats[cpu]))
> return 1;
> } else {
> if (pthread_cancel(uffd_threads[cpu]))
> @@ -910,11 +928,11 @@ static int userfaultfd_events_test(void)
> {
> struct uffdio_register uffdio_register;
> unsigned long expected_ioctls;
> - unsigned long userfaults;
> pthread_t uffd_mon;
> int err, features;
> pid_t pid;
> char c;
> + struct uffd_stats stats = { 0 };
>
> printf("testing events (fork, remap, remove): ");
> fflush(stdout);
> @@ -941,7 +959,7 @@ static int userfaultfd_events_test(void)
> "unexpected missing ioctl for anon memory\n"),
> exit(1);
>
> - if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, NULL))
> + if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats))
> perror("uffd_poll_thread create"), exit(1);
>
> pid = fork();
> @@ -957,13 +975,13 @@ static int userfaultfd_events_test(void)
>
> if (write(pipefd[1], &c, sizeof(c)) != sizeof(c))
> perror("pipe write"), exit(1);
> - if (pthread_join(uffd_mon, (void **)&userfaults))
> + if (pthread_join(uffd_mon, NULL))
> return 1;
>
> close(uffd);
> - printf("userfaults: %ld\n", userfaults);
> + printf("userfaults: %ld\n", stats.missing_faults);
>
> - return userfaults != nr_pages;
> + return stats.missing_faults != nr_pages;
> }
>
> static int userfaultfd_sig_test(void)
> @@ -975,6 +993,7 @@ static int userfaultfd_sig_test(void)
> int err, features;
> pid_t pid;
> char c;
> + struct uffd_stats stats = { 0 };
>
> printf("testing signal delivery: ");
> fflush(stdout);
> @@ -1006,7 +1025,7 @@ static int userfaultfd_sig_test(void)
> if (uffd_test_ops->release_pages(area_dst))
> return 1;
>
> - if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, NULL))
> + if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats))
> perror("uffd_poll_thread create"), exit(1);
>
> pid = fork();
> @@ -1032,6 +1051,7 @@ static int userfaultfd_sig_test(void)
> close(uffd);
> return userfaults != 0;
> }
> +
> static int userfaultfd_stress(void)
> {
> void *area;
> @@ -1040,7 +1060,7 @@ static int userfaultfd_stress(void)
> struct uffdio_register uffdio_register;
> unsigned long cpu;
> int err;
> - unsigned long userfaults[nr_cpus];
> + struct uffd_stats uffd_stats[nr_cpus];
>
> uffd_test_ops->allocate_area((void **)&area_src);
> if (!area_src)
> @@ -1169,8 +1189,10 @@ static int userfaultfd_stress(void)
> if (uffd_test_ops->release_pages(area_dst))
> return 1;
>
> + uffd_stats_reset(uffd_stats, nr_cpus);
> +
> /* bounce pass */
> - if (stress(userfaults))
> + if (stress(uffd_stats))
> return 1;
>
> /* unregister */
> @@ -1213,7 +1235,7 @@ static int userfaultfd_stress(void)
>
> printf("userfaults:");
> for (cpu = 0; cpu < nr_cpus; cpu++)
> - printf(" %lu", userfaults[cpu]);
> + printf(" %lu", uffd_stats[cpu].missing_faults);
> printf("\n");
> }
>
> --
> 2.17.1
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2019-02-26 6:50 UTC|newest]
Thread overview: 113+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-12 2:56 [PATCH v2 00/26] userfaultfd: write protection support Peter Xu
2019-02-12 2:56 ` [PATCH v2 01/26] mm: gup: rename "nonblocking" to "locked" where proper Peter Xu
2019-02-21 15:17 ` Jerome Glisse
2019-02-22 3:42 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 02/26] mm: userfault: return VM_FAULT_RETRY on signals Peter Xu
2019-02-21 15:29 ` Jerome Glisse
2019-02-22 3:51 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 03/26] userfaultfd: don't retake mmap_sem to emulate NOPAGE Peter Xu
2019-02-21 15:34 ` Jerome Glisse
2019-02-12 2:56 ` [PATCH v2 04/26] mm: allow VM_FAULT_RETRY for multiple times Peter Xu
2019-02-13 3:34 ` Peter Xu
2019-02-20 11:48 ` Peter Xu
2019-02-21 8:56 ` [PATCH v2.1 " Peter Xu
2019-02-21 15:53 ` Jerome Glisse
2019-02-22 4:25 ` Peter Xu
2019-02-22 15:11 ` Jerome Glisse
2019-02-25 6:19 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 05/26] mm: gup: " Peter Xu
2019-02-21 16:06 ` Jerome Glisse
2019-02-22 4:41 ` Peter Xu
2019-02-22 15:13 ` Jerome Glisse
2019-02-12 2:56 ` [PATCH v2 06/26] userfaultfd: wp: add helper for writeprotect check Peter Xu
2019-02-21 16:07 ` Jerome Glisse
2019-02-25 15:41 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 07/26] userfaultfd: wp: hook userfault handler to write protection fault Peter Xu
2019-02-21 16:25 ` Jerome Glisse
2019-02-25 15:43 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 08/26] userfaultfd: wp: add WP pagetable tracking to x86 Peter Xu
2019-02-21 17:20 ` Jerome Glisse
2019-02-25 15:48 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 09/26] userfaultfd: wp: userfaultfd_pte/huge_pmd_wp() helpers Peter Xu
2019-02-21 17:21 ` Jerome Glisse
2019-02-25 17:12 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 10/26] userfaultfd: wp: add UFFDIO_COPY_MODE_WP Peter Xu
2019-02-21 17:29 ` Jerome Glisse
2019-02-22 7:11 ` Peter Xu
2019-02-22 15:15 ` Jerome Glisse
2019-02-25 6:45 ` Peter Xu
2019-02-25 15:58 ` Mike Rapoport
2019-02-26 5:09 ` Peter Xu
2019-02-26 8:28 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 11/26] mm: merge parameters for change_protection() Peter Xu
2019-02-21 17:32 ` Jerome Glisse
2019-02-12 2:56 ` [PATCH v2 12/26] userfaultfd: wp: apply _PAGE_UFFD_WP bit Peter Xu
2019-02-21 17:44 ` Jerome Glisse
2019-02-22 7:31 ` Peter Xu
2019-02-22 15:17 ` Jerome Glisse
2019-02-25 18:00 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 13/26] mm: export wp_page_copy() Peter Xu
2019-02-21 17:44 ` Jerome Glisse
2019-02-12 2:56 ` [PATCH v2 14/26] userfaultfd: wp: handle COW properly for uffd-wp Peter Xu
2019-02-21 18:04 ` Jerome Glisse
2019-02-22 8:46 ` Peter Xu
2019-02-22 15:35 ` Jerome Glisse
2019-02-25 7:13 ` Peter Xu
2019-02-25 15:32 ` Jerome Glisse
2019-02-12 2:56 ` [PATCH v2 15/26] userfaultfd: wp: drop _PAGE_UFFD_WP properly when fork Peter Xu
2019-02-21 18:06 ` Jerome Glisse
2019-02-22 9:09 ` Peter Xu
2019-02-22 15:36 ` Jerome Glisse
2019-02-25 18:19 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 16/26] userfaultfd: wp: add pmd_swp_*uffd_wp() helpers Peter Xu
2019-02-21 18:07 ` Jerome Glisse
2019-02-25 18:20 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 17/26] userfaultfd: wp: support swap and page migration Peter Xu
2019-02-21 18:16 ` Jerome Glisse
2019-02-25 7:48 ` Peter Xu
2019-02-25 18:28 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 18/26] khugepaged: skip collapse if uffd-wp detected Peter Xu
2019-02-21 18:17 ` Jerome Glisse
2019-02-25 18:50 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 19/26] userfaultfd: introduce helper vma_find_uffd Peter Xu
2019-02-21 18:19 ` Jerome Glisse
2019-02-25 20:48 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 20/26] userfaultfd: wp: support write protection for userfault vma range Peter Xu
2019-02-21 18:23 ` Jerome Glisse
2019-02-25 8:16 ` Peter Xu
2019-02-25 20:52 ` Mike Rapoport
2019-02-26 6:06 ` Peter Xu
2019-02-26 6:43 ` Mike Rapoport
2019-02-26 7:20 ` Peter Xu
2019-02-26 7:46 ` Mike Rapoport
2019-02-26 7:54 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 21/26] userfaultfd: wp: add the writeprotect API to userfaultfd ioctl Peter Xu
2019-02-21 18:28 ` Jerome Glisse
2019-02-25 8:31 ` Peter Xu
2019-02-25 21:03 ` Mike Rapoport
2019-02-26 6:30 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 22/26] userfaultfd: wp: enabled write protection in userfaultfd API Peter Xu
2019-02-21 18:29 ` Jerome Glisse
2019-02-25 8:34 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 23/26] userfaultfd: wp: don't wake up when doing write protect Peter Xu
2019-02-21 18:36 ` Jerome Glisse
2019-02-25 8:58 ` Peter Xu
2019-02-25 21:15 ` Mike Rapoport
2019-02-25 21:09 ` Mike Rapoport
2019-02-26 6:24 ` Peter Xu
2019-02-26 7:29 ` Mike Rapoport
2019-02-26 7:41 ` Peter Xu
2019-02-26 8:00 ` Mike Rapoport
2019-02-28 2:47 ` Peter Xu
2019-02-26 8:00 ` Mike Rapoport
2019-02-12 2:56 ` [PATCH v2 24/26] userfaultfd: wp: UFFDIO_REGISTER_MODE_WP documentation update Peter Xu
2019-02-21 18:38 ` Jerome Glisse
2019-02-25 21:19 ` Mike Rapoport
2019-02-26 6:53 ` Peter Xu
2019-02-26 7:04 ` Mike Rapoport
2019-02-26 7:42 ` Peter Xu
2019-02-12 2:56 ` [PATCH v2 25/26] userfaultfd: selftests: refactor statistics Peter Xu
2019-02-26 6:50 ` Mike Rapoport [this message]
2019-02-12 2:56 ` [PATCH v2 26/26] userfaultfd: selftests: add write-protect test Peter Xu
2019-02-26 6:58 ` Mike Rapoport
2019-02-26 7:52 ` Peter Xu
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=20190226065032.GC5873@rapoport-lnx \
--to=rppt@linux.ibm.com \
--cc=aarcange@redhat.com \
--cc=cracauer@cons.org \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=dplotnikov@virtuozzo.com \
--cc=gokhale2@llnl.gov \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=jglisse@redhat.com \
--cc=kirill@shutemov.name \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mcfadden8@llnl.gov \
--cc=mgorman@suse.de \
--cc=mike.kravetz@oracle.com \
--cc=peterx@redhat.com \
--cc=rppt@linux.vnet.ibm.com \
--cc=shli@fb.com \
--cc=xemul@virtuozzo.com \
/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).