Re: [PATCH v4 4/5] nvme: wire-up uring-cmd support for io-passthru on char-device.

Jens Axboe
2022-05-05T17:23:15Z

On 5/5/22 7:50 AM, Jens Axboe wrote:
> On 5/5/22 7:42 AM, Christoph Hellwig wrote:
>> On Thu, May 05, 2022 at 07:38:31AM -0600, Jens Axboe wrote:
>>>> + req = nvme_alloc_user_request(q, &c, nvme_to_user_ptr(cmd->addr),
>>>> + cmd->data_len, nvme_to_user_ptr(cmd->metadata),
>>>> + cmd->metadata_len, 0, cmd->timeout_ms ?
>>>> + msecs_to_jiffies(cmd->timeout_ms) : 0, 0, rq_flags,
>>>> + blk_flags);
>>>
>>> You need to be careful with reading/re-reading the shared memory. For
>>> example, you do:
>>
>> Uh, yes. With ioucmd->cmd pointing to the user space mapped SQ
>> we need to be very careful here. To the point where I'd almost prfer
>> to memcpy it out first, altough there might be performance implications.
>
> Most of it is just copied individually to the on-stack command, so that
> part is fine just with READ_ONCE(). Things like timeout don't matter too
> much I think, but addr/metadata/metadata_len definitely should be
> ensured stable and read/verified just once.
>
> IOW, I don't think we need the full on-stack copy, as it's just a few
> items that are currently an issue. But let's see what the new iteration
> looks like of that patch. Maybe we can just shove nvme_uring_cmd
> metadata_len and data_len at the end of that struct and make it
> identical to nvme_command_command and just make that the memcpy, then
> use the copy going forward?

The top three patches here have a proposed solution for the 3 issues
that I highlighted:

https://git.kernel.dk/cgit/linux-block/log/?h=for-5.19/io_uring-passthrough

Totally untested... Kanchan, can you take a look and see what you think?
They all need folding obviously, I just tried to do them separately.
Should also get tested :-)

--
Jens Axboe