From: Pingfan Liu <kernelfans@gmail.com>
To: linux-kernel@vger.kernel.org
Cc: Pingfan Liu <kernelfans@gmail.com>,
Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Jisheng Zhang <Jisheng.Zhang@synaptics.com>,
Andrew Morton <akpm@linux-foundation.org>,
"Guilherme G. Piccoli" <gpiccoli@canonical.com>,
Petr Mladek <pmladek@suse.com>, Marc Zyngier <maz@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
afzal mohammed <afzal.mohd.ma@gmail.com>,
Lina Iyer <ilina@codeaurora.org>,
"Gustavo A. R. Silva" <gustavo@embeddedor.com>,
Maulik Shah <mkshah@codeaurora.org>,
Al Viro <viro@zeniv.linux.org.uk>,
Jonathan Corbet <corbet@lwn.net>,
Pawan Gupta <pawan.kumar.gupta@linux.intel.com>,
Mike Kravetz <mike.kravetz@oracle.com>,
Oliver Neukum <oneukum@suse.com>,
linux-doc@vger.kernel.org, kexec@lists.infradead.org
Subject: [PATCH 2/3] kernel/watchdog: suppress max irq when irq floods
Date: Thu, 22 Oct 2020 13:56:02 +0800 [thread overview]
Message-ID: <1603346163-21645-3-git-send-email-kernelfans@gmail.com> (raw)
In-Reply-To: <1603346163-21645-1-git-send-email-kernelfans@gmail.com>
The capture kernel should try its best to save the crash info. Normally,
irq flood is caused by some trivial devices, which has no impact on saving
vmcore.
Introducing a parameter "irqflood_suppress" to enable suppress irq flood.
Signed-off-by: Pingfan Liu <kernelfans@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Jisheng Zhang <Jisheng.Zhang@synaptics.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: "Guilherme G. Piccoli" <gpiccoli@canonical.com>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: afzal mohammed <afzal.mohd.ma@gmail.com>
Cc: Lina Iyer <ilina@codeaurora.org>
Cc: "Gustavo A. R. Silva" <gustavo@embeddedor.com>
Cc: Maulik Shah <mkshah@codeaurora.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Oliver Neukum <oneukum@suse.com>
To: linux-kernel@vger.kernel.org
Cc: linux-doc@vger.kernel.org
Cc: kexec@lists.infradead.org
---
include/linux/irq.h | 2 ++
kernel/irq/spurious.c | 32 ++++++++++++++++++++++++++++++++
kernel/watchdog.c | 9 ++++++++-
3 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 1b7f4df..140cb61 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -684,6 +684,8 @@ extern void note_interrupt(struct irq_desc *desc, irqreturn_t action_ret);
/* Enable/disable irq debugging output: */
extern int noirqdebug_setup(char *str);
+void suppress_max_irq(void);
+
/* Checks whether the interrupt can be requested by request_irq(): */
extern int can_request_irq(unsigned int irq, unsigned long irqflags);
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c
index f865e5f..d3d94d6 100644
--- a/kernel/irq/spurious.c
+++ b/kernel/irq/spurious.c
@@ -464,3 +464,35 @@ static int __init irqpoll_setup(char *str)
}
__setup("irqpoll", irqpoll_setup);
+
+#ifdef CONFIG_IRQ_TIME_ACCOUNTING
+
+static bool irqflood_suppress;
+
+static int __init irqflood_suppress_setup(char *str)
+{
+ irqflood_suppress = true;
+ pr_info("enable auto suppress irqflood\n");
+ return 1;
+}
+__setup("irqflood_suppress", irqflood_suppress_setup);
+
+void suppress_max_irq(void)
+{
+ unsigned int tmp, maxirq = 0, max = 0;
+ int irq;
+
+ if (!irqflood_suppress)
+ return;
+ for_each_active_irq(irq) {
+ tmp = kstat_irqs_cpu(irq, smp_processor_id());
+ if (max < tmp) {
+ maxirq = irq;
+ max = tmp;
+ }
+ }
+ pr_warn("Suppress irq:%u, which is triggered %u times\n",
+ maxirq, max);
+ disable_irq_nosync(maxirq);
+}
+#endif
diff --git a/kernel/watchdog.c b/kernel/watchdog.c
index 230ac38..28a74e5 100644
--- a/kernel/watchdog.c
+++ b/kernel/watchdog.c
@@ -24,6 +24,7 @@
#include <linux/sched/isolation.h>
#include <linux/stop_machine.h>
#include <linux/kernel_stat.h>
+#include <linux/irq.h>
#include <asm/irq_regs.h>
#include <linux/kvm_para.h>
@@ -364,9 +365,15 @@ static void check_irq_flood(void)
percent = irqts * 100 / totalts;
percent = percent < 100 ? percent : 100;
__this_cpu_write(check_hint, -1);
- if (percent >= 98)
+ if (percent >= 98) {
pr_info("Irq flood occupies more than %lu%% of the past %lu seconds\n",
percent, totalts >> 30);
+ /*
+ * Suppress top irq when scheduler does not work for long time and irq
+ * occupies too much time.
+ */
+ suppress_max_irq();
+ }
} else if (cnt == 0) {
__this_cpu_write(last_total_ts, totalts);
__this_cpu_write(last_irq_ts, irqts);
--
2.7.5
next prev parent reply other threads:[~2020-10-22 5:56 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-22 5:56 [PATCH 0/3] warn and suppress irqflood Pingfan Liu
2020-10-22 5:56 ` [PATCH 1/3] kernel/watchdog: show irq percentage if irq floods Pingfan Liu
2020-10-22 5:56 ` Pingfan Liu [this message]
2020-10-22 5:56 ` [PATCH 3/3] Documentation: introduce a param "irqflood_suppress" Pingfan Liu
2020-10-22 8:37 ` [PATCH 0/3] warn and suppress irqflood Thomas Gleixner
2020-10-25 11:12 ` Pingfan Liu
2020-10-25 12:21 ` [Skiboot] " Oliver O'Halloran
2020-10-25 13:11 ` Pingfan Liu
2020-10-25 13:51 ` Oliver O'Halloran
2020-10-26 15:06 ` Guilherme Piccoli
2020-10-26 19:59 ` Thomas Gleixner
2020-10-26 20:28 ` Guilherme Piccoli
2020-10-26 21:21 ` Thomas Gleixner
2020-10-27 12:28 ` Guilherme Piccoli
2020-10-28 6:02 ` Pingfan Liu
2020-10-28 11:58 ` Thomas Gleixner
2020-10-29 6:26 ` Pingfan Liu
2020-11-06 5:53 ` Pingfan Liu
2021-03-02 7:45 ` Sai Prakash Ranjan
2021-06-05 2:32 ` Sai Prakash Ranjan
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=1603346163-21645-3-git-send-email-kernelfans@gmail.com \
--to=kernelfans@gmail.com \
--cc=Jisheng.Zhang@synaptics.com \
--cc=afzal.mohd.ma@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=corbet@lwn.net \
--cc=gpiccoli@canonical.com \
--cc=gustavo@embeddedor.com \
--cc=ilina@codeaurora.org \
--cc=kexec@lists.infradead.org \
--cc=linus.walleij@linaro.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maz@kernel.org \
--cc=mike.kravetz@oracle.com \
--cc=mkshah@codeaurora.org \
--cc=oneukum@suse.com \
--cc=pawan.kumar.gupta@linux.intel.com \
--cc=peterz@infradead.org \
--cc=pmladek@suse.com \
--cc=tglx@linutronix.de \
--cc=viro@zeniv.linux.org.uk \
/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 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).