On 7/9/25 7:06 AM, Bart Van Assche wrote: > Zoned writes may be requeued. This happens if a block driver returns > BLK_STS_RESOURCE, to handle SCSI unit attentions or by the SCSI error > handler after error handling has finished. A later patch enables write > pipelining and increases the number of pending writes per zone. If > multiple writes are pending per zone, write requests may be requeued in > another order than submitted. Restore the request order if requests are > requeued. Add RQF_DONTPREP to RQF_NOMERGE_FLAGS because this patch may > cause RQF_DONTPREP requests to be sent to the code that checks whether > a request can be merged and RQF_DONTPREP requests must not be merged. > > Cc: Christoph Hellwig <hch@xxxxxx> > Cc: Damien Le Moal <dlemoal@xxxxxxxxxx> > Cc: Yu Kuai <yukuai3@xxxxxxxxxx> > Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> [...] > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 0c61492724d2..aa81526ad531 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -1557,7 +1557,9 @@ static void blk_mq_requeue_work(struct work_struct *work) > * already. Insert it into the hctx dispatch list to avoid > * block layer merges for the request. > */ > - if (rq->rq_flags & RQF_DONTPREP) > + if (blk_rq_is_seq_zoned_write(rq)) > + blk_mq_insert_request(rq, BLK_MQ_INSERT_ORDERED); Every zone write will go through this, even for devices that do not have driver_preserves_write_order == true. Given that thi insert ordered function is heavier than inserting at head, it would be nice to avoid this. > + else if (rq->rq_flags & RQF_DONTPREP) > blk_mq_request_bypass_insert(rq, 0); > else > blk_mq_insert_request(rq, BLK_MQ_INSERT_AT_HEAD); -- Damien Le Moal Western Digital Research