[dm-devel] [dm-6.4 PATCH v2 7/9] dm thin: speed up cell_defer_no_holder()
Mike Snitzer
snitzer at kernel.org
Fri Mar 24 17:56:54 UTC 2023
From: Joe Thornber <ejt at redhat.com>
Reduce the time that a spinlock is held in cell_defer_no_holder().
Signed-off-by: Joe Thornber <ejt at redhat.com>
Signed-off-by: Mike Snitzer <snitzer at kernel.org>
---
drivers/md/dm-thin.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 13d4677baafd..00323428919e 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -883,15 +883,17 @@ static void cell_defer_no_holder(struct thin_c *tc, struct dm_bio_prison_cell *c
{
struct pool *pool = tc->pool;
unsigned long flags;
- int has_work;
+ struct bio_list bios;
- spin_lock_irqsave(&tc->lock, flags);
- cell_release_no_holder(pool, cell, &tc->deferred_bio_list);
- has_work = !bio_list_empty(&tc->deferred_bio_list);
- spin_unlock_irqrestore(&tc->lock, flags);
+ bio_list_init(&bios);
+ cell_release_no_holder(pool, cell, &bios);
- if (has_work)
+ if (!bio_list_empty(&bios)) {
+ spin_lock_irqsave(&tc->lock, flags);
+ bio_list_merge(&tc->deferred_bio_list, &bios);
+ spin_unlock_irqrestore(&tc->lock, flags);
wake_worker(pool);
+ }
}
static void thin_defer_bio(struct thin_c *tc, struct bio *bio);
--
2.40.0
More information about the dm-devel
mailing list