From: Damien Le Moal <dlemoal@kernel.org>
To: linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
dm-devel@lists.linux.dev, Mike Snitzer <snitzer@redhat.com>
Subject: [PATCH 05/13] block: Hold a reference on zone write plugs to schedule submission
Date: Tue, 30 Apr 2024 21:51:23 +0900 [thread overview]
Message-ID: <20240430125131.668482-6-dlemoal@kernel.org> (raw)
In-Reply-To: <20240430125131.668482-1-dlemoal@kernel.org>
Since a zone write plug BIO work is a field of struct blk_zone_wplug, we
must ensure that a zone write plug is never freed when its BIO
submission work is queued or running. Do this by holding a reference on
the zone write plug when the submission work is scheduled for execution
with queue_work() and releasing the reference at the end of the
execution of the work function blk_zone_wplug_bio_work().
The helper function disk_zone_wplug_schedule_bio_work() is introduced to
get a reference on a zone write plug and queue its work. This helper is
used in disk_zone_wplug_unplug_bio() and disk_zone_wplug_handle_error().
Fixes: dd291d77cc90 ("block: Introduce zone write plugging")
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
block/blk-zoned.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 9bded29592e0..03555ea64774 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -1131,6 +1131,19 @@ bool blk_zone_plug_bio(struct bio *bio, unsigned int nr_segs)
}
EXPORT_SYMBOL_GPL(blk_zone_plug_bio);
+static void disk_zone_wplug_schedule_bio_work(struct gendisk *disk,
+ struct blk_zone_wplug *zwplug)
+{
+ /*
+ * Take a reference on the zone write plug and schedule the submission
+ * of the next plugged BIO. blk_zone_wplug_bio_work() will release the
+ * reference we take here.
+ */
+ WARN_ON_ONCE(!(zwplug->flags & BLK_ZONE_WPLUG_PLUGGED));
+ atomic_inc(&zwplug->ref);
+ queue_work(disk->zone_wplugs_wq, &zwplug->bio_work);
+}
+
static void disk_zone_wplug_unplug_bio(struct gendisk *disk,
struct blk_zone_wplug *zwplug)
{
@@ -1150,8 +1163,8 @@ static void disk_zone_wplug_unplug_bio(struct gendisk *disk,
/* Schedule submission of the next plugged BIO if we have one. */
if (!bio_list_empty(&zwplug->bio_list)) {
+ disk_zone_wplug_schedule_bio_work(disk, zwplug);
spin_unlock_irqrestore(&zwplug->lock, flags);
- queue_work(disk->zone_wplugs_wq, &zwplug->bio_work);
return;
}
@@ -1251,14 +1264,14 @@ static void blk_zone_wplug_bio_work(struct work_struct *work)
if (!bio) {
zwplug->flags &= ~BLK_ZONE_WPLUG_PLUGGED;
spin_unlock_irqrestore(&zwplug->lock, flags);
- return;
+ goto put_zwplug;
}
if (!blk_zone_wplug_prepare_bio(zwplug, bio)) {
/* Error recovery will decide what to do with the BIO. */
bio_list_add_head(&zwplug->bio_list, bio);
spin_unlock_irqrestore(&zwplug->lock, flags);
- return;
+ goto put_zwplug;
}
spin_unlock_irqrestore(&zwplug->lock, flags);
@@ -1274,6 +1287,10 @@ static void blk_zone_wplug_bio_work(struct work_struct *work)
*/
if (bdev->bd_has_submit_bio)
blk_queue_exit(bdev->bd_disk->queue);
+
+put_zwplug:
+ /* Drop the reference we took in disk_zone_wplug_schedule_bio_work(). */
+ disk_put_zone_wplug(zwplug);
}
static unsigned int blk_zone_wp_offset(struct blk_zone *zone)
@@ -1353,8 +1370,7 @@ static void disk_zone_wplug_handle_error(struct gendisk *disk,
/* Restart BIO submission if we still have any BIO left. */
if (!bio_list_empty(&zwplug->bio_list)) {
- WARN_ON_ONCE(!(zwplug->flags & BLK_ZONE_WPLUG_PLUGGED));
- queue_work(disk->zone_wplugs_wq, &zwplug->bio_work);
+ disk_zone_wplug_schedule_bio_work(disk, zwplug);
goto unlock;
}
--
2.44.0
next prev parent reply other threads:[~2024-04-30 12:51 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-30 12:51 [PATCH 00/13] Zone write plugging fixes and cleanup Damien Le Moal
2024-04-30 12:51 ` [PATCH 01/13] dm: Check that a zoned table leads to a valid mapped device Damien Le Moal
2024-04-30 12:51 ` [PATCH 02/13] block: Exclude conventional zones when faking max open limit Damien Le Moal
2024-04-30 15:24 ` Christoph Hellwig
2024-04-30 19:04 ` Jens Axboe
2024-05-01 4:57 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 03/13] block: Fix zone write plug initialization from blk_revalidate_zone_cb() Damien Le Moal
2024-04-30 15:26 ` Christoph Hellwig
2024-04-30 22:50 ` Damien Le Moal
2024-04-30 23:54 ` Damien Le Moal
2024-04-30 12:51 ` [PATCH 04/13] block: Fix reference counting for zone write plugs in error state Damien Le Moal
2024-04-30 15:28 ` Christoph Hellwig
2024-04-30 12:51 ` Damien Le Moal [this message]
2024-04-30 15:30 ` [PATCH 05/13] block: Hold a reference on zone write plugs to schedule submission Christoph Hellwig
2024-04-30 12:51 ` [PATCH 06/13] block: Unhash a zone write plug only if needed Damien Le Moal
2024-04-30 15:31 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 07/13] block: Do not remove zone write plugs still in use Damien Le Moal
2024-04-30 15:34 ` Christoph Hellwig
2024-04-30 23:06 ` Damien Le Moal
2024-04-30 23:55 ` Damien Le Moal
2024-04-30 12:51 ` [PATCH 08/13] block: Fix flush request sector restore Damien Le Moal
2024-04-30 15:26 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 09/13] block: Fix handling of non-empty flush write requests to zones Damien Le Moal
2024-04-30 15:34 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 10/13] block: Improve blk_zone_write_plug_bio_merged() Damien Le Moal
2024-04-30 15:35 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 11/13] block: Improve zone write request completion handling Damien Le Moal
2024-04-30 15:39 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 12/13] block: Simplify blk_zone_write_plug_bio_endio() Damien Le Moal
2024-04-30 15:36 ` Christoph Hellwig
2024-04-30 12:51 ` [PATCH 13/13] block: Simplify zone write plug BIO abort Damien Le Moal
2024-04-30 15:36 ` Christoph Hellwig
2024-04-30 17:00 ` [PATCH 00/13] Zone write plugging fixes and cleanup Johannes Thumshirn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240430125131.668482-6-dlemoal@kernel.org \
--to=dlemoal@kernel.org \
--cc=axboe@kernel.dk \
--cc=dm-devel@lists.linux.dev \
--cc=linux-block@vger.kernel.org \
--cc=snitzer@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.