All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerry Snitselaar <jsnitsel@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-integrity@vger.kernel.org, intel-gfx@lists.freedesktop.org,
	dri-devel@lists.freedesktop.org,
	Jarkko Sakkinen <jarkko@kernel.org>,
	Jason Gunthorpe <jgg@ziepe.ca>, Peter Huewe <peterhuewe@gmx.de>,
	James Bottomley <James.Bottomley@HansenPartnership.com>,
	Matthew Garrett <mjg59@google.com>,
	Hans de Goede <hdegoede@redhat.com>
Subject: [PATCH v3 3/4] tpm_tis: Disable interrupts if interrupt storm detected
Date: Fri,  4 Dec 2020 18:43:39 -0700	[thread overview]
Message-ID: <20201205014340.148235-4-jsnitsel@redhat.com> (raw)
In-Reply-To: <20201205014340.148235-1-jsnitsel@redhat.com>

When enabling the interrupt code for the tpm_tis driver we have
noticed some systems have a bios issue causing an interrupt storm to
occur. The issue isn't limited to a single tpm or system manufacturer
so keeping a denylist of systems with the issue isn't optimal. Instead
try to detect the problem occurring, disable interrupts, and revert to
polling when it happens.

Cc: Jarkko Sakkinen <jarkko@kernel.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Peter Huewe <peterhuewe@gmx.de>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Matthew Garrett <mjg59@google.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
---
v3: - Change include from linux/kernel_stat.h to linux/irq.h
v2: - drop tpm_tis specific workqueue and use just system_w

drivers/char/tpm/tpm_tis_core.c | 27 +++++++++++++++++++++++++++
 drivers/char/tpm/tpm_tis_core.h |  2 ++
 2 files changed, 29 insertions(+)

diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 92c51c6cfd1b..d817ff5664d1 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -24,6 +24,8 @@
 #include <linux/wait.h>
 #include <linux/acpi.h>
 #include <linux/freezer.h>
+#include <linux/workqueue.h>
+#include <linux/irq.h>
 #include "tpm.h"
 #include "tpm_tis_core.h"
 
@@ -715,9 +717,23 @@ static irqreturn_t tis_int_handler(int dummy, void *dev_id)
 {
 	struct tpm_chip *chip = dev_id;
 	struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
+	static bool check_storm = true;
+	static unsigned int check_start;
 	u32 interrupt;
 	int i, rc;
 
+	if (unlikely(check_storm)) {
+		if (!check_start) {
+			check_start = jiffies_to_msecs(jiffies);
+		} else if ((kstat_irqs(priv->irq) > 1000) &&
+			   (jiffies_to_msecs(jiffies) - check_start < 500)) {
+			check_storm = false;
+			schedule_work(&priv->storm_work);
+		} else if (jiffies_to_msecs(jiffies) - check_start >= 500) {
+			check_storm = false;
+		}
+	}
+
 	rc = tpm_tis_read32(priv, TPM_INT_STATUS(priv->locality), &interrupt);
 	if (rc < 0)
 		return IRQ_NONE;
@@ -943,6 +959,14 @@ static const struct tpm_class_ops tpm_tis = {
 	.clk_enable = tpm_tis_clkrun_enable,
 };
 
+static void tpm_tis_storm_work(struct work_struct *work)
+{
+	struct tpm_tis_data *priv = container_of(work, struct tpm_tis_data, storm_work);
+
+	disable_interrupts(priv->chip);
+	dev_warn(&priv->chip->dev, "Interrupt storm detected, using polling.\n");
+}
+
 int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 		      const struct tpm_tis_phy_ops *phy_ops,
 		      acpi_handle acpi_dev_handle)
@@ -959,6 +983,9 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 	if (IS_ERR(chip))
 		return PTR_ERR(chip);
 
+	priv->chip = chip;
+	INIT_WORK(&priv->storm_work, tpm_tis_storm_work);
+
 #ifdef CONFIG_ACPI
 	chip->acpi_dev_handle = acpi_dev_handle;
 #endif
diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
index 9b2d32a59f67..973297ee2e16 100644
--- a/drivers/char/tpm/tpm_tis_core.h
+++ b/drivers/char/tpm/tpm_tis_core.h
@@ -95,6 +95,8 @@ struct tpm_tis_data {
 	u16 clkrun_enabled;
 	wait_queue_head_t int_queue;
 	wait_queue_head_t read_queue;
+	struct work_struct storm_work;
+	struct tpm_chip *chip;
 	const struct tpm_tis_phy_ops *phy_ops;
 	unsigned short rng_quality;
 };
-- 
2.27.0


WARNING: multiple messages have this Message-ID (diff)
From: Jerry Snitselaar <jsnitsel@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Hans de Goede <hdegoede@redhat.com>,
	intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
	James Bottomley <James.Bottomley@HansenPartnership.com>,
	Jason Gunthorpe <jgg@ziepe.ca>,
	Jarkko Sakkinen <jarkko@kernel.org>,
	Matthew Garrett <mjg59@google.com>,
	Peter Huewe <peterhuewe@gmx.de>,
	linux-integrity@vger.kernel.org
Subject: [PATCH v3 3/4] tpm_tis: Disable interrupts if interrupt storm detected
Date: Fri,  4 Dec 2020 18:43:39 -0700	[thread overview]
Message-ID: <20201205014340.148235-4-jsnitsel@redhat.com> (raw)
In-Reply-To: <20201205014340.148235-1-jsnitsel@redhat.com>

When enabling the interrupt code for the tpm_tis driver we have
noticed some systems have a bios issue causing an interrupt storm to
occur. The issue isn't limited to a single tpm or system manufacturer
so keeping a denylist of systems with the issue isn't optimal. Instead
try to detect the problem occurring, disable interrupts, and revert to
polling when it happens.

Cc: Jarkko Sakkinen <jarkko@kernel.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Peter Huewe <peterhuewe@gmx.de>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Matthew Garrett <mjg59@google.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
---
v3: - Change include from linux/kernel_stat.h to linux/irq.h
v2: - drop tpm_tis specific workqueue and use just system_w

drivers/char/tpm/tpm_tis_core.c | 27 +++++++++++++++++++++++++++
 drivers/char/tpm/tpm_tis_core.h |  2 ++
 2 files changed, 29 insertions(+)

diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 92c51c6cfd1b..d817ff5664d1 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -24,6 +24,8 @@
 #include <linux/wait.h>
 #include <linux/acpi.h>
 #include <linux/freezer.h>
+#include <linux/workqueue.h>
+#include <linux/irq.h>
 #include "tpm.h"
 #include "tpm_tis_core.h"
 
@@ -715,9 +717,23 @@ static irqreturn_t tis_int_handler(int dummy, void *dev_id)
 {
 	struct tpm_chip *chip = dev_id;
 	struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
+	static bool check_storm = true;
+	static unsigned int check_start;
 	u32 interrupt;
 	int i, rc;
 
+	if (unlikely(check_storm)) {
+		if (!check_start) {
+			check_start = jiffies_to_msecs(jiffies);
+		} else if ((kstat_irqs(priv->irq) > 1000) &&
+			   (jiffies_to_msecs(jiffies) - check_start < 500)) {
+			check_storm = false;
+			schedule_work(&priv->storm_work);
+		} else if (jiffies_to_msecs(jiffies) - check_start >= 500) {
+			check_storm = false;
+		}
+	}
+
 	rc = tpm_tis_read32(priv, TPM_INT_STATUS(priv->locality), &interrupt);
 	if (rc < 0)
 		return IRQ_NONE;
@@ -943,6 +959,14 @@ static const struct tpm_class_ops tpm_tis = {
 	.clk_enable = tpm_tis_clkrun_enable,
 };
 
+static void tpm_tis_storm_work(struct work_struct *work)
+{
+	struct tpm_tis_data *priv = container_of(work, struct tpm_tis_data, storm_work);
+
+	disable_interrupts(priv->chip);
+	dev_warn(&priv->chip->dev, "Interrupt storm detected, using polling.\n");
+}
+
 int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 		      const struct tpm_tis_phy_ops *phy_ops,
 		      acpi_handle acpi_dev_handle)
@@ -959,6 +983,9 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 	if (IS_ERR(chip))
 		return PTR_ERR(chip);
 
+	priv->chip = chip;
+	INIT_WORK(&priv->storm_work, tpm_tis_storm_work);
+
 #ifdef CONFIG_ACPI
 	chip->acpi_dev_handle = acpi_dev_handle;
 #endif
diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
index 9b2d32a59f67..973297ee2e16 100644
--- a/drivers/char/tpm/tpm_tis_core.h
+++ b/drivers/char/tpm/tpm_tis_core.h
@@ -95,6 +95,8 @@ struct tpm_tis_data {
 	u16 clkrun_enabled;
 	wait_queue_head_t int_queue;
 	wait_queue_head_t read_queue;
+	struct work_struct storm_work;
+	struct tpm_chip *chip;
 	const struct tpm_tis_phy_ops *phy_ops;
 	unsigned short rng_quality;
 };
-- 
2.27.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

WARNING: multiple messages have this Message-ID (diff)
From: Jerry Snitselaar <jsnitsel@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
	James Bottomley <James.Bottomley@HansenPartnership.com>,
	Jason Gunthorpe <jgg@ziepe.ca>,
	Jarkko Sakkinen <jarkko@kernel.org>,
	Matthew Garrett <mjg59@google.com>,
	Peter Huewe <peterhuewe@gmx.de>,
	linux-integrity@vger.kernel.org
Subject: [Intel-gfx] [PATCH v3 3/4] tpm_tis: Disable interrupts if interrupt storm detected
Date: Fri,  4 Dec 2020 18:43:39 -0700	[thread overview]
Message-ID: <20201205014340.148235-4-jsnitsel@redhat.com> (raw)
In-Reply-To: <20201205014340.148235-1-jsnitsel@redhat.com>

When enabling the interrupt code for the tpm_tis driver we have
noticed some systems have a bios issue causing an interrupt storm to
occur. The issue isn't limited to a single tpm or system manufacturer
so keeping a denylist of systems with the issue isn't optimal. Instead
try to detect the problem occurring, disable interrupts, and revert to
polling when it happens.

Cc: Jarkko Sakkinen <jarkko@kernel.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Peter Huewe <peterhuewe@gmx.de>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Matthew Garrett <mjg59@google.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jerry Snitselaar <jsnitsel@redhat.com>
---
v3: - Change include from linux/kernel_stat.h to linux/irq.h
v2: - drop tpm_tis specific workqueue and use just system_w

drivers/char/tpm/tpm_tis_core.c | 27 +++++++++++++++++++++++++++
 drivers/char/tpm/tpm_tis_core.h |  2 ++
 2 files changed, 29 insertions(+)

diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 92c51c6cfd1b..d817ff5664d1 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -24,6 +24,8 @@
 #include <linux/wait.h>
 #include <linux/acpi.h>
 #include <linux/freezer.h>
+#include <linux/workqueue.h>
+#include <linux/irq.h>
 #include "tpm.h"
 #include "tpm_tis_core.h"
 
@@ -715,9 +717,23 @@ static irqreturn_t tis_int_handler(int dummy, void *dev_id)
 {
 	struct tpm_chip *chip = dev_id;
 	struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
+	static bool check_storm = true;
+	static unsigned int check_start;
 	u32 interrupt;
 	int i, rc;
 
+	if (unlikely(check_storm)) {
+		if (!check_start) {
+			check_start = jiffies_to_msecs(jiffies);
+		} else if ((kstat_irqs(priv->irq) > 1000) &&
+			   (jiffies_to_msecs(jiffies) - check_start < 500)) {
+			check_storm = false;
+			schedule_work(&priv->storm_work);
+		} else if (jiffies_to_msecs(jiffies) - check_start >= 500) {
+			check_storm = false;
+		}
+	}
+
 	rc = tpm_tis_read32(priv, TPM_INT_STATUS(priv->locality), &interrupt);
 	if (rc < 0)
 		return IRQ_NONE;
@@ -943,6 +959,14 @@ static const struct tpm_class_ops tpm_tis = {
 	.clk_enable = tpm_tis_clkrun_enable,
 };
 
+static void tpm_tis_storm_work(struct work_struct *work)
+{
+	struct tpm_tis_data *priv = container_of(work, struct tpm_tis_data, storm_work);
+
+	disable_interrupts(priv->chip);
+	dev_warn(&priv->chip->dev, "Interrupt storm detected, using polling.\n");
+}
+
 int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 		      const struct tpm_tis_phy_ops *phy_ops,
 		      acpi_handle acpi_dev_handle)
@@ -959,6 +983,9 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq,
 	if (IS_ERR(chip))
 		return PTR_ERR(chip);
 
+	priv->chip = chip;
+	INIT_WORK(&priv->storm_work, tpm_tis_storm_work);
+
 #ifdef CONFIG_ACPI
 	chip->acpi_dev_handle = acpi_dev_handle;
 #endif
diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h
index 9b2d32a59f67..973297ee2e16 100644
--- a/drivers/char/tpm/tpm_tis_core.h
+++ b/drivers/char/tpm/tpm_tis_core.h
@@ -95,6 +95,8 @@ struct tpm_tis_data {
 	u16 clkrun_enabled;
 	wait_queue_head_t int_queue;
 	wait_queue_head_t read_queue;
+	struct work_struct storm_work;
+	struct tpm_chip *chip;
 	const struct tpm_tis_phy_ops *phy_ops;
 	unsigned short rng_quality;
 };
-- 
2.27.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  parent reply	other threads:[~2020-12-05  1:45 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-05  1:43 [PATCH v3 0/4] tpm_tis: Detect interrupt storms Jerry Snitselaar
2020-12-05  1:43 ` [Intel-gfx] " Jerry Snitselaar
2020-12-05  1:43 ` Jerry Snitselaar
2020-12-05  1:43 ` [PATCH v3 1/4] irq: export kstat_irqs Jerry Snitselaar
2020-12-05  1:43   ` [Intel-gfx] " Jerry Snitselaar
2020-12-05  1:43   ` Jerry Snitselaar
2020-12-05 10:39   ` Jarkko Sakkinen
2020-12-05 10:39     ` [Intel-gfx] " Jarkko Sakkinen
2020-12-05 10:39     ` Jarkko Sakkinen
2020-12-06 16:40     ` Thomas Gleixner
2020-12-06 16:40       ` [Intel-gfx] " Thomas Gleixner
2020-12-06 16:40       ` Thomas Gleixner
2020-12-06 17:40       ` James Bottomley
2020-12-06 17:40         ` [Intel-gfx] " James Bottomley
2020-12-06 17:40         ` James Bottomley
2020-12-06 19:29         ` Thomas Gleixner
2020-12-06 19:29           ` [Intel-gfx] " Thomas Gleixner
2020-12-06 19:29           ` Thomas Gleixner
2020-12-06 17:54   ` Thomas Gleixner
2020-12-06 17:54     ` [Intel-gfx] " Thomas Gleixner
2020-12-06 17:54     ` Thomas Gleixner
2020-12-06 21:46     ` Jerry Snitselaar
2020-12-06 21:46       ` [Intel-gfx] " Jerry Snitselaar
2020-12-06 21:46       ` Jerry Snitselaar
2020-12-05  1:43 ` [PATCH v3 2/4] drm/i915/pmu: Use kstat_irqs to get interrupt count Jerry Snitselaar
2020-12-05  1:43   ` [Intel-gfx] " Jerry Snitselaar
2020-12-05  1:43   ` Jerry Snitselaar
2020-12-06 16:38   ` Thomas Gleixner
2020-12-06 16:38     ` [Intel-gfx] " Thomas Gleixner
2020-12-06 16:38     ` Thomas Gleixner
2020-12-06 21:33     ` Thomas Gleixner
2020-12-06 21:33       ` [Intel-gfx] " Thomas Gleixner
2020-12-06 21:33       ` Thomas Gleixner
2020-12-08  9:54       ` Jarkko Sakkinen
2020-12-08  9:54         ` [Intel-gfx] " Jarkko Sakkinen
2020-12-08  9:54         ` Jarkko Sakkinen
2020-12-06 21:47     ` Jerry Snitselaar
2020-12-06 21:47       ` [Intel-gfx] " Jerry Snitselaar
2020-12-06 21:47       ` Jerry Snitselaar
2020-12-06 23:38       ` Thomas Gleixner
2020-12-06 23:38         ` [Intel-gfx] " Thomas Gleixner
2020-12-06 23:38         ` Thomas Gleixner
2020-12-10  7:53     ` [Intel-gfx] " Joonas Lahtinen
2020-12-10  7:53       ` Joonas Lahtinen
2020-12-10  7:53       ` Joonas Lahtinen
2020-12-10 10:45       ` Tvrtko Ursulin
2020-12-10 10:45         ` Tvrtko Ursulin
2020-12-10 10:45         ` Tvrtko Ursulin
2020-12-10 16:35         ` Thomas Gleixner
2020-12-10 16:35           ` Thomas Gleixner
2020-12-10 16:35           ` Thomas Gleixner
2020-12-10 17:09           ` Tvrtko Ursulin
2020-12-10 17:09             ` Tvrtko Ursulin
2020-12-10 17:09             ` Tvrtko Ursulin
2020-12-10 17:44             ` Thomas Gleixner
2020-12-10 17:44               ` Thomas Gleixner
2020-12-10 17:44               ` Thomas Gleixner
2020-12-10 17:51               ` Tvrtko Ursulin
2020-12-10 17:51                 ` Tvrtko Ursulin
2020-12-10 17:51                 ` Tvrtko Ursulin
2020-12-05  1:43 ` Jerry Snitselaar [this message]
2020-12-05  1:43   ` [Intel-gfx] [PATCH v3 3/4] tpm_tis: Disable interrupts if interrupt storm detected Jerry Snitselaar
2020-12-05  1:43   ` Jerry Snitselaar
2020-12-06 19:26   ` Thomas Gleixner
2020-12-06 19:26     ` [Intel-gfx] " Thomas Gleixner
2020-12-06 19:26     ` Thomas Gleixner
2020-12-07 19:28     ` Jason Gunthorpe
2020-12-07 19:28       ` Jason Gunthorpe
2020-12-07 19:58       ` James Bottomley
2020-12-07 19:58         ` [Intel-gfx] " James Bottomley
2020-12-07 19:58         ` James Bottomley
2020-12-08 17:43         ` Jarkko Sakkinen
2020-12-08 17:43           ` [Intel-gfx] " Jarkko Sakkinen
2020-12-08 17:43           ` Jarkko Sakkinen
2020-12-08 17:42       ` Jarkko Sakkinen
2020-12-08 17:42         ` [Intel-gfx] " Jarkko Sakkinen
2020-12-08 17:42         ` Jarkko Sakkinen
2020-12-05  1:43 ` [PATCH v3 4/4] tpm_tis: Disable Interrupts on the ThinkPad L490 Jerry Snitselaar
2020-12-05  1:43   ` [Intel-gfx] " Jerry Snitselaar
2020-12-05  1:43   ` Jerry Snitselaar
2020-12-05  1:55 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for tpm_tis: Detect interrupt storms Patchwork
2020-12-05  2:25 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-12-05  5:32 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2020-12-06 19:50 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for tpm_tis: Detect interrupt storms (rev2) Patchwork
2020-12-06 19:51 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-12-06 20:22 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-12-06 21:59 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork

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=20201205014340.148235-4-jsnitsel@redhat.com \
    --to=jsnitsel@redhat.com \
    --cc=James.Bottomley@HansenPartnership.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hdegoede@redhat.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jarkko@kernel.org \
    --cc=jgg@ziepe.ca \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mjg59@google.com \
    --cc=peterhuewe@gmx.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.