From: Al Viro <viro@ZenIV.linux.org.uk>
To: Christoph Hellwig <hch@lst.de>
Cc: Avi Kivity <avi@scylladb.com>,
linux-aio@kvack.org, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/4] aio: implement IOCB_CMD_POLL
Date: Thu, 2 Aug 2018 01:21:22 +0100 [thread overview]
Message-ID: <20180802002121.GU30522@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20180730071544.23998-4-hch@lst.de>
On Mon, Jul 30, 2018 at 09:15:43AM +0200, Christoph Hellwig wrote:
> +static void aio_poll_complete_work(struct work_struct *work)
> +{
> + struct poll_iocb *req = container_of(work, struct poll_iocb, work);
> + struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll);
> + struct poll_table_struct pt = { ._key = req->events };
> + struct kioctx *ctx = iocb->ki_ctx;
> + __poll_t mask;
> +
> + if (READ_ONCE(req->cancelled)) {
....
> + }
> +
> + mask = vfs_poll(req->file, &pt) & req->events;
> + if (!mask) {
> + add_wait_queue(req->head, &req->wait);
> + return;
> + }
....
> +}
> +/* assumes we are called with irqs disabled */
> +static int aio_poll_cancel(struct kiocb *iocb)
> +{
> + struct aio_kiocb *aiocb = container_of(iocb, struct aio_kiocb, rw);
> + struct poll_iocb *req = &aiocb->poll;
> +
> + spin_lock(&req->head->lock);
> + if (!list_empty(&req->wait.entry)) {
> + WRITE_ONCE(req->cancelled, true);
> + list_del_init(&req->wait.entry);
> + schedule_work(&aiocb->poll.work);
> + }
> + spin_unlock(&req->head->lock);
> +
> + return 0;
> +}
> +static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
> + void *key)
> +{
> + struct poll_iocb *req = container_of(wait, struct poll_iocb, wait);
> + __poll_t mask = key_to_poll(key);
> +
> + /* for instances that support it check for an event match first: */
> + if (mask && !(mask & req->events))
> + return 0;
> +
> + list_del_init(&req->wait.entry);
> + schedule_work(&req->work);
> + return 1;
> +}
> +static ssize_t aio_poll(struct aio_kiocb *aiocb, struct iocb *iocb)
> +{
> + struct kioctx *ctx = aiocb->ki_ctx;
> + struct poll_iocb *req = &aiocb->poll;
> + struct aio_poll_table apt;
> + __poll_t mask;
> + mask = vfs_poll(req->file, &apt.pt) & req->events;
> + if (mask || apt.error) {
> + } else {
> + spin_lock_irq(&ctx->ctx_lock);
> + if (!req->done) {
> + list_add_tail(&aiocb->ki_list, &ctx->active_reqs);
> + aiocb->ki_cancel = aio_poll_cancel;
> + }
> + spin_unlock_irq(&ctx->ctx_lock);
> + }
So what happens if
* we call aio_poll(), add the sucker to queue and see that we need
to wait
* add to ->active_refs just as the wakeup comes
* wakeup removes from queue and hits schedule_work()
* io_cancel() is called, triggering aio_poll_cancel(), which sees that
we are not from queue and buggers off. We are gone from ->active_refs.
* aio_poll_complete_work() is called, sees no ->cancelled
* aio_poll_complete_work() calls vfs_poll(), sees nothing interesting
and puts us back on the queue.
Unless I'm misreading it, cancel will end up with iocb still around and now
impossible to cancel... What am I missing?
next prev parent reply other threads:[~2018-08-02 2:09 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-30 7:15 aio poll and a new in-kernel poll API V21 (aka 2.0) Christoph Hellwig
2018-07-30 7:15 ` [PATCH 1/4] timerfd: add support for keyed wakeups Christoph Hellwig
2018-07-30 7:15 ` [PATCH 2/4] aio: add a iocb refcount Christoph Hellwig
2018-08-01 23:19 ` Al Viro
2018-08-02 8:59 ` Christoph Hellwig
2018-07-30 7:15 ` [PATCH 3/4] aio: implement IOCB_CMD_POLL Christoph Hellwig
2018-08-01 23:54 ` Al Viro
2018-08-02 9:00 ` Christoph Hellwig
2018-08-02 0:21 ` Al Viro [this message]
2018-08-02 9:22 ` Christoph Hellwig
2018-08-02 16:00 ` Al Viro
2018-08-02 16:08 ` Christoph Hellwig
2018-08-02 16:08 ` Al Viro
2018-08-02 16:16 ` Christoph Hellwig
2018-08-02 21:48 ` Al Viro
2018-07-30 7:15 ` [PATCH 4/4] aio: allow direct aio poll comletions for keyed wakeups Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2018-08-06 8:30 aio poll V22 (aka 2.0) Christoph Hellwig
2018-08-06 8:30 ` [PATCH 3/4] aio: implement IOCB_CMD_POLL Christoph Hellwig
2018-07-26 8:28 aio poll and a new in-kernel poll API V20 (aka 2.0) Christoph Hellwig
2018-07-26 8:29 ` [PATCH 3/4] aio: implement IOCB_CMD_POLL Christoph Hellwig
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=20180802002121.GU30522@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=avi@scylladb.com \
--cc=hch@lst.de \
--cc=linux-aio@kvack.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/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: link
Be 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.