[RFC PATCH v1 11/17] block: avoid scheduling from non-blocking helper allocations
Yu Kuai
yukuai at kernel.org
Sat Jul 4 12:51:18 PDT 2026
From: Yu Kuai <yukuai at fygo.io>
blk_alloc_discard_bio() and blk_rq_map_bio_alloc() can be used with
non-blocking GFP masks. Their bio allocation now handles bdev association in
nowait mode, so the helpers can pass the target bdev directly and avoid local
open-coded association paths.
The discard helper can also be reached from io_uring with GFP_NOWAIT. Keep
its long-loop cond_resched() only for blocking callers.
Signed-off-by: Yu Kuai <yukuai at fygo.io>
---
block/blk-lib.c | 3 ++-
block/blk-map.c | 7 +------
2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/block/blk-lib.c b/block/blk-lib.c
index 688bc67cbf73..b5645f8f69b6 100644
--- a/block/blk-lib.c
+++ b/block/blk-lib.c
@@ -56,7 +56,8 @@ struct bio *blk_alloc_discard_bio(struct block_device *bdev,
* discards (like mkfs). Be nice and allow us to schedule out to avoid
* softlocking if preempt is disabled.
*/
- cond_resched();
+ if (gfpflags_allow_blocking(gfp_mask))
+ cond_resched();
return bio;
}
diff --git a/block/blk-map.c b/block/blk-map.c
index 768549f19f97..75c7b864c15a 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -46,14 +46,9 @@ static struct bio *blk_rq_map_bio_alloc(struct request *rq,
unsigned int nr_vecs, gfp_t gfp_mask)
{
struct block_device *bdev = rq->q->disk ? rq->q->disk->part0 : NULL;
- struct bio *bio;
- bio = bio_alloc_bioset(bdev, nr_vecs, rq->cmd_flags, gfp_mask,
+ return bio_alloc_bioset(bdev, nr_vecs, rq->cmd_flags, gfp_mask,
&fs_bio_set);
- if (!bio)
- return NULL;
-
- return bio;
}
/**
--
2.51.0
More information about the Linux-nvme
mailing list