[RFC PATCH v1 09/17] dm bufio: avoid blkg association from GFP_NOWAIT bio init
Yu Kuai
yukuai at kernel.org
Sat Jul 4 12:51:16 PDT 2026
From: Yu Kuai <yukuai at fygo.io>
dm-bufio allocates a bio with bio_kmalloc(GFP_NOWAIT) and then initializes it
with the target bdev. That initialization can attach blkcg state and sleep to
create a missing blkg once blkg lookup is protected by q->blkcg_mutex.
Initialize the bio without a bdev, set the bdev fields, and associate blkcg
with nowait=true. Fall back to dm_io if a missing blkg would need to be
created.
Signed-off-by: Yu Kuai <yukuai at fygo.io>
---
drivers/md/dm-bufio.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c
index 26fedf5883ef..2002d9020dd6 100644
--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -1347,7 +1347,14 @@ static void use_bio(struct dm_buffer *b, enum req_op op, sector_t sector,
use_dmio(b, op, sector, n_sectors, offset, ioprio);
return;
}
- bio_init_inline(bio, b->c->bdev, 1, op);
+ bio_init_inline(bio, NULL, 1, op);
+ bio_set_dev_no_blkg(bio, b->c->bdev);
+ if (!bio_associate_blkg(bio, true)) {
+ bio_uninit(bio);
+ kfree(bio);
+ use_dmio(b, op, sector, n_sectors, offset, ioprio);
+ return;
+ }
bio->bi_iter.bi_sector = sector;
bio->bi_end_io = bio_complete;
bio->bi_private = b;
--
2.51.0
More information about the Linux-nvme
mailing list