From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.9 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9B30CC11D0C for ; Thu, 20 Feb 2020 16:32:09 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 44BAD2467B for ; Thu, 20 Feb 2020 16:32:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="dKocii9P" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 44BAD2467B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 354286B0078; Thu, 20 Feb 2020 11:31:53 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 329E46B007B; Thu, 20 Feb 2020 11:31:53 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1D1546B007D; Thu, 20 Feb 2020 11:31:53 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0092.hostedemail.com [216.40.44.92]) by kanga.kvack.org (Postfix) with ESMTP id E4BDF6B0078 for ; Thu, 20 Feb 2020 11:31:52 -0500 (EST) Received: from smtpin22.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 9117A180AD811 for ; Thu, 20 Feb 2020 16:31:52 +0000 (UTC) X-FDA: 76511046864.22.truck95_2d631487b585b X-HE-Tag: truck95_2d631487b585b X-Filterd-Recvd-Size: 12369 Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by imf42.hostedemail.com (Postfix) with ESMTP for ; Thu, 20 Feb 2020 16:31:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582216311; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dTdyqZ+/TYORXYjz/Xpk4iA/3qDw713YNLGi0sPlcrc=; b=dKocii9Pg1IpajzGw1TycqZRyQ1MwzwSZW6bImDq6eZv9hPEwjP6tbv0PLSXzdQDkCY6CU PDLKKI1J61oRi3GJgWnHSO3OWYIamPI0/HmevLpKDjXXydMRHbDDbSALhbR4blewXm2E3n f6+wDxF+MyDbN4wlrMXfdyOB9FCeS3Y= Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-361-HO9-kM-uOUiuw08Uo8Nirg-1; Thu, 20 Feb 2020 11:31:49 -0500 Received: by mail-qk1-f200.google.com with SMTP id s189so3122536qke.5 for ; Thu, 20 Feb 2020 08:31:49 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=QYAQq6E5UlYPWuvsjWjKeDtfrqeA5DTAHRlXPC/q7Ms=; b=YJ0+qj+KJORRMdLtkwAIPuAXCHysBh1diKbl/woU6ZMTeHBV8+TgRVl0OhQlKj5PIR LUnrFlJMTatFy0e1evWJ/39SesdDhFi68YCoP+tI5jzi8td0b3Z9r70f+I3n/Sr6JcVk Rd+40kEstTbEyIDgTpw1rNnnM3MdBYDNBegVfE21Xu/mvgPzZI6RoeB39JUX5sVV8lQ1 3s14IRCDfUw32ZbOWAQfFyAmPaIOKXBRdZDFvxybLuq6EC4R0onvmRD5YdXtWmtAM34e FwpypejA5pyjtH8WxCH2sGtgfwpQIvxBh36PE3cFuyW1O5rY+GPGlC++mfU5V/mhQ5Kz 8rSQ== X-Gm-Message-State: APjAAAXEK25/yCGEG84Pg2RbKGpgSs1BfoQSy06KRvz8JIqkVXZB9hKG R2LkiJ5G4f6pWI6FgCbaRTD3VCe5WLqjX9vvLdxjPNpnoCHmKSdJ1g4NYs/h6cipMhtt442VYLF ruaoAjGnMlr4= X-Received: by 2002:a0c:e2d1:: with SMTP id t17mr26703783qvl.25.1582216308640; Thu, 20 Feb 2020 08:31:48 -0800 (PST) X-Google-Smtp-Source: APXvYqyLNVDHEEG2/6oQWETUpa9OSwxiD/DPD3oUxxcqnParhUhnFwES/fCYL8EweDKDtso7ao9Yxg== X-Received: by 2002:a0c:e2d1:: with SMTP id t17mr26703746qvl.25.1582216308313; Thu, 20 Feb 2020 08:31:48 -0800 (PST) Received: from xz-x1.redhat.com ([104.156.64.75]) by smtp.gmail.com with ESMTPSA id l19sm42366qkl.3.2020.02.20.08.31.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2020 08:31:47 -0800 (PST) From: Peter Xu To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Brian Geffon , Pavel Emelyanov , Mike Kravetz , David Hildenbrand , peterx@redhat.com, Martin Cracauer , Andrea Arcangeli , Mel Gorman , Bobby Powers , Mike Rapoport , "Kirill A . Shutemov" , Maya Gokhale , Johannes Weiner , Marty McFadden , Denis Plotnikov , Hugh Dickins , "Dr . David Alan Gilbert" , Jerome Glisse Subject: [PATCH v6 18/19] userfaultfd: selftests: refactor statistics Date: Thu, 20 Feb 2020 11:31:11 -0500 Message-Id: <20200220163112.11409-19-peterx@redhat.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200220163112.11409-1-peterx@redhat.com> References: <20200220163112.11409-1-peterx@redhat.com> MIME-Version: 1.0 X-MC-Unique: HO9-kM-uOUiuw08Uo8Nirg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: 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. Reviewed-by: Mike Rapoport Signed-off-by: Peter Xu --- 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/selft= ests/vm/userfaultfd.c index d3362777a425..3911a9ccb0bb 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -86,6 +86,12 @@ static char *area_src, *area_src_alias, *area_dst, *area= _dst_alias; static char *zeropage; pthread_attr_t attr; =20 +/* Userfaultfd test statistics */ +struct uffd_stats { +=09int cpu; +=09unsigned long missing_faults; +}; + /* pthread_mutex_t starts at page offset 0 */ #define area_mutex(___area, ___nr)=09=09=09=09=09\ =09((pthread_mutex_t *) ((___area) + (___nr)*page_size)) @@ -125,6 +131,17 @@ static void usage(void) =09exit(1); } =20 +static void uffd_stats_reset(struct uffd_stats *uffd_stats, +=09=09=09 unsigned long n_cpus) +{ +=09int i; + +=09for (i =3D 0; i < n_cpus; i++) { +=09=09uffd_stats[i].cpu =3D i; +=09=09uffd_stats[i].missing_faults =3D 0; +=09} +} + static int anon_release_pages(char *rel_area) { =09int ret =3D 0; @@ -467,8 +484,8 @@ static int uffd_read_msg(int ufd, struct uffd_msg *msg) =09return 0; } =20 -/* 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, +=09=09=09=09 struct uffd_stats *stats) { =09unsigned long offset; =20 @@ -483,18 +500,19 @@ static int uffd_handle_page_fault(struct uffd_msg *ms= g) =09offset =3D (char *)(unsigned long)msg->arg.pagefault.address - area_dst= ; =09offset &=3D ~(page_size-1); =20 -=09return copy_page(uffd, offset); +=09if (copy_page(uffd, offset)) +=09=09stats->missing_faults++; } =20 static void *uffd_poll_thread(void *arg) { -=09unsigned long cpu =3D (unsigned long) arg; +=09struct uffd_stats *stats =3D (struct uffd_stats *)arg; +=09unsigned long cpu =3D stats->cpu; =09struct pollfd pollfd[2]; =09struct uffd_msg msg; =09struct uffdio_register uffd_reg; =09int ret; =09char tmp_chr; -=09unsigned long userfaults =3D 0; =20 =09pollfd[0].fd =3D uffd; =09pollfd[0].events =3D POLLIN; @@ -524,7 +542,7 @@ static void *uffd_poll_thread(void *arg) =09=09=09=09msg.event), exit(1); =09=09=09break; =09=09case UFFD_EVENT_PAGEFAULT: -=09=09=09userfaults +=3D uffd_handle_page_fault(&msg); +=09=09=09uffd_handle_page_fault(&msg, stats); =09=09=09break; =09=09case UFFD_EVENT_FORK: =09=09=09close(uffd); @@ -543,28 +561,27 @@ static void *uffd_poll_thread(void *arg) =09=09=09break; =09=09} =09} -=09return (void *)userfaults; + +=09return NULL; } =20 pthread_mutex_t uffd_read_mutex =3D PTHREAD_MUTEX_INITIALIZER; =20 static void *uffd_read_thread(void *arg) { -=09unsigned long *this_cpu_userfaults; +=09struct uffd_stats *stats =3D (struct uffd_stats *)arg; =09struct uffd_msg msg; =20 -=09this_cpu_userfaults =3D (unsigned long *) arg; -=09*this_cpu_userfaults =3D 0; - =09pthread_mutex_unlock(&uffd_read_mutex); =09/* from here cancellation is ok */ =20 =09for (;;) { =09=09if (uffd_read_msg(uffd, &msg)) =09=09=09continue; -=09=09(*this_cpu_userfaults) +=3D uffd_handle_page_fault(&msg); +=09=09uffd_handle_page_fault(&msg, stats); =09} -=09return (void *)NULL; + +=09return NULL; } =20 static void *background_thread(void *arg) @@ -580,13 +597,12 @@ static void *background_thread(void *arg) =09return NULL; } =20 -static int stress(unsigned long *userfaults) +static int stress(struct uffd_stats *uffd_stats) { =09unsigned long cpu; =09pthread_t locking_threads[nr_cpus]; =09pthread_t uffd_threads[nr_cpus]; =09pthread_t background_threads[nr_cpus]; -=09void **_userfaults =3D (void **) userfaults; =20 =09finished =3D 0; =09for (cpu =3D 0; cpu < nr_cpus; cpu++) { @@ -595,12 +611,13 @@ static int stress(unsigned long *userfaults) =09=09=09return 1; =09=09if (bounces & BOUNCE_POLL) { =09=09=09if (pthread_create(&uffd_threads[cpu], &attr, -=09=09=09=09=09 uffd_poll_thread, (void *)cpu)) +=09=09=09=09=09 uffd_poll_thread, +=09=09=09=09=09 (void *)&uffd_stats[cpu])) =09=09=09=09return 1; =09=09} else { =09=09=09if (pthread_create(&uffd_threads[cpu], &attr, =09=09=09=09=09 uffd_read_thread, -=09=09=09=09=09 &_userfaults[cpu])) +=09=09=09=09=09 (void *)&uffd_stats[cpu])) =09=09=09=09return 1; =09=09=09pthread_mutex_lock(&uffd_read_mutex); =09=09} @@ -637,7 +654,8 @@ static int stress(unsigned long *userfaults) =09=09=09=09fprintf(stderr, "pipefd write error\n"); =09=09=09=09return 1; =09=09=09} -=09=09=09if (pthread_join(uffd_threads[cpu], &_userfaults[cpu])) +=09=09=09if (pthread_join(uffd_threads[cpu], +=09=09=09=09=09 (void *)&uffd_stats[cpu])) =09=09=09=09return 1; =09=09} else { =09=09=09if (pthread_cancel(uffd_threads[cpu])) @@ -908,11 +926,11 @@ static int userfaultfd_events_test(void) { =09struct uffdio_register uffdio_register; =09unsigned long expected_ioctls; -=09unsigned long userfaults; =09pthread_t uffd_mon; =09int err, features; =09pid_t pid; =09char c; +=09struct uffd_stats stats =3D { 0 }; =20 =09printf("testing events (fork, remap, remove): "); =09fflush(stdout); @@ -939,7 +957,7 @@ static int userfaultfd_events_test(void) =09=09=09"unexpected missing ioctl for anon memory\n"), =09=09=09exit(1); =20 -=09if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, NULL)) +=09if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats)) =09=09perror("uffd_poll_thread create"), exit(1); =20 =09pid =3D fork(); @@ -955,13 +973,13 @@ static int userfaultfd_events_test(void) =20 =09if (write(pipefd[1], &c, sizeof(c)) !=3D sizeof(c)) =09=09perror("pipe write"), exit(1); -=09if (pthread_join(uffd_mon, (void **)&userfaults)) +=09if (pthread_join(uffd_mon, NULL)) =09=09return 1; =20 =09close(uffd); -=09printf("userfaults: %ld\n", userfaults); +=09printf("userfaults: %ld\n", stats.missing_faults); =20 -=09return userfaults !=3D nr_pages; +=09return stats.missing_faults !=3D nr_pages; } =20 static int userfaultfd_sig_test(void) @@ -973,6 +991,7 @@ static int userfaultfd_sig_test(void) =09int err, features; =09pid_t pid; =09char c; +=09struct uffd_stats stats =3D { 0 }; =20 =09printf("testing signal delivery: "); =09fflush(stdout); @@ -1004,7 +1023,7 @@ static int userfaultfd_sig_test(void) =09if (uffd_test_ops->release_pages(area_dst)) =09=09return 1; =20 -=09if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, NULL)) +=09if (pthread_create(&uffd_mon, &attr, uffd_poll_thread, &stats)) =09=09perror("uffd_poll_thread create"), exit(1); =20 =09pid =3D fork(); @@ -1030,6 +1049,7 @@ static int userfaultfd_sig_test(void) =09close(uffd); =09return userfaults !=3D 0; } + static int userfaultfd_stress(void) { =09void *area; @@ -1038,7 +1058,7 @@ static int userfaultfd_stress(void) =09struct uffdio_register uffdio_register; =09unsigned long cpu; =09int err; -=09unsigned long userfaults[nr_cpus]; +=09struct uffd_stats uffd_stats[nr_cpus]; =20 =09uffd_test_ops->allocate_area((void **)&area_src); =09if (!area_src) @@ -1167,8 +1187,10 @@ static int userfaultfd_stress(void) =09=09if (uffd_test_ops->release_pages(area_dst)) =09=09=09return 1; =20 +=09=09uffd_stats_reset(uffd_stats, nr_cpus); + =09=09/* bounce pass */ -=09=09if (stress(userfaults)) +=09=09if (stress(uffd_stats)) =09=09=09return 1; =20 =09=09/* unregister */ @@ -1211,7 +1233,7 @@ static int userfaultfd_stress(void) =20 =09=09printf("userfaults:"); =09=09for (cpu =3D 0; cpu < nr_cpus; cpu++) -=09=09=09printf(" %lu", userfaults[cpu]); +=09=09=09printf(" %lu", uffd_stats[cpu].missing_faults); =09=09printf("\n"); =09} =20 --=20 2.24.1