On Tue, Nov 2, 2021 at 7:40 AM Vishal Verma <vverma@xxxxxxxxxxxxxxxx> 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). > > Signed-off-by: Vishal Verma <vverma@xxxxxxxxxxxxxxxx> > --- > drivers/md/md.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index 5111ed966947..11174d32bfd7 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -5792,6 +5792,7 @@ int md_run(struct mddev *mddev) > int err; > struct md_rdev *rdev; > struct md_personality *pers; > + bool nowait = true; > > if (list_empty(&mddev->disks)) > /* cannot run an array with no devices.. */ > @@ -5862,8 +5863,13 @@ int md_run(struct mddev *mddev) > } > } > sysfs_notify_dirent_safe(rdev->sysfs_state); > + nowait = blk_queue_nowait(bdev_get_queue(rdev->bdev)); This doesn't look right to me. I think we need nowait = nowait && blk_queue_nowait(bdev_get_queue(rdev->bdev)); Thanks, Song