Patch "md: add support for REQ_NOWAIT" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    md: add support for REQ_NOWAIT

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     md-add-support-for-req_nowait.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6cfc59304492f77ac462a5e70c80bc43d98fee1d
Author: Vishal Verma <vverma@xxxxxxxxxxxxxxxx>
Date:   Tue Dec 21 20:06:19 2021 +0000

    md: add support for REQ_NOWAIT
    
    [ Upstream commit f51d46d0e7cb5b8494aa534d276a9d8915a2443d ]
    
    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.
    
    For all the other raid personalities except raid0, we would need
    to train pieces which involves make_request fn in order for them
    to correctly handle REQ_NOWAIT.
    
    Reviewed-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Vishal Verma <vverma@xxxxxxxxxxxxxxxx>
    Signed-off-by: Song Liu <song@xxxxxxxxxx>
    Stable-dep-of: 1727fd5015d8 ("md: Replace snprintf with scnprintf")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 04e1e294b4b1..ea21a9ddf15f 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -417,6 +417,12 @@ void md_handle_request(struct mddev *mddev, struct bio *bio)
 	rcu_read_lock();
 	if (is_suspended(mddev, bio)) {
 		DEFINE_WAIT(__wait);
+		/* Bail out if REQ_NOWAIT is set for the bio */
+		if (bio->bi_opf & REQ_NOWAIT) {
+			rcu_read_unlock();
+			bio_wouldblock_error(bio);
+			return;
+		}
 		for (;;) {
 			prepare_to_wait(&mddev->sb_wait, &__wait,
 					TASK_UNINTERRUPTIBLE);
@@ -5792,6 +5798,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 +5869,13 @@ int md_run(struct mddev *mddev)
 			}
 		}
 		sysfs_notify_dirent_safe(rdev->sysfs_state);
+		nowait = nowait && blk_queue_nowait(bdev_get_queue(rdev->bdev));
 	}
 
+	/* Set the NOWAIT flags if all underlying devices support it */
+	if (nowait)
+		blk_queue_flag_set(QUEUE_FLAG_NOWAIT, mddev->queue);
+
 	if (!bioset_initialized(&mddev->bio_set)) {
 		err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
 		if (err)
@@ -6996,6 +7008,15 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
 	set_bit(MD_SB_CHANGE_DEVS, &mddev->sb_flags);
 	if (!mddev->thread)
 		md_update_sb(mddev, 1);
+	/*
+	 * If the new disk does not support REQ_NOWAIT,
+	 * disable on the whole MD.
+	 */
+	if (!blk_queue_nowait(bdev_get_queue(rdev->bdev))) {
+		pr_info("%s: Disabling nowait because %s does not support nowait\n",
+			mdname(mddev), bdevname(rdev->bdev, b));
+		blk_queue_flag_clear(QUEUE_FLAG_NOWAIT, mddev->queue);
+	}
 	/*
 	 * Kick recovery, maybe this spare has to be added to the
 	 * array immediately.



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux