Message ID | 20230407235822.1672286-5-bvanassche@acm.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Submit zoned writes in order | expand |
On 4/8/23 08:58, Bart Van Assche wrote: > Requeue requests instead of sending these to the dispatch list if a CPU > is unplugged to prevent reordering of zoned writes. > > Cc: Christoph Hellwig <hch@lst.de> > Cc: Damien Le Moal <damien.lemoal@opensource.wdc.com> > Cc: Ming Lei <ming.lei@redhat.com> > Cc: Mike Snitzer <snitzer@kernel.org> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> Looks OK. Reviewed-by: Damien Le Moal <dlemoal@kernel.org> > --- > block/blk-mq.c | 14 +++++++++++--- > 1 file changed, 11 insertions(+), 3 deletions(-) > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 57315395434b..77fdaed4e074 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -3495,9 +3495,17 @@ 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); > + if (hctx->queue->elevator) { > + struct request *rq, *next; > + > + list_for_each_entry_safe(rq, next, &tmp, queuelist) > + blk_mq_requeue_request(rq, false); > + blk_mq_kick_requeue_list(hctx->queue); > + } else { > + spin_lock(&hctx->lock); > + list_splice_tail_init(&tmp, &hctx->dispatch); > + spin_unlock(&hctx->lock); > + } > > blk_mq_run_hw_queue(hctx, true); > return 0;
On Fri, Apr 07, 2023 at 04:58:14PM -0700, Bart Van Assche wrote: > + if (hctx->queue->elevator) { > + struct request *rq, *next; > + > + list_for_each_entry_safe(rq, next, &tmp, queuelist) > + blk_mq_requeue_request(rq, false); > + blk_mq_kick_requeue_list(hctx->queue); > + } else { > + spin_lock(&hctx->lock); > + list_splice_tail_init(&tmp, &hctx->dispatch); > + spin_unlock(&hctx->lock); > + } Given that this isn't exactly a fast path, is there any reason to not always go through the requeue_list?
On 4/11/23 05:40, Christoph Hellwig wrote: > On Fri, Apr 07, 2023 at 04:58:14PM -0700, Bart Van Assche wrote: >> + if (hctx->queue->elevator) { >> + struct request *rq, *next; >> + >> + list_for_each_entry_safe(rq, next, &tmp, queuelist) >> + blk_mq_requeue_request(rq, false); >> + blk_mq_kick_requeue_list(hctx->queue); >> + } else { >> + spin_lock(&hctx->lock); >> + list_splice_tail_init(&tmp, &hctx->dispatch); >> + spin_unlock(&hctx->lock); >> + } > > Given that this isn't exactly a fast path, is there any reason to > not always go through the requeue_list? Hi Christoph, I will simplify this patch by letting blk_mq_hctx_notify_dead() always send requests to the requeue list. Thanks, Bart.
diff --git a/block/blk-mq.c b/block/blk-mq.c index 57315395434b..77fdaed4e074 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -3495,9 +3495,17 @@ 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); + if (hctx->queue->elevator) { + struct request *rq, *next; + + list_for_each_entry_safe(rq, next, &tmp, queuelist) + blk_mq_requeue_request(rq, false); + blk_mq_kick_requeue_list(hctx->queue); + } else { + spin_lock(&hctx->lock); + list_splice_tail_init(&tmp, &hctx->dispatch); + spin_unlock(&hctx->lock); + } blk_mq_run_hw_queue(hctx, true); return 0;
Requeue requests instead of sending these to the dispatch list if a CPU is unplugged to prevent reordering of zoned writes. Cc: Christoph Hellwig <hch@lst.de> Cc: Damien Le Moal <damien.lemoal@opensource.wdc.com> 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 | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)