[PATCH v1 11/11] iommu/tegra241-cmdqv: Rate-limit the error ISR's log message
Nicolin Chen
nicolinc at nvidia.com
Thu Jul 2 22:31:37 PDT 2026
tegra241_cmdqv_isr() logs the error-map registers on every error interrupt.
A malfunctioning device, or a guest deliberately faulting its own VCMDQs,
can raise these interrupts rapidly, and the unconditional dev_warn() then
floods the kernel log.
Rate-limit the message with dev_warn_ratelimited(), and pass the error-map
registers straight to it so their four MMIO reads run only when the limiter
prints, instead of building the string on every interrupt.
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Nicolin Chen <nicolinc at nvidia.com>
---
drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
index 41046605de9ca..21a12a20e7436 100644
--- a/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
+++ b/drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
@@ -353,21 +353,19 @@ static irqreturn_t tegra241_cmdqv_isr(int irq, void *devid)
{
struct tegra241_cmdqv *cmdqv = (struct tegra241_cmdqv *)devid;
void __iomem *reg_vintf_map = REG_CMDQV(cmdqv, VINTF_ERR_MAP);
- char err_str[256];
u64 vintf_map;
/* Use readl_relaxed() as register addresses are not 64-bit aligned */
vintf_map = (u64)readl_relaxed(reg_vintf_map + 0x4) << 32 |
(u64)readl_relaxed(reg_vintf_map);
- snprintf(err_str, sizeof(err_str),
- "vintf_map: %016llx, vcmdq_map %08x:%08x:%08x:%08x", vintf_map,
- readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(3))),
- readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(2))),
- readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(1))),
- readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(0))));
-
- dev_warn(cmdqv->dev, "unexpected error reported. %s\n", err_str);
+ dev_warn_ratelimited(
+ cmdqv->dev,
+ "unexpected error reported. vintf_map: %016llx, vcmdq_map %08x:%08x:%08x:%08x\n",
+ vintf_map, readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(3))),
+ readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(2))),
+ readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(1))),
+ readl_relaxed(REG_CMDQV(cmdqv, CMDQ_ERR_MAP(0))));
/* Handle VINTF0 and its LVCMDQs */
if (vintf_map & BIT_ULL(0)) {
--
2.43.0
More information about the linux-arm-kernel
mailing list