From: Christoph Hellwig <hch@infradead.org>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Daniel Wagner <dwagner@suse.de>, Mike Galbraith <efault@gmx.de>,
Christoph Hellwig <hch@infradead.org>,
Sagi Grimberg <sagi@grimberg.me>
Subject: Re: [PATCH 3/3] blk-mq: Use llist_head for blk_cpu_done
Date: Tue, 8 Dec 2020 13:20:04 +0000 [thread overview]
Message-ID: <20201208132004.GC22219@infradead.org> (raw)
In-Reply-To: <20201204191356.2516405-4-bigeasy@linutronix.de>
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=unknown-8bit, Size: 3467 bytes --]
On Fri, Dec 04, 2020 at 08:13:56PM +0100, Sebastian Andrzej Siewior wrote:
> With llist_head it is possible to avoid the locking (the irq-off region)
> when items are added. This makes it possible to add items on a remote
> CPU.
> llist_add() returns true if the list was previously empty. This can be
> used to invoke the SMP function call / raise sofirq only if the first
> item was added (otherwise it is already pending).
> This simplifies the code a little and reduces the IRQ-off regions. With
> this change it possible to reduce the SMP-function call a simple
> __raise_softirq_irqoff().
> blk_mq_complete_request_remote() needs a preempt-disable section if the
> request needs to complete on the local CPU. Some callers (USB-storage)
> invoke this preemptible context and the request needs to be enqueued on
> the same CPU as the softirq is raised.
>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
> block/blk-mq.c | 77 ++++++++++++++----------------------------
> include/linux/blkdev.h | 2 +-
> 2 files changed, 27 insertions(+), 52 deletions(-)
>
> diff --git a/block/blk-mq.c b/block/blk-mq.c
> index 3c0e94913d874..b5138327952a4 100644
> --- a/block/blk-mq.c
> +++ b/block/blk-mq.c
> @@ -41,7 +41,7 @@
> #include "blk-mq-sched.h"
> #include "blk-rq-qos.h"
>
> +static DEFINE_PER_CPU(struct llist_head, blk_cpu_done);
>
> static void blk_mq_poll_stats_start(struct request_queue *q);
> static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb);
> @@ -567,68 +567,32 @@ void blk_mq_end_request(struct request *rq, blk_status_t error)
> }
> EXPORT_SYMBOL(blk_mq_end_request);
>
> +static void blk_complete_reqs(struct llist_head *cpu_list)
> {
> + struct llist_node *entry;
> + struct request *rq, *rq_next;
>
> + entry = llist_del_all(cpu_list);
> + entry = llist_reverse_order(entry);
I find the variable naming and split of the assignments a little
strange. What about:
static void blk_complete_reqs(struct llist_head *list)
{
struct llist_node *first = llist_reverse_order(llist_del_all(list));
struct request *rq, *next;
?
> + llist_for_each_entry_safe(rq, rq_next, entry, ipi_list)
> rq->q->mq_ops->complete(rq);
> }
Aren't some sanitizers going to be unhappy if we never delete the
request from the list?
> bool blk_mq_complete_request_remote(struct request *rq)
> {
> + struct llist_head *cpu_list;
> WRITE_ONCE(rq->state, MQ_RQ_COMPLETE);
>
> /*
> @@ -669,12 +634,22 @@ bool blk_mq_complete_request_remote(struct request *rq)
> return false;
>
> if (blk_mq_complete_need_ipi(rq)) {
> + unsigned int cpu;
> +
> + cpu = rq->mq_ctx->cpu;
> + cpu_list = &per_cpu(blk_cpu_done, cpu);
> + if (llist_add(&rq->ipi_list, cpu_list)) {
> + INIT_CSD(&rq->csd, __blk_mq_complete_request_remote, rq);
> + smp_call_function_single_async(cpu, &rq->csd);
> + }
I think the above code section inside the conditional should go into a
little helper instead of being open coded here in the fast path routine.
I laso don't really see the ¶oint of the cpu and cpulist locl variables.
> } else {
> if (rq->q->nr_hw_queues > 1)
> return false;
> + preempt_disable();
> + cpu_list = this_cpu_ptr(&blk_cpu_done);
> + if (llist_add(&rq->ipi_list, cpu_list))
> + raise_softirq(BLOCK_SOFTIRQ);
> + preempt_enable();
I think the section after the return false here also would benefit from
a little helper with a descriptive name.
Otherwise this looks good to me.
next prev parent reply other threads:[~2020-12-08 13:21 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-04 19:13 [PATCH 0/3 v2] blk-mq: Don't complete in IRQ, use llist_head Sebastian Andrzej Siewior
2020-12-04 19:13 ` [PATCH 1/3] blk-mq: Don't complete on a remote CPU in force threaded mode Sebastian Andrzej Siewior
2020-12-08 13:10 ` Christoph Hellwig
2020-12-04 19:13 ` [PATCH 2/3] blk-mq: Always complete remote completions requests in softirq Sebastian Andrzej Siewior
2020-12-07 23:52 ` Jens Axboe
2020-12-08 8:22 ` Sebastian Andrzej Siewior
2020-12-08 8:44 ` Daniel Wagner
2020-12-08 11:36 ` Daniel Wagner
2020-12-08 11:49 ` Sebastian Andrzej Siewior
2020-12-08 12:41 ` Daniel Wagner
2020-12-08 12:52 ` Sebastian Andrzej Siewior
2020-12-08 12:57 ` Sebastian Andrzej Siewior
2020-12-08 13:27 ` Daniel Wagner
2020-12-17 16:45 ` Jens Axboe
2020-12-17 16:49 ` Daniel Wagner
2020-12-17 16:54 ` Jens Axboe
2020-12-08 13:13 ` Christoph Hellwig
2020-12-17 16:43 ` Sebastian Andrzej Siewior
2020-12-17 16:55 ` Jens Axboe
2020-12-17 16:58 ` Sebastian Andrzej Siewior
2020-12-17 17:05 ` Daniel Wagner
2020-12-17 18:16 ` Daniel Wagner
2020-12-17 18:22 ` Jens Axboe
2020-12-17 18:41 ` Daniel Wagner
2020-12-17 18:46 ` Jens Axboe
2020-12-17 19:07 ` Daniel Wagner
2020-12-17 19:13 ` Jens Axboe
2020-12-17 19:15 ` Daniel Wagner
2020-12-04 19:13 ` [PATCH 3/3] blk-mq: Use llist_head for blk_cpu_done Sebastian Andrzej Siewior
2020-12-08 13:20 ` Christoph Hellwig [this message]
2020-12-08 13:28 ` Christoph Hellwig
2020-12-14 20:20 ` Sebastian Andrzej Siewior
-- strict thread matches above, loose matches on Subject: below --
2021-01-23 20:10 [PATCH v3 0/3] blk-mq: Don't complete in IRQ, use llist_head Sebastian Andrzej Siewior
2021-01-23 20:10 ` [PATCH 3/3] blk-mq: Use llist_head for blk_cpu_done Sebastian Andrzej Siewior
2021-01-25 8:30 ` Christoph Hellwig
2021-01-25 8:32 ` Sebastian Andrzej Siewior
2021-01-25 8:39 ` Christoph Hellwig
2020-10-28 6:56 [PATCH RFC] blk-mq: Don't IPI requests on PREEMPT_RT Christoph Hellwig
2020-10-28 14:12 ` [PATCH 1/3] blk-mq: Don't complete on a remote CPU in force threaded mode Sebastian Andrzej Siewior
2020-10-28 14:12 ` [PATCH 3/3] blk-mq: Use llist_head for blk_cpu_done Sebastian Andrzej Siewior
2020-10-28 14:44 ` Christoph Hellwig
2020-10-28 14:47 ` Sebastian Andrzej Siewior
2020-10-29 13:12 ` Sebastian Andrzej Siewior
2020-10-29 14:05 ` Christoph Hellwig
2020-10-29 14:56 ` Sebastian Andrzej Siewior
2020-10-29 14:57 ` Christoph Hellwig
2020-10-29 20:03 ` Sagi Grimberg
2020-10-29 21:01 ` Sebastian Andrzej Siewior
2020-10-29 21:07 ` Sagi Grimberg
2020-10-31 10:41 ` Sebastian Andrzej Siewior
2020-10-31 15:00 ` Jens Axboe
2020-10-31 15:01 ` Jens Axboe
2020-10-31 18:09 ` Christoph Hellwig
2020-11-02 9:55 ` Sebastian Andrzej Siewior
2020-11-02 18:12 ` Christoph Hellwig
2020-11-04 19:15 ` Sagi Grimberg
2020-11-06 15:23 ` Sebastian Andrzej Siewior
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201208132004.GC22219@infradead.org \
--to=hch@infradead.org \
--cc=axboe@kernel.dk \
--cc=bigeasy@linutronix.de \
--cc=dwagner@suse.de \
--cc=efault@gmx.de \
--cc=linux-block@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=sagi@grimberg.me \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.