Thread (34 messages) 34 messages, 5 authors, 2021-12-14

Re: [PATCH v2] md: add support for REQ_NOWAIT

flat view

From: Jens Axboe <axboe@kernel.dk>
Date: 2021-11-02 15:31:55

On 11/2/21 8:40 AM, Vishal Verma wrote:
commit 021a24460dc2 ("block: add QUEUE_FLAG_NOWAIT") added support
for checking whether a given bdev supports handling of REQ_NOWAIT or not.
Since then commit 6abc49468eea ("dm: add support for REQ_NOWAIT and enable
it for linear target") added support for REQ_NOWAIT for dm. This uses
a similar approach to incorporate REQ_NOWAIT for md based bios.

This patch was tested using t/io_uring tool within FIO. A nvme drive
was partitioned into 2 partitions and a simple raid 0 configuration
/dev/md0 was created.

md0 : active raid0 nvme4n1p1[1] nvme4n1p2[0]
      937423872 blocks super 1.2 512k chunks

Before patch:

$ ./t/io_uring /dev/md0 -p 0 -a 0 -d 1 -r 100

Running top while the above runs:

$ ps -eL | grep $(pidof io_uring)

  38396   38396 pts/2    00:00:00 io_uring
  38396   38397 pts/2    00:00:15 io_uring
  38396   38398 pts/2    00:00:13 iou-wrk-38397

We can see iou-wrk-38397 io worker thread created which gets created
when io_uring sees that the underlying device (/dev/md0 in this case)
doesn't support nowait.

After patch:

$ ./t/io_uring /dev/md0 -p 0 -a 0 -d 1 -r 100

Running top while the above runs:

$ ps -eL | grep $(pidof io_uring)

  38341   38341 pts/2    00:10:22 io_uring
  38341   38342 pts/2    00:10:37 io_uring

After running this patch, we don't see any io worker thread
being created which indicated that io_uring saw that the
underlying device does support nowait. This is the exact behaviour
noticed on a dm device which also supports nowait.

I also successfully tested this patch on various other
raid personalities (1, 6 and 10).
This seems incomplete. It looks like it's propagating the nowait
flag based on constituent devices, which is correct, but surely there
are cases off the the make_request path that now need to check for NOWAIT
and return -EAGAIN if they need to block.

From a quick look, raid0 looks fine as-is. raid1 would need checking
for waiting on a read barrier, for example.

If we just add nowait and don't _actually_ fix the driver, then the
nowait exercise is pointless as it would then just mean that io_uring
would block attempting to submit. That's the broken aio behavior, and
that's certainly not the desired outcome here.

-- 
Jens Axboe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help