From: Kent Overstreet <koverstreet@google.com> To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-aio@kvack.org Cc: akpm@linux-foundation.org, Kent Overstreet <koverstreet@google.com>, Zach Brown <zab@redhat.com>, Felipe Balbi <balbi@ti.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Mark Fasheh <mfasheh@suse.com>, Joel Becker <jlbec@evilplan.org>, Rusty Russell <rusty@rustcorp.com.au>, Jens Axboe <axboe@kernel.dk>, Asai Thambi S P <asamymuthupa@micron.com>, Selvan Mani <smani@micron.com>, Sam Bradshaw <sbradshaw@micron.com>, Jeff Moyer <jmoyer@redhat.com>, Al Viro <viro@zeniv.linux.org.uk>, Benjamin LaHaise <bcrl@kvack.org> Subject: [PATCH 19/21] aio/usb: Update cancellation for new synchonization Date: Mon, 13 May 2013 18:18:56 -0700 [thread overview] Message-ID: <1368494338-7069-20-git-send-email-koverstreet@google.com> (raw) In-Reply-To: <1368494338-7069-1-git-send-email-koverstreet@google.com> Previous patch got rid of kiocb->ki_users; this was done by having kiocb_cancel()/aio_complete() explicitly synchronize with each other. The new rule is that when a driver calls aio_complete(), after aio_complete() returns ki_cancel cannot be running and it's safe to dispose of kiocb->priv. But, this means ki_cancel() won't be able to call aio_complete() itself, or aio_complete() will deadlock. So, update the driver. Signed-off-by: Kent Overstreet <koverstreet@google.com> Cc: Zach Brown <zab@redhat.com> Cc: Felipe Balbi <balbi@ti.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Mark Fasheh <mfasheh@suse.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Jens Axboe <axboe@kernel.dk> Cc: Asai Thambi S P <asamymuthupa@micron.com> Cc: Selvan Mani <smani@micron.com> Cc: Sam Bradshaw <sbradshaw@micron.com> Cc: Jeff Moyer <jmoyer@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Benjamin LaHaise <bcrl@kvack.org> --- drivers/usb/gadget/inode.c | 61 +++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index f255ad7..69adb87 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c @@ -522,6 +522,7 @@ struct kiocb_priv { const struct iovec *iv; unsigned long nr_segs; unsigned actual; + int status; }; static int ep_aio_cancel(struct kiocb *iocb) @@ -577,14 +578,26 @@ static void ep_user_copy_worker(struct work_struct *work) struct kiocb_priv *priv = container_of(work, struct kiocb_priv, work); struct mm_struct *mm = priv->mm; struct kiocb *iocb = priv->iocb; - size_t ret; - use_mm(mm); - ret = ep_copy_to_user(priv); - unuse_mm(mm); + if (priv->iv && priv->actual) { + size_t ret; + + use_mm(mm); + ret = ep_copy_to_user(priv); + unuse_mm(mm); + + if (!priv->status) + priv->status = ret; + /* + * completing the iocb can drop the ctx and mm, don't touch mm + * after + */ + } - /* completing the iocb can drop the ctx and mm, don't touch mm after */ - aio_complete(iocb, ret, ret); + + /* aio_complete() reports bytes-transferred _and_ faults */ + aio_complete(iocb, priv->actual ? priv->actual : priv->status, + priv->status); kfree(priv->buf); kfree(priv); @@ -596,36 +609,18 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req) struct kiocb_priv *priv = iocb->private; struct ep_data *epdata = priv->epdata; - /* lock against disconnect (and ideally, cancel) */ - spin_lock(&epdata->dev->lock); - priv->req = NULL; - priv->epdata = NULL; - - /* if this was a write or a read returning no data then we - * don't need to copy anything to userspace, so we can - * complete the aio request immediately. - */ - if (priv->iv == NULL || unlikely(req->actual == 0)) { - kfree(req->buf); - kfree(priv); - iocb->private = NULL; - /* aio_complete() reports bytes-transferred _and_ faults */ - aio_complete(iocb, req->actual ? req->actual : req->status, - req->status); - } else { - /* ep_copy_to_user() won't report both; we hide some faults */ - if (unlikely(0 != req->status)) - DBG(epdata->dev, "%s fault %d len %d\n", - ep->name, req->status, req->actual); - - priv->buf = req->buf; - priv->actual = req->actual; - schedule_work(&priv->work); - } - spin_unlock(&epdata->dev->lock); + priv->buf = req->buf; + priv->actual = req->actual; + priv->status = req->status; usb_ep_free_request(ep, req); put_ep(epdata); + + if ((priv->iv && priv->actual) || + iocb->ki_cancel == KIOCB_CANCELLING) + schedule_work(&priv->work); + else + ep_user_copy_worker(&priv->work); } static ssize_t -- 1.8.2.1
WARNING: multiple messages have this Message-ID (diff)
From: Kent Overstreet <koverstreet@google.com> To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-aio@kvack.org Cc: akpm@linux-foundation.org, Kent Overstreet <koverstreet@google.com>, Zach Brown <zab@redhat.com>, Felipe Balbi <balbi@ti.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Mark Fasheh <mfasheh@suse.com>, Joel Becker <jlbec@evilplan.org>, Rusty Russell <rusty@rustcorp.com.au>, Jens Axboe <axboe@kernel.dk>, Asai Thambi S P <asamymuthupa@micron.com>, Selvan Mani <smani@micron.com>, Sam Bradshaw <sbradshaw@micron.com>, Jeff Moyer <jmoyer@redhat.com>, Al Viro <viro@zeniv.linux.org.uk>, Benjamin LaHaise <bcrl@kvack.org> Subject: [PATCH 19/21] aio/usb: Update cancellation for new synchonization Date: Mon, 13 May 2013 18:18:56 -0700 [thread overview] Message-ID: <1368494338-7069-20-git-send-email-koverstreet@google.com> (raw) In-Reply-To: <1368494338-7069-1-git-send-email-koverstreet@google.com> Previous patch got rid of kiocb->ki_users; this was done by having kiocb_cancel()/aio_complete() explicitly synchronize with each other. The new rule is that when a driver calls aio_complete(), after aio_complete() returns ki_cancel cannot be running and it's safe to dispose of kiocb->priv. But, this means ki_cancel() won't be able to call aio_complete() itself, or aio_complete() will deadlock. So, update the driver. Signed-off-by: Kent Overstreet <koverstreet@google.com> Cc: Zach Brown <zab@redhat.com> Cc: Felipe Balbi <balbi@ti.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Mark Fasheh <mfasheh@suse.com> Cc: Joel Becker <jlbec@evilplan.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Jens Axboe <axboe@kernel.dk> Cc: Asai Thambi S P <asamymuthupa@micron.com> Cc: Selvan Mani <smani@micron.com> Cc: Sam Bradshaw <sbradshaw@micron.com> Cc: Jeff Moyer <jmoyer@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Benjamin LaHaise <bcrl@kvack.org> --- drivers/usb/gadget/inode.c | 61 +++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index f255ad7..69adb87 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c @@ -522,6 +522,7 @@ struct kiocb_priv { const struct iovec *iv; unsigned long nr_segs; unsigned actual; + int status; }; static int ep_aio_cancel(struct kiocb *iocb) @@ -577,14 +578,26 @@ static void ep_user_copy_worker(struct work_struct *work) struct kiocb_priv *priv = container_of(work, struct kiocb_priv, work); struct mm_struct *mm = priv->mm; struct kiocb *iocb = priv->iocb; - size_t ret; - use_mm(mm); - ret = ep_copy_to_user(priv); - unuse_mm(mm); + if (priv->iv && priv->actual) { + size_t ret; + + use_mm(mm); + ret = ep_copy_to_user(priv); + unuse_mm(mm); + + if (!priv->status) + priv->status = ret; + /* + * completing the iocb can drop the ctx and mm, don't touch mm + * after + */ + } - /* completing the iocb can drop the ctx and mm, don't touch mm after */ - aio_complete(iocb, ret, ret); + + /* aio_complete() reports bytes-transferred _and_ faults */ + aio_complete(iocb, priv->actual ? priv->actual : priv->status, + priv->status); kfree(priv->buf); kfree(priv); @@ -596,36 +609,18 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req) struct kiocb_priv *priv = iocb->private; struct ep_data *epdata = priv->epdata; - /* lock against disconnect (and ideally, cancel) */ - spin_lock(&epdata->dev->lock); - priv->req = NULL; - priv->epdata = NULL; - - /* if this was a write or a read returning no data then we - * don't need to copy anything to userspace, so we can - * complete the aio request immediately. - */ - if (priv->iv == NULL || unlikely(req->actual == 0)) { - kfree(req->buf); - kfree(priv); - iocb->private = NULL; - /* aio_complete() reports bytes-transferred _and_ faults */ - aio_complete(iocb, req->actual ? req->actual : req->status, - req->status); - } else { - /* ep_copy_to_user() won't report both; we hide some faults */ - if (unlikely(0 != req->status)) - DBG(epdata->dev, "%s fault %d len %d\n", - ep->name, req->status, req->actual); - - priv->buf = req->buf; - priv->actual = req->actual; - schedule_work(&priv->work); - } - spin_unlock(&epdata->dev->lock); + priv->buf = req->buf; + priv->actual = req->actual; + priv->status = req->status; usb_ep_free_request(ep, req); put_ep(epdata); + + if ((priv->iv && priv->actual) || + iocb->ki_cancel == KIOCB_CANCELLING) + schedule_work(&priv->work); + else + ep_user_copy_worker(&priv->work); } static ssize_t -- 1.8.2.1 -- To unsubscribe, send a message with 'unsubscribe linux-aio' in the body to majordomo@kvack.org. For more info on Linux AIO, see: http://www.kvack.org/aio/ Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
next prev parent reply other threads:[~2013-05-14 1:19 UTC|newest] Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-05-14 1:18 AIO refactoring/performance improvements/cancellation Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 01/21] aio: fix kioctx not being freed after cancellation at exit time Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 02/21] aio: reqs_active -> reqs_available Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 03/21] aio: percpu reqs_available Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 04/21] Generic percpu refcounting Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 13:51 ` Oleg Nesterov 2013-05-14 13:51 ` Oleg Nesterov 2013-05-15 8:21 ` Kent Overstreet 2013-05-15 8:21 ` Kent Overstreet 2013-05-14 14:59 ` Tejun Heo 2013-05-14 14:59 ` Tejun Heo 2013-05-14 15:28 ` Oleg Nesterov 2013-05-14 15:28 ` Oleg Nesterov 2013-05-15 9:00 ` Kent Overstreet 2013-05-15 9:00 ` Kent Overstreet 2013-05-15 8:58 ` Kent Overstreet 2013-05-15 8:58 ` Kent Overstreet 2013-05-15 17:37 ` Tejun Heo 2013-05-15 17:37 ` Tejun Heo 2013-05-28 23:47 ` Kent Overstreet 2013-05-28 23:47 ` Kent Overstreet 2013-05-29 1:11 ` Tejun Heo 2013-05-29 1:11 ` Tejun Heo 2013-05-29 4:59 ` Rusty Russell 2013-05-29 4:59 ` Rusty Russell 2013-05-31 20:12 ` Kent Overstreet 2013-05-31 20:12 ` Kent Overstreet 2013-05-14 21:59 ` Tejun Heo 2013-05-14 21:59 ` Tejun Heo 2013-05-14 22:15 ` Tejun Heo 2013-05-14 22:15 ` Tejun Heo 2013-05-15 9:07 ` Kent Overstreet 2013-05-15 9:07 ` Kent Overstreet 2013-05-15 17:56 ` Tejun Heo 2013-05-15 17:56 ` Tejun Heo 2013-05-16 0:26 ` Rusty Russell 2013-05-16 0:26 ` Rusty Russell 2013-05-14 1:18 ` [PATCH 05/21] aio: percpu ioctx refcount Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 06/21] aio: io_cancel() no longer returns the io_event Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 07/21] aio: Don't use ctx->tail unnecessarily Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 08/21] aio: Kill aio_rw_vect_retry() Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 09/21] aio: Kill unneeded kiocb members Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 10/21] aio: Kill ki_users Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 11/21] aio: Kill ki_dtor Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 12/21] aio: convert the ioctx list to radix tree Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 13/21] block: prep work for batch completion Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 14/21] block, aio: batch completion for bios/kiocbs Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 15/21] virtio-blk: convert to batch completion Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 16/21] mtip32xx: " Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 17/21] Percpu tag allocator Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 13:48 ` Oleg Nesterov 2013-05-14 13:48 ` Oleg Nesterov 2013-05-14 14:24 ` Oleg Nesterov 2013-05-14 14:24 ` Oleg Nesterov 2013-05-15 9:34 ` Kent Overstreet 2013-05-15 9:34 ` Kent Overstreet 2013-05-15 9:25 ` Kent Overstreet 2013-05-15 9:25 ` Kent Overstreet 2013-05-15 15:41 ` Oleg Nesterov 2013-05-15 15:41 ` Oleg Nesterov 2013-05-15 16:10 ` Oleg Nesterov 2013-05-15 16:10 ` Oleg Nesterov 2013-06-10 23:20 ` Kent Overstreet 2013-06-10 23:20 ` Kent Overstreet 2013-06-11 17:42 ` Oleg Nesterov 2013-06-11 17:42 ` Oleg Nesterov 2013-05-14 15:03 ` Tejun Heo 2013-05-14 15:03 ` Tejun Heo 2013-05-15 20:19 ` Andi Kleen 2013-05-15 20:19 ` Andi Kleen 2013-05-14 1:18 ` [PATCH 18/21] aio: Allow cancellation without a cancel callback, new kiocb lookup Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet [this message] 2013-05-14 1:18 ` [PATCH 19/21] aio/usb: Update cancellation for new synchonization Kent Overstreet 2013-05-14 1:18 ` [PATCH 20/21] direct-io: Set dio->io_error directly Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-14 1:18 ` [PATCH 21/21] block: Bio cancellation Kent Overstreet 2013-05-14 1:18 ` Kent Overstreet 2013-05-15 17:52 ` Jens Axboe 2013-05-15 17:52 ` Jens Axboe 2013-05-15 19:29 ` Kent Overstreet 2013-05-15 19:29 ` Kent Overstreet 2013-05-15 20:01 ` Jens Axboe 2013-05-15 20:01 ` Jens Axboe 2013-05-31 22:52 ` Kent Overstreet 2013-05-31 22:52 ` Kent Overstreet
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1368494338-7069-20-git-send-email-koverstreet@google.com \ --to=koverstreet@google.com \ --cc=akpm@linux-foundation.org \ --cc=asamymuthupa@micron.com \ --cc=axboe@kernel.dk \ --cc=balbi@ti.com \ --cc=bcrl@kvack.org \ --cc=gregkh@linuxfoundation.org \ --cc=jlbec@evilplan.org \ --cc=jmoyer@redhat.com \ --cc=linux-aio@kvack.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mfasheh@suse.com \ --cc=rusty@rustcorp.com.au \ --cc=sbradshaw@micron.com \ --cc=smani@micron.com \ --cc=viro@zeniv.linux.org.uk \ --cc=zab@redhat.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.