linux-stable/drivers/char/tpm
Lino Sanfilippo 481c2d1462 tpm,tpm_tis: Disable interrupts after 1000 unhandled IRQs
After activation of interrupts for TPM TIS drivers 0-day reports an
interrupt storm on an Inspur NF5180M6 server.

Fix this by detecting the storm and falling back to polling:
Count the number of unhandled interrupts within a 10 ms time interval. In
case that more than 1000 were unhandled deactivate interrupts entirely,
deregister the handler and use polling instead.

Also print a note to point to the tpm_tis_dmi_table.

Since the interrupt deregistration function devm_free_irq() waits for all
interrupt handlers to finish, only trigger a worker in the interrupt
handler and do the unregistration in the worker to avoid a deadlock.

Note: the storm detection logic equals the implementation in
note_interrupt() which uses timestamps and counters stored in struct
irq_desc. Since this structure is private to the generic interrupt core
the TPM TIS core uses its own timestamps and counters. Furthermore the TPM
interrupt handler always returns IRQ_HANDLED to prevent the generic
interrupt core from processing the interrupt storm.

Cc: stable@vger.kernel.org # v6.4+
Fixes: e644b2f498 ("tpm, tpm_tis: Enable interrupt test")
Reported-by: kernel test robot <yujie.liu@intel.com>
Closes: https://lore.kernel.org/oe-lkp/202305041325.ae8b0c43-yujie.liu@intel.com/
Suggested-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Lino Sanfilippo <l.sanfilippo@kunbus.com>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
2023-07-17 19:40:27 +00:00
..
eventlog tpm: remove unnecessary (void*) conversions 2023-04-24 16:15:52 +03:00
st33zp24 tpm: st33zp24: Mark ACPI and OF related data as maybe unused 2023-04-24 16:15:53 +03:00
Kconfig tpm: Add tpm_tis_i2c backend for tpm_tis_core 2022-08-03 23:56:20 +03:00
Makefile tpm: Add tpm_tis_i2c backend for tpm_tis_core 2022-08-03 23:56:20 +03:00
tpm-chip.c tpm: return false from tpm_amd_is_rng_defective on non-x86 platforms 2023-07-17 19:40:22 +00:00
tpm-dev-common.c timers: Get rid of del_singleshot_timer_sync() 2022-11-24 15:09:10 +01:00
tpm-dev.c
tpm-dev.h tpm: Handle negative priv->response_len in tpm_common_read() 2020-01-08 18:11:09 +02:00
tpm-interface.c tpm: Prevent hwrng from activating during resume 2023-05-16 02:43:12 +03:00
tpm-sysfs.c tpm: Add Upgrade/Reduced mode support for TPM2 modules 2022-01-09 00:18:47 +02:00
tpm.h This PR fixes a critical bug in my first pull request. I fixed the 2023-05-01 10:37:37 -07:00
tpm1-cmd.c tpm: Add upgrade/reduced mode support for TPM1.2 modules 2022-08-03 23:56:19 +03:00
tpm2-cmd.c tpm: add vendor flag to command code validation 2023-02-13 10:11:20 +02:00
tpm2-space.c tpm: use try_get_ops() in tpm-space.c 2022-03-10 01:47:25 +02:00
tpm_atmel.c
tpm_atmel.h tpm: atmel: Add explicit include for of.h 2023-04-06 20:36:27 +02:00
tpm_crb.c tpm: Do not remap from ACPI resources again for Pluton TPM 2023-07-17 19:40:27 +00:00
tpm_ftpm_tee.c tpm/tpm_ftpm_tee: Convert to platform remove callback returning void 2023-04-24 16:15:53 +03:00
tpm_ftpm_tee.h tpm/tpm_ftpm_tee: A driver for firmware TPM running inside TEE 2019-09-02 17:08:35 +03:00
tpm_i2c_atmel.c tpm: tpm_i2c_atmel: Convert to i2c's .probe_new() 2023-02-13 10:11:20 +02:00
tpm_i2c_infineon.c tpm: tpm_i2c_infineon: Convert to i2c's .probe_new() 2023-02-13 10:11:20 +02:00
tpm_i2c_nuvoton.c tpm: tpm_i2c_nuvoton: Convert to i2c's .probe_new() 2023-02-13 10:11:20 +02:00
tpm_ibmvtpm.c tpm: ibmvtpm: Correct the return value in tpm_ibmvtpm_probe() 2022-05-23 18:47:49 +03:00
tpm_ibmvtpm.h tpm: ibmvtpm: Avoid error message when process gets signal while waiting 2021-08-23 19:55:42 +03:00
tpm_infineon.c
tpm_nsc.c
tpm_ppi.c char: move from strlcpy with unused retval to strscpy 2022-10-05 00:25:56 +03:00
tpm_tis.c tpm/tpm_tis: Disable interrupts for Lenovo L590 devices 2023-07-17 19:40:27 +00:00
tpm_tis_core.c tpm,tpm_tis: Disable interrupts after 1000 unhandled IRQs 2023-07-17 19:40:27 +00:00
tpm_tis_core.h tpm,tpm_tis: Disable interrupts after 1000 unhandled IRQs 2023-07-17 19:40:27 +00:00
tpm_tis_i2c.c tpm: tis_i2c: Limit write bursts to I2C_SMBUS_BLOCK_MAX (32) bytes 2023-07-17 19:32:30 +00:00
tpm_tis_i2c_cr50.c tpm: cr50: i2c: use jiffies to wait for tpm ready irq 2023-04-24 16:15:52 +03:00
tpm_tis_spi.h tpm: Remove read16/read32/write32 calls from tpm_tis_phy_ops 2022-05-23 18:47:49 +03:00
tpm_tis_spi_cr50.c tpm: Remove read16/read32/write32 calls from tpm_tis_phy_ops 2022-05-23 18:47:49 +03:00
tpm_tis_spi_main.c tpm_tis_spi: Release chip select when flow control fails 2023-07-17 19:32:30 +00:00
tpm_tis_synquacer.c tpm/tpm_tis_synquacer: Convert to platform remove callback returning void 2023-04-24 16:15:53 +03:00
tpm_vtpm_proxy.c tpm: tpm_vtpm_proxy: fix a race condition in /dev/vtpmx creation 2023-07-17 19:32:30 +00:00
tpmrm-dev.c tpm: Unify the mismatching TPM space buffer sizes 2020-07-24 09:26:23 +03:00
xen-tpmfront.c xen: make remove callback of xen driver void returned 2022-12-15 16:06:10 +01:00