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: e644b2f498d2 ("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
..
2023-07-11 09:23:20 +02:00
2023-07-06 22:25:06 -07:00
2023-07-03 12:56:23 -07:00
2023-06-29 11:00:17 -07:00
2023-07-06 09:56:53 -07:00
2023-06-29 08:09:31 -06:00
2023-06-29 16:03:58 -07:00
2023-07-06 09:48:31 -07:00
2023-07-11 09:23:20 +02:00
2023-07-14 13:19:54 +10:00
2023-07-12 11:56:22 -07:00
2023-07-03 12:56:23 -07:00
2023-07-08 12:28:00 -07:00
2023-07-03 12:56:23 -07:00
2023-06-29 15:28:33 -07:00
2023-07-03 11:26:05 -07:00
2023-07-08 12:08:39 -07:00
2023-07-05 10:42:32 -07:00
2023-07-06 10:06:04 -07:00
2023-07-03 10:55:04 -07:00
2023-06-28 14:02:03 -07:00
2023-07-14 19:57:29 -07:00
2023-06-29 14:58:26 -07:00
2023-07-05 21:38:13 -07:00
2023-07-13 00:05:52 +02:00
2023-06-29 15:22:19 -07:00
2023-07-05 12:55:06 -07:00
2023-07-06 19:20:23 -07:00
2023-07-03 17:03:05 -07:00
2023-06-29 15:22:19 -07:00
2023-07-03 10:43:10 -07:00
2023-07-15 08:51:02 -07:00
2023-07-05 10:42:32 -07:00
2023-07-08 12:35:18 -07:00
2023-06-29 15:22:19 -07:00
2023-07-03 15:38:26 -07:00
2023-06-30 15:22:09 -07:00
2023-07-03 15:38:26 -07:00
2023-07-03 11:31:01 -07:00
2023-07-13 13:39:36 -07:00