From: Jens Axboe <axboe@kernel.dk>
To: Pavel Begunkov <asml.silence@gmail.com>,
io-uring <io-uring@vger.kernel.org>
Subject: Re: [RFC] do_iopoll() and *grab_env()
Date: Fri, 12 Jun 2020 11:55:57 -0600 [thread overview]
Message-ID: <c93fa05c-18ef-2ebe-2d8a-ca578bd648da@kernel.dk> (raw)
In-Reply-To: <5347123a-a0d5-62cf-acdf-6b64083bdc74@gmail.com>
On 6/12/20 11:30 AM, Pavel Begunkov wrote:
> On 12/06/2020 20:02, Jens Axboe wrote:
>> On 6/11/20 9:54 AM, Pavel Begunkov wrote:
>>> io_do_iopoll() can async punt a request with io_queue_async_work(),
>>> so doing io_req_work_grab_env(). The problem is that iopoll() can
>>> be called from who knows what context, e.g. from a completely
>>> different process with its own memory space, creds, etc.
>>>
>>> io_do_iopoll() {
>>> ret = req->poll();
>>> if (ret == -EAGAIN)
>>> io_queue_async_work()
>>> ...
>>> }
>>>
>>>
>>> I can't find it handled in io_uring. Can this even happen?
>>> Wouldn't it be better to complete them with -EAGAIN?
>>
>> I don't think a plain -EAGAIN complete would be very useful, it's kind
>> of a shitty thing to pass back to userspace when it can be avoided. For
>> polled IO, we know we're doing O_DIRECT, or using fixed buffers. For the
>> latter, there's no problem in retrying, regardless of context. For the
>> former, I think we'd get -EFAULT mapping the IO at that point, which is
>> probably reasonable. I'd need to double check, though.
>
> It's shitty, but -EFAULT is the best outcome. I care more about not
> corrupting another process' memory if addresses coincide. AFAIK it can
> happen because io_{read,write} will use iovecs for punted re-submission.
>
>
> Unconditional in advance async_prep() is too heavy to be good. I'd love to
> see something more clever, but with -EAGAIN users at least can handle it.
So how about we just grab ->task for the initial issue, and retry if we
find it through -EAGAIN and ->task == current. That'll be the most
common case, by far, and it'll prevent passes back -EAGAIN when we
really don't have to. If the task is different, then -EAGAIN makes more
sense, because at that point we're passing back -EAGAIN because we
really cannot feasibly handle it rather than just as a convenience.
--
Jens Axboe
next prev parent reply other threads:[~2020-06-12 17:56 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-11 15:54 [RFC] do_iopoll() and *grab_env() Pavel Begunkov
2020-06-12 17:02 ` Jens Axboe
2020-06-12 17:30 ` Pavel Begunkov
2020-06-12 17:55 ` Jens Axboe [this message]
2020-06-12 18:02 ` Jens Axboe
2020-06-12 18:33 ` Pavel Begunkov
2020-06-12 18:46 ` Pavel Begunkov
2020-06-12 19:42 ` Jens Axboe
2020-06-13 19:12 ` Pavel Begunkov
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=c93fa05c-18ef-2ebe-2d8a-ca578bd648da@kernel.dk \
--to=axboe@kernel.dk \
--cc=asml.silence@gmail.com \
--cc=io-uring@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.