Received: by 10.223.148.5 with SMTP id 5csp6281872wrq; Wed, 17 Jan 2018 11:41:55 -0800 (PST) X-Google-Smtp-Source: ACJfBosnHwPdaFkp7k34Db+DYN0eZnVwlaEuhLsS/KCl5ubakiNMIYA51HKiuxDyI/2X2cJkthVW X-Received: by 10.84.234.137 with SMTP id n9mr12410717plk.212.1516218115111; Wed, 17 Jan 2018 11:41:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516218115; cv=none; d=google.com; s=arc-20160816; b=WwHo/B+SYC2u3p4JE86dfhWBnm+N3OFZa43ZJFV09fJEvMhNXoC7oIkI3fXTMy7lvk lOlUEZxfNfZ7tROBK0zZV6wB4D60FYFxguDruGohSV5pUZ400JHajYbujAGVRfZO5G1q CLOuk1McuRc+GBqCq1AoECCfChL2CWsQmy9uYHV++Jsjp9qKGwBoUP98ZY8QazqzkyJX riJbfZTgyoRScAAf5qWfbxb8bMamuYHwSGNtXyB5HbJ6USQGF2wa9gm4ID0nS8KTv0/j iWacwJ0uGR90lL8+aZyR5H9Q1+K7jROnXA+rSd8PX4qBZa6ssFfDXlU3JJuq2w94Al8W TTfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=VpqakcI8sYAELFAySdoxDqEkH5q2dVZz9XV5xzL+7c8=; b=ExbQVldfcpmaHuDGtinJM9XdatzZm39cHWmzFUqu830XSqE5ru87l/l5RDyLCgQfVd bcxJvN1b/hvIpfFCqDPHjc/CBC7Kkquno5dGdTRWmT7LURSGTcn7DHXGD1x5cHh2NZug WjRZwb6lxTl2K+1bmsEg4r2cvAvveOERW9kVhqmYPF2v/Hxg3v3ikELsCwvCDrJyyifH LzEuaorDGITmYWv7C3Nl3jpsVx/AcgH3l9R/ejGJQEfN5k2eitxYexMup+OxS3BOV3rm AcNBgG+GHMwHSz0yoGwQw8K+VFleuSXAiMM3N8bjKcnLKMkjP55DGi+nX7cHLz7tyhFU jIFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=Zu/DEEOz; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x11si4426816pln.665.2018.01.17.11.41.41; Wed, 17 Jan 2018 11:41:55 -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=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=Zu/DEEOz; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753334AbeAQT2R (ORCPT + 99 others); Wed, 17 Jan 2018 14:28:17 -0500 Received: from bombadil.infradead.org ([65.50.211.133]:42337 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753201AbeAQT2M (ORCPT ); Wed, 17 Jan 2018 14:28:12 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=References:In-Reply-To:Message-Id: Date:Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=VpqakcI8sYAELFAySdoxDqEkH5q2dVZz9XV5xzL+7c8=; b=Zu/DEEOzsZGbQzdGsBd7NCTz1 Gk2Q9XMjIaOxBPpN0MYuJM3L1zndGzu+88Q7If++egKWd4HrJCJH012KH+9GUSq+KDVuX12p3AkSm FdQhgIT3VTTehE0N1pM22+0sTPygQrNLJNqbCYZFA1IHFkm36mw0yUZjO4oW7zCaW0sN4qcSP3jxA U//DZUFrYOwJG3TDMRbIKAvd+AFpOtkz1el7LM3pG9KKtWY5S5/NcC6pXlhG2tJb+hNBj9OqBrnFu NhQL/hkuAP6VUDlK72dukRGTnTbTTqonvHF5Ffg28v595M5tz9URHABCPDhAUXmOGqx+0lptFbl8I 2qbtkyUtw==; Received: from 77.117.185.35.wireless.dyn.drei.com ([77.117.185.35] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.89 #1 (Red Hat Linux)) id 1ebtNa-000301-6N; Wed, 17 Jan 2018 19:28:10 +0000 From: Christoph Hellwig To: viro@zeniv.linux.org.uk Cc: Avi Kivity , linux-aio@kvack.org, linux-fsdevel@vger.kernel.org, netdev@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 07/36] aio: add delayed cancel support Date: Wed, 17 Jan 2018 20:27:13 +0100 Message-Id: <20180117192742.710-8-hch@lst.de> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180117192742.710-1-hch@lst.de> References: <20180117192742.710-1-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The upcoming aio poll support would like to be able to complete the iocb inline from the cancellation context, but that would cause a lock order reversal. Add support for optionally moving the cancelation outside the context lock to avoid this reversal. Signed-off-by: Christoph Hellwig Acked-by: Jeff Moyer --- fs/aio.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/fs/aio.c b/fs/aio.c index 0b6394b4e528..9d7d6e4cde87 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -170,6 +170,10 @@ struct aio_kiocb { struct list_head ki_list; /* the aio core uses this * for cancellation */ + unsigned int flags; /* protected by ctx->ctx_lock */ +#define AIO_IOCB_DELAYED_CANCEL (1 << 0) +#define AIO_IOCB_CANCELLED (1 << 1) + /* * If the aio_resfd field of the userspace iocb is not zero, * this is the underlying eventfd context to deliver events to. @@ -536,9 +540,9 @@ static int aio_setup_ring(struct kioctx *ctx, unsigned int nr_events) #define AIO_EVENTS_FIRST_PAGE ((PAGE_SIZE - sizeof(struct aio_ring)) / sizeof(struct io_event)) #define AIO_EVENTS_OFFSET (AIO_EVENTS_PER_PAGE - AIO_EVENTS_FIRST_PAGE) -void kiocb_set_cancel_fn(struct kiocb *iocb, kiocb_cancel_fn *cancel) +static void __kiocb_set_cancel_fn(struct aio_kiocb *req, + kiocb_cancel_fn *cancel, unsigned int iocb_flags) { - struct aio_kiocb *req = container_of(iocb, struct aio_kiocb, rw); struct kioctx *ctx = req->ki_ctx; unsigned long flags; @@ -548,8 +552,15 @@ void kiocb_set_cancel_fn(struct kiocb *iocb, kiocb_cancel_fn *cancel) spin_lock_irqsave(&ctx->ctx_lock, flags); list_add_tail(&req->ki_list, &ctx->active_reqs); req->ki_cancel = cancel; + req->flags |= iocb_flags; spin_unlock_irqrestore(&ctx->ctx_lock, flags); } + +void kiocb_set_cancel_fn(struct kiocb *iocb, kiocb_cancel_fn *cancel) +{ + return __kiocb_set_cancel_fn(container_of(iocb, struct aio_kiocb, rw), + cancel, 0); +} EXPORT_SYMBOL(kiocb_set_cancel_fn); /* @@ -603,17 +614,27 @@ static void free_ioctx_users(struct percpu_ref *ref) { struct kioctx *ctx = container_of(ref, struct kioctx, users); struct aio_kiocb *req; + LIST_HEAD(list); spin_lock_irq(&ctx->ctx_lock); - while (!list_empty(&ctx->active_reqs)) { req = list_first_entry(&ctx->active_reqs, struct aio_kiocb, ki_list); - kiocb_cancel(req); - } + if (req->flags & AIO_IOCB_DELAYED_CANCEL) { + req->flags |= AIO_IOCB_CANCELLED; + list_move_tail(&req->ki_list, &list); + } else { + kiocb_cancel(req); + } + } spin_unlock_irq(&ctx->ctx_lock); + while (!list_empty(&list)) { + req = list_first_entry(&list, struct aio_kiocb, ki_list); + kiocb_cancel(req); + } + percpu_ref_kill(&ctx->reqs); percpu_ref_put(&ctx->reqs); } @@ -1785,15 +1806,22 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, if (unlikely(!ctx)) return -EINVAL; - spin_lock_irq(&ctx->ctx_lock); + ret = -EINVAL; + spin_lock_irq(&ctx->ctx_lock); kiocb = lookup_kiocb(ctx, iocb, key); + if (kiocb) { + if (kiocb->flags & AIO_IOCB_DELAYED_CANCEL) { + kiocb->flags |= AIO_IOCB_CANCELLED; + } else { + ret = kiocb_cancel(kiocb); + kiocb = NULL; + } + } + spin_unlock_irq(&ctx->ctx_lock); + if (kiocb) ret = kiocb_cancel(kiocb); - else - ret = -EINVAL; - - spin_unlock_irq(&ctx->ctx_lock); if (!ret) { /* @@ -1805,7 +1833,6 @@ SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb, } percpu_ref_put(&ctx->users); - return ret; } -- 2.14.2