From: Yu Kuai <[email protected]> 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 <[email protected]> --- 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
