From patchwork Sun Sep 30 07:42:58 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Xu X-Patchwork-Id: 10621179 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 397DB15A7 for ; Sun, 30 Sep 2018 07:43:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2CAD3295D5 for ; Sun, 30 Sep 2018 07:43:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2082A295E3; Sun, 30 Sep 2018 07:43:21 +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=ham 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 DB847295D5 for ; Sun, 30 Sep 2018 07:43:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id ABDDA8E0004; Sun, 30 Sep 2018 03:43:18 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id A6C908E0001; Sun, 30 Sep 2018 03:43:18 -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 984378E0004; Sun, 30 Sep 2018 03:43:18 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by kanga.kvack.org (Postfix) with ESMTP id 68A5B8E0001 for ; Sun, 30 Sep 2018 03:43:18 -0400 (EDT) Received: by mail-qt1-f199.google.com with SMTP id a26-v6so5395727qtb.22 for ; Sun, 30 Sep 2018 00:43:18 -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=9n1oKLJ3RGsLL5H5sw+MzDdr6BZPb2MRjost1v5zfrc=; b=VMzWc1WI91tGL6MNZUxwzLaF80iCnQ9L0jf1RUughm2UAb6rUvBq6CBgI2lpxGDOY5 Yhj6INXbtn/rNRIERyojFCIOXyLW/fvyTdyvcL11Q3ONa8BTgZkaVW0Vw2AweRuAHM3W YQnE/MBqtlXZsvCkEd0IzBEm5PRpeaydv07eSgDJt4QybxUF1CpidevkTCbh/bK0yZkP pu04x0DEk5LEYhJoI1c45scRBQkIDAeio3t4xNvP5/vTZ2vLhKUZl20Tzdj4KS3hztBZ p7pJNRTfo+BiV0UPezhR9oleQRvG/gmFfyas8l7c0d6GStfNwkxfuETsJ+Z+9tuMbjRz JZrw== 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: ABuFfoiraSYSHlQ1sGLtCnpcuy5cOKEPRkZqRPCsgDvZpP257VAtLv5p nP/QU8NOFQGQ2BGvuoQ2lT7Gz27AcAtARaTfIn+/GIY9GqbBDW4jK68PleN+o75UwNabu69xEgO AaZ4BPhN4XWKwH1NMbLyjnVFFON7UPYwMngwbserrNFPYz5D+cqxOJobydxmveUB2LQ== X-Received: by 2002:ac8:2a13:: with SMTP id k19-v6mr4423384qtk.245.1538293398200; Sun, 30 Sep 2018 00:43:18 -0700 (PDT) X-Google-Smtp-Source: ACcGV61PQz7rl9Xzxs1oCFuC76A5uyeT21wio26GajfFb4yIymmp3OHoV5s+vSovpH4Ckoatixgf X-Received: by 2002:ac8:2a13:: with SMTP id k19-v6mr4423373qtk.245.1538293397631; Sun, 30 Sep 2018 00:43:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538293397; cv=none; d=google.com; s=arc-20160816; b=JyPF5n3V0ZfY7Y9ndzL5VstAvuCr7cYsqQ8WKle5PUuMcTXMsMci72t8O4KXNCiV4P aCNJjNteW5bnzfB99yNokTvQtXF6WphInG3ymVaWEpgcLCNf+nrOY2Gwudh3NLHHJ/5I AYumm0rCIRRPbJNznlaDwOS4W0zyjgvzCFOHTXaG/yhwiN8XJOhsAQPhNigd8Ktu88Vz j+LaX9FNjcwjVwTvEuEYgZeGHSGseWrl9+OhN8lIXSM7mugzoivSzVYMJvtfUPQ8WTik HKU3Mu3imDblyWVEs3W6NeUjO0xkvTxsbwslV5+ZN6sszmHYOOXH/A9cG6FjQEdvG+ZA ez0A== 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=9n1oKLJ3RGsLL5H5sw+MzDdr6BZPb2MRjost1v5zfrc=; b=LxtBvvDYisqtEHYkQgn5e34MUDnpbC5DeUqwEv1yxyzQerzd8vmc6i1CDp729uZoSw V9sNpclytiSF3NVka/rKeX9vDZZmCGHimDdN75xcitxvMcEBTaVNVHuxGjVmaAXaVHrL rPJ8A1G85ZgcwykuBBp1mzqggUUBZNaE6Fa3kqCASKnQr7vjIoPF6ZLuXAMcP47Yo2M4 Q0g7jY/jDYGiKLmBN0df+ZRHztq6kX+6Xgrw48rZ2gg3Yn6pIL0NZ22+FfeJhk1LYvgf NeOKsTU6Xueuz7Gg9Ht260HRKJ/5+GU+X7LGcKQ2ovRfuhp8KfOLyQJbJjF0MZ0PGGfQ PlGg== 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 k66-v6si1837815qke.234.2018.09.30.00.43.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 30 Sep 2018 00:43:17 -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-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C26BA81F0B; Sun, 30 Sep 2018 07:43:16 +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 786306016F; Sun, 30 Sep 2018 07:43:12 +0000 (UTC) From: Peter Xu To: linux-kernel@vger.kernel.org Cc: Shuah Khan , Mike Kravetz , Mike Rapoport , Jerome Glisse , 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 v2 2/3] userfaultfd: selftest: generalize read and poll Date: Sun, 30 Sep 2018 15:42:58 +0800 Message-Id: <20180930074259.18229-3-peterx@redhat.com> In-Reply-To: <20180930074259.18229-1-peterx@redhat.com> References: <20180930074259.18229-1-peterx@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Sun, 30 Sep 2018 07:43:16 +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 Acked-by: Mike Rapoport --- tools/testing/selftests/vm/userfaultfd.c | 77 +++++++++++++----------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index 5ff3a4f9173e..7a8c6937cc67 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -451,6 +451,43 @@ 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; @@ -458,7 +495,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; @@ -482,25 +518,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); @@ -528,8 +554,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; @@ -538,24 +562,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; }