LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com> To: linux-kernel@vger.kernel.org Cc: Daniel Lezcano <daniel.lezcano@linaro.org>, Stefano Garzarella <sgarzare@redhat.com>, Ming Lei <ming.lei@redhat.com>, "Michael S . Tsirkin" <mst@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>, Jens Axboe <axboe@kernel.dk>, Jason Wang <jasowang@redhat.com>, linux-block@vger.kernel.org, "Rafael J. Wysocki" <rjw@rjwysocki.net>, virtualization@lists.linux-foundation.org, linux-pm@vger.kernel.org, Christoph Hellwig <hch@infradead.org>, Stefan Hajnoczi <stefanha@redhat.com> Subject: [RFC 3/3] softirq: participate in cpuidle polling Date: Tue, 13 Jul 2021 17:19:06 +0100 [thread overview] Message-ID: <20210713161906.457857-4-stefanha@redhat.com> (raw) In-Reply-To: <20210713161906.457857-1-stefanha@redhat.com> Normally softirqs are invoked when exiting irqs. When polling in the cpuidle driver there may be no irq. Therefore pending softirqs go unnoticed and polling continues without invoking them. Add a softirq_poll() function to explicitly check for and invoke softirqs. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- This commit is not needed for virtio-blk. I added it when I realized virtio-net's NAPI scheduling might not be detected by the cpuidle busy wait loop because it is unaware of softirqs. However, even after doing this virtio-net's NAPI polling doesn't combine with cpuidle haltpoll. Perhaps this patch is still desirable for cpuidle poll_state in case a softirq is raised? --- include/linux/interrupt.h | 2 ++ drivers/cpuidle/poll_source.c | 3 +++ kernel/softirq.c | 14 ++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 4777850a6dc7..9bfdcc466ba8 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h @@ -573,6 +573,8 @@ struct softirq_action asmlinkage void do_softirq(void); asmlinkage void __do_softirq(void); +extern void softirq_poll(void); + extern void open_softirq(int nr, void (*action)(struct softirq_action *)); extern void softirq_init(void); extern void __raise_softirq_irqoff(unsigned int nr); diff --git a/drivers/cpuidle/poll_source.c b/drivers/cpuidle/poll_source.c index 46100e5a71e4..ed200feb0daa 100644 --- a/drivers/cpuidle/poll_source.c +++ b/drivers/cpuidle/poll_source.c @@ -6,6 +6,7 @@ #include <linux/lockdep.h> #include <linux/percpu.h> #include <linux/poll_source.h> +#include <linux/interrupt.h> /* The per-cpu list of registered poll sources */ DEFINE_PER_CPU(struct list_head, poll_source_list); @@ -26,6 +27,8 @@ void poll_source_run_once(void) list_for_each_entry(src, this_cpu_ptr(&poll_source_list), node) src->ops->poll(src); + + softirq_poll(); } /* Called from idle task with TIF_POLLING_NRFLAG set and irqs enabled */ diff --git a/kernel/softirq.c b/kernel/softirq.c index 4992853ef53d..f45bf0204218 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -611,6 +611,20 @@ void irq_enter(void) irq_enter_rcu(); } +/** + * softirq_poll() - invoke pending softirqs + * + * Normally it is not necessary to explicitly poll for softirqs, but in the + * cpuidle driver a polling function may have raised a softirq with no irq exit + * to invoke it. Therefore it is necessary to poll for pending softirqs and + * invoke them explicitly. + */ +void softirq_poll(void) +{ + if (!in_interrupt() && local_softirq_pending()) + invoke_softirq(); +} + static inline void tick_irq_exit(void) { #ifdef CONFIG_NO_HZ_COMMON -- 2.31.1
next prev parent reply other threads:[~2021-07-13 16:19 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-13 16:19 [RFC 0/3] cpuidle: add poll_source API and virtio vq polling Stefan Hajnoczi 2021-07-13 16:19 ` [RFC 1/3] cpuidle: add poll_source API Stefan Hajnoczi 2021-07-19 21:03 ` Marcelo Tosatti 2021-07-20 14:15 ` Stefan Hajnoczi 2021-07-13 16:19 ` [RFC 2/3] virtio: add poll_source virtqueue polling Stefan Hajnoczi 2021-07-13 16:19 ` Stefan Hajnoczi [this message] 2021-07-21 3:29 ` [RFC 0/3] cpuidle: add poll_source API and virtio vq polling Jason Wang 2021-07-21 9:41 ` Stefan Hajnoczi 2021-07-22 9:04 ` Jason Wang 2021-07-26 15:17 ` Stefan Hajnoczi 2021-07-26 15:47 ` Rafael J. Wysocki 2021-07-26 16:01 ` Stefan Hajnoczi 2021-07-26 16:37 ` Rafael J. Wysocki 2021-07-27 13:32 ` Stefan Hajnoczi
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=20210713161906.457857-4-stefanha@redhat.com \ --to=stefanha@redhat.com \ --cc=axboe@kernel.dk \ --cc=daniel.lezcano@linaro.org \ --cc=hch@infradead.org \ --cc=jasowang@redhat.com \ --cc=linux-block@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-pm@vger.kernel.org \ --cc=ming.lei@redhat.com \ --cc=mst@redhat.com \ --cc=mtosatti@redhat.com \ --cc=rjw@rjwysocki.net \ --cc=sgarzare@redhat.com \ --cc=virtualization@lists.linux-foundation.org \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).