On 5/23/25 10:10, Damien Le Moal wrote: > What about this patch, completely untested... > > diff --git a/block/blk-core.c b/block/blk-core.c > index e8cc270a453f..3d2dec088a54 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -621,6 +621,32 @@ static inline blk_status_t blk_check_zone_append(struct > request_queue *q, > return BLK_STS_OK; > } > > +static inline void disk_submit_bio(struct bio *bio) > +{ > + struct gendisk *disk = bio->bi_bdev->bd_disk; > + bool need_queue_enter = !bio_zone_write_plugging(bio); > + > + /* > + * BIOs that are issued from a zone write plug already hold a reference > + * on the device queue usage counter. > + */ > + if (need_queue_enter) { > + if (unlikely(bio_queue_enter(bio))) > + return; > + } > + > + if ((bio->bi_opf & REQ_POLLED) && > + !(disk->queue->limits.features & BLK_FEAT_POLL)) { > + bio->bi_status = BLK_STS_NOTSUPP; > + bio_endio(bio); > + } else { > + disk->fops->submit_bio(bio); > + } > + > + if (need_queue_enter) > + blk_queue_exit(disk->queue); > +} > + > static void __submit_bio(struct bio *bio) > { > /* If plug is not used, add new plug here to cache nsecs time. */ > @@ -631,20 +657,10 @@ static void __submit_bio(struct bio *bio) > > blk_start_plug(&plug); > > - if (!bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO)) { > + if (!bdev_test_flag(bio->bi_bdev, BD_HAS_SUBMIT_BIO)) > blk_mq_submit_bio(bio); > - } else if (likely(bio_queue_enter(bio) == 0)) { > - struct gendisk *disk = bio->bi_bdev->bd_disk; > - > - if ((bio->bi_opf & REQ_POLLED) && > - !(disk->queue->limits.features & BLK_FEAT_POLL)) { > - bio->bi_status = BLK_STS_NOTSUPP; > - bio_endio(bio); > - } else { > - disk->fops->submit_bio(bio); > - } > - blk_queue_exit(disk->queue); > - } > + else > + disk_submit_bio(bio) Missing ";" here. > > blk_finish_plug(&plug); > } Looking into this deeper, the regular mq path actually likely has the same issue since it will call blk_queue_enter() if we do not have a cached request. So this solution is only partial and not good enough. We need something else. -- Damien Le Moal Western Digital Research