From patchwork Sat Sep 29 08:43:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Xu X-Patchwork-Id: 10620685 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 06BAE6CB for ; Sat, 29 Sep 2018 08:43:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE48C29630 for ; Sat, 29 Sep 2018 08:43:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E1DB529734; Sat, 29 Sep 2018 08:43:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 71DBD29630 for ; Sat, 29 Sep 2018 08:43:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 54B028E0004; Sat, 29 Sep 2018 04:43:31 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 4FB618E0005; Sat, 29 Sep 2018 04:43:31 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3C40D8E0004; Sat, 29 Sep 2018 04:43:31 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by kanga.kvack.org (Postfix) with ESMTP id 0FDDE8E0001 for ; Sat, 29 Sep 2018 04:43:31 -0400 (EDT) Received: by mail-qt1-f200.google.com with SMTP id p52-v6so8099740qtf.9 for ; Sat, 29 Sep 2018 01:43:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=ye/75/THLV4vdRy1JAIrltokdN0e0k9yoEs0CUVH5OA=; b=dLsbRHvMAIr1kAd9fJFNsohwLnhJqdFFuGBLVyKkG38YdCF2IrzIYFdQlEEd/VceS/ WSCYkcRiVQ1c6hmiv2g1XqwwdwWHrGHaEhFOw0ZSn0y9A4RokgjDgiGCaTJS+VWgG/Cb o6H4CY0Ou0f/oQDSPfIq91m8Z8UEuNIFC5SNeBTtX8HbNiDP4RHirWfS4z3TDt/XsXsh 7+Z+4S3juaX4w8WdtHWG9lePYHeHzyOGCGJdvFB0tJyL2NyJbkbLKWlg+Fm8YHvF/iW6 /DAHZg/XQJOMNezRoux+nVvpgfSznJ8ZCs0cT9A7uhX1pbEZZ6FMUayAWPuP44bRDxmZ YaLA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of peterx@redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com X-Gm-Message-State: ABuFfohThTpxtmRg2EApuVVQJiVJMc0lRq8b1/JRbCXd7xGBC/b2l7xs u3A2VIpj7WQkQr+ZxqFr3beGfyA9uGL5Bl7xIFiiZ5qS1Z2QACAOx49PwYT6mlu0EtHUXbeVOhF 1eQsHj/WmqlScJZyKIpezYnDWurFo/o2wfJpglLLvocMaIrrHzr2EFK8dx57EcuYKLg== X-Received: by 2002:a0c:fe87:: with SMTP id d7-v6mr1747394qvs.102.1538210610792; Sat, 29 Sep 2018 01:43:30 -0700 (PDT) X-Google-Smtp-Source: ACcGV60yeniDDkZMTpU0oBW4eDV8kacxbq1B2iZtk6Z5rPILN2QFTm0OlEJ9tFxyLJyUFuBllLMP X-Received: by 2002:a0c:fe87:: with SMTP id d7-v6mr1747374qvs.102.1538210610219; Sat, 29 Sep 2018 01:43:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538210610; cv=none; d=google.com; s=arc-20160816; b=0t9rDv28DC7A9/Hx47vcSrzBIdPhp0ZKm3TeINWPInGtLNYBrw4Mj4K6nvztmQ/D1/ 5KPm74lltxhTldPMAV5aIPO3nq682MswUhO43nH8mR1PaEFwSDKZf4174f4YK6tsnAEm SneJoCsQ+tWwhLkBXRdbkuH5WvDKxbivj3QbHPqNio9YMRcnl7A9roFJn7zMd9sT1wnG tcGp+7dd6srck0yzc9KNc3lb4px0aibADcieQVWgcIRdcnmSy6Vo8ZiCoTdiav8G9PQN 23woWIP1Jm+jz5NROF/9Wv629Nl8fcw/LhA6XBUswFa8kxlamHomuJSdXQ+c0uL8FLKo 51YA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=ye/75/THLV4vdRy1JAIrltokdN0e0k9yoEs0CUVH5OA=; b=IRv1nuoL94RmrIEe96k5xn6zLy54Y9L9U0m88nNGfOQAPbvxGAeaG1ZpHJ8sTE8rcx npDqBIOFyOZdrO3QdQXQjx5tayDCavAmlXjut5sgvsLGlNlWOMLaGcVtnssWjs9pl7Uw qv7bysIGv/u0Vv7wKDH1IqvOjamtzKRArnOPGKM8yjy5GUyDabboKBizdQ+DZ92BG8UO 9mB28uwfasM0Bf5h9KYFWBH8W4JfKAm43NdG/u8XIJu7yCJi+ke4mGSVvQBfpS7JB/Na gj/Ot/3KMh1rx0VPdIaLsE4I/D5A4bcCAfXHm5whcjC2+U0KkSXeLzzAVSrpsPKta0HG Jpfg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of peterx@redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from mx1.redhat.com (mx1.redhat.com. [209.132.183.28]) by mx.google.com with ESMTPS id b3-v6si2106869qvo.193.2018.09.29.01.43.30 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 29 Sep 2018 01:43:30 -0700 (PDT) Received-SPF: pass (google.com: domain of peterx@redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; Authentication-Results: mx.google.com; spf=pass (google.com: domain of peterx@redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=peterx@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4C8398762B; Sat, 29 Sep 2018 08:43:29 +0000 (UTC) Received: from xz-x1.nay.redhat.com (dhcp-14-128.nay.redhat.com [10.66.14.128]) by smtp.corp.redhat.com (Postfix) with ESMTP id F0C6A106A790; Sat, 29 Sep 2018 08:43:24 +0000 (UTC) From: Peter Xu To: linux-kernel@vger.kernel.org Cc: Shuah Khan , Jerome Glisse , Mike Rapoport , Mike Kravetz , peterx@redhat.com, linux-mm@kvack.org, Zi Yan , "Kirill A . Shutemov" , linux-kselftest@vger.kernel.org, Shaohua Li , Andrea Arcangeli , "Dr . David Alan Gilbert" , Andrew Morton Subject: [PATCH 2/3] userfaultfd: selftest: generalize read and poll Date: Sat, 29 Sep 2018 16:43:10 +0800 Message-Id: <20180929084311.15600-3-peterx@redhat.com> In-Reply-To: <20180929084311.15600-1-peterx@redhat.com> References: <20180929084311.15600-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Sat, 29 Sep 2018 08:43:29 +0000 (UTC) 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: X-Virus-Scanned: ClamAV using ClamSMTP We do very similar things in read and poll modes, but we're copying the codes around. Share the codes properly on reading the message and handling the page fault to make the code cleaner. Meanwhile this solves previous mismatch of behaviors between the two modes on that the old code: - did not check EAGAIN case in read() mode - ignored BOUNCE_VERIFY check in read() mode Signed-off-by: Peter Xu --- tools/testing/selftests/vm/userfaultfd.c | 76 +++++++++++++----------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index 2a84adaf8cf8..f79706f13ce7 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -449,6 +449,42 @@ static int copy_page(int ufd, unsigned long offset) return __copy_page(ufd, offset, false); } +static int uffd_read_msg(int ufd, struct uffd_msg *msg) +{ + int ret = read(uffd, msg, sizeof(*msg)); + + if (ret != sizeof(*msg)) { + if (ret < 0) + if (errno == EAGAIN) + return 1; + else + perror("blocking read error"), exit(1); + else + fprintf(stderr, "short read\n"), exit(1); + } + + return 0; +} + +/* Return 1 if page fault handled by us; otherwise 0 */ +static int uffd_handle_page_fault(struct uffd_msg *msg) +{ + unsigned long offset; + + if (msg->event != UFFD_EVENT_PAGEFAULT) + fprintf(stderr, "unexpected msg event %u\n", + msg->event), exit(1); + + if (bounces & BOUNCE_VERIFY && + msg->arg.pagefault.flags & UFFD_PAGEFAULT_FLAG_WRITE) + fprintf(stderr, "unexpected write fault\n"), exit(1); + + offset = (char *)(unsigned long)msg->arg.pagefault.address - area_dst; + offset &= ~(page_size-1); + + return copy_page(uffd, offset); +} + static void *uffd_poll_thread(void *arg) { unsigned long cpu = (unsigned long) arg; @@ -456,7 +492,6 @@ static void *uffd_poll_thread(void *arg) struct uffd_msg msg; struct uffdio_register uffd_reg; int ret; - unsigned long offset; char tmp_chr; unsigned long userfaults = 0; @@ -480,25 +515,15 @@ static void *uffd_poll_thread(void *arg) if (!(pollfd[0].revents & POLLIN)) fprintf(stderr, "pollfd[0].revents %d\n", pollfd[0].revents), exit(1); - ret = read(uffd, &msg, sizeof(msg)); - if (ret < 0) { - if (errno == EAGAIN) - continue; - perror("nonblocking read error"), exit(1); - } + if (uffd_read_msg(uffd, &msg)) + continue; switch (msg.event) { default: fprintf(stderr, "unexpected msg event %u\n", msg.event), exit(1); break; case UFFD_EVENT_PAGEFAULT: - if (msg.arg.pagefault.flags & UFFD_PAGEFAULT_FLAG_WRITE) - fprintf(stderr, "unexpected write fault\n"), exit(1); - offset = (char *)(unsigned long)msg.arg.pagefault.address - - area_dst; - offset &= ~(page_size-1); - if (copy_page(uffd, offset)) - userfaults++; + userfaults += uffd_handle_page_fault(&msg); break; case UFFD_EVENT_FORK: close(uffd); @@ -526,8 +551,6 @@ static void *uffd_read_thread(void *arg) { unsigned long *this_cpu_userfaults; struct uffd_msg msg; - unsigned long offset; - int ret; this_cpu_userfaults = (unsigned long *) arg; *this_cpu_userfaults = 0; @@ -536,24 +559,9 @@ static void *uffd_read_thread(void *arg) /* from here cancellation is ok */ for (;;) { - ret = read(uffd, &msg, sizeof(msg)); - if (ret != sizeof(msg)) { - if (ret < 0) - perror("blocking read error"), exit(1); - else - fprintf(stderr, "short read\n"), exit(1); - } - if (msg.event != UFFD_EVENT_PAGEFAULT) - fprintf(stderr, "unexpected msg event %u\n", - msg.event), exit(1); - if (bounces & BOUNCE_VERIFY && - msg.arg.pagefault.flags & UFFD_PAGEFAULT_FLAG_WRITE) - fprintf(stderr, "unexpected write fault\n"), exit(1); - offset = (char *)(unsigned long)msg.arg.pagefault.address - - area_dst; - offset &= ~(page_size-1); - if (copy_page(uffd, offset)) - (*this_cpu_userfaults)++; + if (uffd_read_msg(uffd, &msg)) + continue; + (*this_cpu_userfaults) += uffd_handle_page_fault(&msg); } return (void *)NULL; }