Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp4703614ybl; Sat, 21 Dec 2019 12:14:48 -0800 (PST) X-Google-Smtp-Source: APXvYqwrKrXH5wk/JoF5AuBXe5AS7hx6+j0nppUjPo6Ta1TPCjBhagdaZc9snI18/FxiqtS43Sm0 X-Received: by 2002:a05:6830:4a4:: with SMTP id l4mr22993703otd.91.1576959287930; Sat, 21 Dec 2019 12:14:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1576959287; cv=none; d=google.com; s=arc-20160816; b=s+lf6QdZH7EnqXePFVScSfIKOtz/8z67KMTQo6nUaNM1T3p60iCJ9elk3nocz5QB7s gZSxJ+eYZcJmjhjbHdyWHweW2B3tnC3y/wlFMwMdjRUm6+UonXE2SJ+XfjLLiDvwwWYi VHP7gxswGJvDb37kxevJZYajv0/RfdFu0KennKa4rEXJhnl460y5GLDvV0CsJ1KJ5qVX L+EPSLUhGvWiZLzBfo0Ok0rIWwblngMfTZAhZTgvET/HZ4p1B+oCas9HV7JB8m4RkJfL AOsbXgzfg8ouqSY8sMAGffhIFHPjkQQyEIHatt3acEukkUXesS39j0VynJrbZQYd18PT hrHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=UipHCb83ruP90ECQEg5f6zgvM+zJSXnBrw+F0UKt9U0=; b=bY2tSCXLZjhEajnWmHoxMGwYgXSfVFrT2qYu+lsmTl0OHoHCSDbMPIvnIiNXy3xMwZ svfMuycgC4fQ4kCqXRzn9HDuJqmLapCMfGsb9aMlzVU2TFBdaw04f2P8hVLF6WC7dKBP 1zYcMRGsaIMHKm9+uH7PdEp9mMB9FIHtBw3BDcNUtNI8E466i15y9p4+JAW6xY7ldRBx hbnE4F++Nu3yba+V1sTrsoOtEtav+Sh3WS0ZPvZfvx0aRLjs99Gj0sZIFcvt3v1NkOdB aWgz170/5SSDkfvsQNJ5qkKNR0VMHIT2nlotku3eNYfl9tXEzP98+tWPJf0QVEZgNqSV c+Iw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="NI/MpqL5"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h14si8032212otn.6.2019.12.21.12.14.36; Sat, 21 Dec 2019 12:14:47 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="NI/MpqL5"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727426AbfLUUNd (ORCPT + 99 others); Sat, 21 Dec 2019 15:13:33 -0500 Received: from mail-wm1-f48.google.com ([209.85.128.48]:39364 "EHLO mail-wm1-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727370AbfLUUNb (ORCPT ); Sat, 21 Dec 2019 15:13:31 -0500 Received: by mail-wm1-f48.google.com with SMTP id 20so12378691wmj.4; Sat, 21 Dec 2019 12:13:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=UipHCb83ruP90ECQEg5f6zgvM+zJSXnBrw+F0UKt9U0=; b=NI/MpqL5XTZJ9FFg62mmBeL3cVB0ZvhSCPPT7LkOaYDGXqEOnBNORyh5Y8oQVq+FXH d+s9ONsAurSDiKl3wLjuzmcLRjmd6THHOmqncoKetazwxZSylaOCij+HyhJ6dt64ZfA4 nZ8fWp5IAVOWqbmuEqPtiCKS9NMWDM+4VPqc9THPUck7f29+o8xb6tR5AWcLJRWkLiEF 3YjoO29GXCJtDhqQu7l2+LRW6aVSIEkEiKNTIqGJyjh0c3ajYUUPZH0isRhAnWldUL5K ZHWxnz6jrrA3zR8zaTEfHqSvBM4nF78ixrMWZDqVmjNx3B7Axze6AgdkdAWxZAQmpx3D J+2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UipHCb83ruP90ECQEg5f6zgvM+zJSXnBrw+F0UKt9U0=; b=F89wf+GKfn4px/vE8a5qZh4uhtOGLWjm3w8sKYZEDQn6f7tC8vAlbBUYlNvOAGVMoO 2lA3f3T0PBK1C/YeaqtATOD1V5E5InGBmkJSTDcUpMvyLL5N+DeN+FbjASfKU3EeksZB L/1nsUsC7T6Du4XnltOa+hABzYbSqpYFInYUSVdx+a2jYuxgK6dtJpw/kE+KRmGSJlbc mmUkOF85a6/xY+Kx2pjYZwHNjAv3RZa5QTWJ5AfNwTLpBAo2vjZ5RbZMDYgQZEHRss57 hbQWeoNzNELmbAG5Y6i/HtI608sM8n2QLwFOhhrejSPp9EFA99i9Nc7A2p0nP3bJU7ST yaCQ== X-Gm-Message-State: APjAAAV5OeASPzn6WX7mS57Ac/HN1TxOo5yZdYo3PBXXPxHXZ54vxXt7 tHcwiXJlh6t1zsN5yz92y78= X-Received: by 2002:a1c:a543:: with SMTP id o64mr22203963wme.73.1576959208605; Sat, 21 Dec 2019 12:13:28 -0800 (PST) Received: from localhost.localdomain ([109.126.149.134]) by smtp.gmail.com with ESMTPSA id l7sm14470821wrq.61.2019.12.21.12.13.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Dec 2019 12:13:28 -0800 (PST) From: Pavel Begunkov To: Jens Axboe , io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 2/2] io_uring: batch getting pcpu references Date: Sat, 21 Dec 2019 23:12:54 +0300 Message-Id: X-Mailer: git-send-email 2.24.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org percpu_ref_tryget() has its own overhead. Instead getting a reference for each request, grab a bunch once per io_submit_sqes(). basic benchmark with submit and wait 128 non-linked nops showed ~5% performance gain. (7044 KIOPS vs 7423) Signed-off-by: Pavel Begunkov --- It's just becoming more bulky with ret for me, and would love to hear, hot to make it clearer. This version removes all error handling from hot path, though with goto. fs/io_uring.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/io_uring.c b/fs/io_uring.c index 513f1922ce6a..b89a8b975c69 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1045,9 +1045,6 @@ static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx, gfp_t gfp = GFP_KERNEL | __GFP_NOWARN; struct io_kiocb *req; - if (!percpu_ref_tryget(&ctx->refs)) - return NULL; - if (!state) { req = kmem_cache_alloc(req_cachep, gfp); if (unlikely(!req)) @@ -4400,6 +4397,9 @@ static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr, return -EBUSY; } + if (!percpu_ref_tryget_many(&ctx->refs, nr)) + return -EAGAIN; + if (nr > IO_PLUG_THRESHOLD) { io_submit_state_start(&state, nr); statep = &state; @@ -4408,16 +4408,22 @@ static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr, for (i = 0; i < nr; i++) { const struct io_uring_sqe *sqe; struct io_kiocb *req; + unsigned int unused_refs; req = io_get_req(ctx, statep); if (unlikely(!req)) { + unused_refs = nr - submitted; if (!submitted) submitted = -EAGAIN; +put_refs: + percpu_ref_put_many(&ctx->refs, unused_refs); break; } if (!io_get_sqring(ctx, req, &sqe)) { __io_free_req(req); - break; + /* __io_free_req() puts a ref */ + unused_refs = nr - submitted - 1; + goto put_refs; } /* will complete beyond this point, count as submitted */ -- 2.24.0