Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp68738pxb; Wed, 18 Nov 2020 16:47:30 -0800 (PST) X-Google-Smtp-Source: ABdhPJyEdZ5GQWuEkJqN/1h6gcQr64l9sFbqK+hj7xeo9Y8G+Wd7unwgApit1Zocw+4WC71n2/4c X-Received: by 2002:a17:907:250b:: with SMTP id y11mr5630688ejl.39.1605746850302; Wed, 18 Nov 2020 16:47:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605746850; cv=none; d=google.com; s=arc-20160816; b=SP028nyEK1s9Ylg4RCAEInORBMu7cXp51E3Y6ZXXYqsL25n2D/DRHhEAt0M+IY8MVa U9pT/hoSlaBNgDGKZ49bE/VuLZHTKgs4FbNfJs8/0opAtZgcocXKjlS1xNURWNKHmqOl mdkyZRjIpk/HznE4Jt1ow9PNvRJWg0nQBGFCc4w+QVoJeaxlQB1zUPl79Rj4GPEAL9S3 eD9CEAmjaZQTgcRQQv2zzXFtIfueQOf20RLBSV7KGidSBDpQoLSFi5/EUsYSapDB1KV1 VXaaHVCuyeNF1Bm2THekCU3vNuvzsJzI3NZ1Bu8vRiJVIOoBlx7y0f14Rp6qTXePflbu Iokg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=vwvOdNltri8QeG/8NJREwvHkCBGEECJcvZZE736hY4g=; b=qQwu+hzn+V2pc3cM69Qc5TR57NjuuFZg5mbxb62q5rsR/FM3ocYH8jptBnd3Lsl6Rl 62A+LVicmQa5eSTEfh6fU/k4A3/dHSHp/IWopxie7j31QbK6GI9BKfmRz2OhMwY61udx 6ec8FmsTslRpgqgVksVVHY6eaCFizu5+iiQfYzXvf5kRqUezJcoPEp2N4ArSL3U06q2C +KCLbR2EAC866vB8hDotmOOau1hfYlLNpG1dtta71TZ/hMAXAyxNWwbZM+bcds46C0eq zyOj5N1C71hbZVC3m1AYOa4wgHgESIUzCyOnqhjls5qXw63pbeMkESMzjXuqFF4eVNxH V/bw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@axtens.net header.s=google header.b=lhpPTrHG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w3si1884212edl.155.2020.11.18.16.47.06; Wed, 18 Nov 2020 16:47:30 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@axtens.net header.s=google header.b=lhpPTrHG; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726739AbgKSAmo (ORCPT + 99 others); Wed, 18 Nov 2020 19:42:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726162AbgKSAmn (ORCPT ); Wed, 18 Nov 2020 19:42:43 -0500 Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B146DC0613D4 for ; Wed, 18 Nov 2020 16:42:43 -0800 (PST) Received: by mail-pl1-x643.google.com with SMTP id bj5so1168695plb.4 for ; Wed, 18 Nov 2020 16:42:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=axtens.net; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=vwvOdNltri8QeG/8NJREwvHkCBGEECJcvZZE736hY4g=; b=lhpPTrHGYU5nVBFNX5ArJFc05EAOTtLgysWxOa4ciurgWUviyxGN4iZV78F5KktPe6 J4MCAKsgOFCcyJ2VT/JZ6qLQzJG2+we59Dz3bsFjpDv9ABcKElxQLjX7Vt9Bn3ob86gh ok5v0yLYNsdq+N0xo7w+un75v7trNkUBSw0TY= 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:mime-version :content-transfer-encoding; bh=vwvOdNltri8QeG/8NJREwvHkCBGEECJcvZZE736hY4g=; b=ShUoTq2B6BJRp7KS7pcGAH6Z1Yg7oIsm58BDWLhvmx42+LjMgnFl5FJMf8Oq5WxkI6 xmugWNtKIj1GbveU9Cf6uxRPIAWPwNnwFtRlCIb8wec2zXs7lrUtCwC5AHWHrQgQq88e lZ475R2184Sr0psJms1iUcbbLH9FXiN13eevykJ4UeKOBJkQdv8Mm208qxaPqdeIL1WO YpnoSOG5/xXEuLFSGthd8qvnX7L4nNKLoX4IZBwz/VZnpJWbBEsgBLwKarL+PYw6h2Xs Nx5iy9+STzWf/1tKxrnVOFQEi/1Ws26AthBoEqRksRf1WB0lDfOUxpaCVr5/TSvVSACj 3NYg== X-Gm-Message-State: AOAM5319vFrFAXDk6+hlhy0yVaWcagmCojVSkA7brABExQFVrp2XYMaV zeKb7EuiN52tDve/9ElSN30JRg== X-Received: by 2002:a17:902:9689:b029:d8:e310:2fa2 with SMTP id n9-20020a1709029689b02900d8e3102fa2mr7104334plp.42.1605746562426; Wed, 18 Nov 2020 16:42:42 -0800 (PST) Received: from localhost (2001-44b8-111e-5c00-a5b9-f4da-efe6-5d34.static.ipv6.internode.on.net. [2001:44b8:111e:5c00:a5b9:f4da:efe6:5d34]) by smtp.gmail.com with ESMTPSA id y5sm3754343pja.52.2020.11.18.16.42.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Nov 2020 16:42:41 -0800 (PST) From: Daniel Axtens To: viro@zeniv.linux.org.uk, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: David.Laight@ACULAB.COM, hch@infradead.org, Daniel Axtens Subject: [PATCH RESEND v2] fs/select.c: batch user writes in do_sys_poll Date: Thu, 19 Nov 2020 11:42:35 +1100 Message-Id: <20201119004235.173373-1-dja@axtens.net> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When returning results to userspace, do_sys_poll repeatedly calls put_user() - once per fd that it's watching. This means that on architectures that support some form of kernel-to-userspace access protection, we end up enabling and disabling access once for each file descripter we're watching. This is inefficent and we can improve things. We could do careful batching of the opening and closing of the access window, or we could just copy the entire walk entries structure. While that copies more data, it potentially does so more efficiently, and the overhead is much less than the lock/unlock overhead. Unscientific benchmarking with the poll2_threads microbenchmark from will-it-scale, run as `./poll2_threads -t 1 -s 15`: - Bare-metal Power9 with KUAP: ~49% speed-up - VM on amd64 laptop with SMAP: ~25% speed-up Signed-off-by: Daniel Axtens --- fs/select.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fs/select.c b/fs/select.c index ebfebdfe5c69..4a74d1353ccb 100644 --- a/fs/select.c +++ b/fs/select.c @@ -1012,12 +1012,10 @@ static int do_sys_poll(struct pollfd __user *ufds, unsigned int nfds, poll_freewait(&table); for (walk = head; walk; walk = walk->next) { - struct pollfd *fds = walk->entries; - int j; - - for (j = 0; j < walk->len; j++, ufds++) - if (__put_user(fds[j].revents, &ufds->revents)) - goto out_fds; + if (copy_to_user(ufds, walk->entries, + sizeof(struct pollfd) * walk->len)) + goto out_fds; + ufds += walk->len; } err = fdcount; -- 2.25.1