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

Re: [PATCH] md: add support for REQ_NOWAIT

flat view

From: Li Feng <hidden>
Date: 2021-11-02 03:41:30

On Tue, Nov 2, 2021 at 5:52 AM Vishal Verma [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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.

Signed-off-by: Vishal Verma <redacted>
---
 drivers/md/md.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 5111ed966947..51b2df32aed5 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -419,6 +419,12 @@ void md_handle_request(struct mddev *mddev, struct bio *bio)
        if (is_suspended(mddev, bio)) {
                DEFINE_WAIT(__wait);
                for (;;) {
+                       /* Bail out if REQ_NOWAIT is set for the bio */
+                       if (bio->bi_opf & REQ_NOWAIT) {
+                               bio_wouldblock_error(bio);
+                               break;
+                       }
+
                        prepare_to_wait(&mddev->sb_wait, &__wait,
                                        TASK_UNINTERRUPTIBLE);
                        if (!is_suspended(mddev, bio))
@@ -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,14 @@ int md_run(struct mddev *mddev)
                        }
                }
                sysfs_notify_dirent_safe(rdev->sysfs_state);
+               if (!blk_queue_nowait(bdev_get_queue(rdev->bdev)))
+                       nowait = false;
I think this is more clear:
nowait = blk_queue_nowait(bdev_get_queue(rdev->bdev));
quoted hunk ↗ jump to hunk
        }

+       /* 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)
@@ -7007,6 +7020,14 @@ 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.
--
2.17.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help