Message ID | 20230522183845.354920-4-bvanassche@acm.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Submit zoned writes in order | expand |
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
On Tue, May 23, 2023 at 2:39 AM Bart Van Assche <bvanassche@acm.org> wrote: > > Requeue requests instead of sending these to the dispatch list if a CPU > is unplugged. This gives the I/O scheduler the chance to preserve the > order of zoned write requests. But the affected code path is only for queue with none scheduler, do you think none can maintain the order for write requests? Thanks,
On 5/23/23 01:17, Ming Lei wrote: > On Tue, May 23, 2023 at 2:39 AM Bart Van Assche <bvanassche@acm.org> wrote: >> >> Requeue requests instead of sending these to the dispatch list if a CPU >> is unplugged. This gives the I/O scheduler the chance to preserve the >> order of zoned write requests. > > But the affected code path is only for queue with none scheduler, do you > think none can maintain the order for write requests? Hi Ming, Doesn't blk_mq_insert_requests() insert requests in ctx->rq_lists[type] whether or not an I/O scheduler is active? I haven't found any code in blk_mq_hctx_notify_dead() that makes this function behave differently based on whether or not an I/O scheduler has been associated with the request queue. Did I perhaps overlook something? Thanks, Bart.
On Tue, May 23, 2023 at 01:15:55PM -0700, Bart Van Assche wrote: > On 5/23/23 01:17, Ming Lei wrote: > > On Tue, May 23, 2023 at 2:39 AM Bart Van Assche <bvanassche@acm.org> wrote: > > > > > > Requeue requests instead of sending these to the dispatch list if a CPU > > > is unplugged. This gives the I/O scheduler the chance to preserve the > > > order of zoned write requests. > > > > But the affected code path is only for queue with none scheduler, do you > > think none can maintain the order for write requests? > > Hi Ming, > > Doesn't blk_mq_insert_requests() insert requests in ctx->rq_lists[type] > whether or not an I/O scheduler is active? blk_mq_insert_requests() is only called for inserting passthrough request in case of !q->elevator. > > I haven't found any code in blk_mq_hctx_notify_dead() that makes this > function behave differently based on whether or not an I/O scheduler has > been associated with the request queue. Did I perhaps overlook something? blk_mq_hctx_notify_dead() is only for handling request from sw queue which is used for !q->elevator. Thanks, Ming
On 5/23/23 17:35, Ming Lei wrote: > blk_mq_insert_requests() is only called for inserting passthrough > request in case of !q->elevator. Hmm ... blk_mq_requeue_work() may call blk_mq_insert_request() to requeue a request that is not a passthrough request and if an I/O scheduler is active. I think there are more examples in the block layer of blk_mq_insert_request() calls that happen if q->elevator != NULL. Thanks, Bart.
diff --git a/block/blk-mq.c b/block/blk-mq.c index 632aee9af60f..bc52a57641e2 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -3497,13 +3497,13 @@ static int blk_mq_hctx_notify_online(unsigned int cpu, struct hlist_node *node) } /* - * 'cpu' is going away. splice any existing rq_list entries from this - * software queue to the hw queue dispatch list, and ensure that it - * gets run. + * @cpu is going away. Requeue any existing rq_list entries from its + * software queue and run the hw queue associated with @cpu. */ static int blk_mq_hctx_notify_dead(unsigned int cpu, struct hlist_node *node) { struct blk_mq_hw_ctx *hctx; + struct request *rq, *next; struct blk_mq_ctx *ctx; LIST_HEAD(tmp); enum hctx_type type; @@ -3525,9 +3525,9 @@ static int blk_mq_hctx_notify_dead(unsigned int cpu, struct hlist_node *node) if (list_empty(&tmp)) return 0; - spin_lock(&hctx->lock); - list_splice_tail_init(&tmp, &hctx->dispatch); - spin_unlock(&hctx->lock); + list_for_each_entry_safe(rq, next, &tmp, queuelist) + blk_mq_requeue_request(rq, false); + blk_mq_kick_requeue_list(hctx->queue); blk_mq_run_hw_queue(hctx, true); return 0;
Requeue requests instead of sending these to the dispatch list if a CPU is unplugged. This gives the I/O scheduler the chance to preserve the order of zoned write requests. Cc: Christoph Hellwig <hch@lst.de> Cc: Damien Le Moal <dlemoal@kernel.org> Cc: Ming Lei <ming.lei@redhat.com> Cc: Mike Snitzer <snitzer@kernel.org> Signed-off-by: Bart Van Assche <bvanassche@acm.org> --- block/blk-mq.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)