iommu/arm-smmu-v3: Ratelimit event dump
authorJean-Philippe Brucker <jean-philippe@linaro.org>
Mon, 31 May 2021 09:56:50 +0000 (11:56 +0200)
committerWill Deacon <will@kernel.org>
Tue, 8 Jun 2021 11:35:55 +0000 (12:35 +0100)
When a device or driver misbehaves, it is possible to receive DMA fault
events much faster than we can print them out, causing a lock up of the
system and inability to cancel the source of the problem. Ratelimit
printing of events to help recovery.

Tested-by: Aaro Koskinen <aaro.koskinen@nokia.com>
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
Link: https://lore.kernel.org/r/20210531095648.118282-1-jean-philippe@linaro.org
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

index 67866bb2b3fd93c4fa9b9359dcc15d4b0b8dad62..9ca9c53735912bd25afdefa8c15f46f8d3fb3f67 100644 (file)
@@ -1518,6 +1518,8 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
        struct arm_smmu_device *smmu = dev;
        struct arm_smmu_queue *q = &smmu->evtq.q;
        struct arm_smmu_ll_queue *llq = &q->llq;
+       static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
+                                     DEFAULT_RATELIMIT_BURST);
        u64 evt[EVTQ_ENT_DWORDS];
 
        do {
@@ -1525,7 +1527,7 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
                        u8 id = FIELD_GET(EVTQ_0_ID, evt[0]);
 
                        ret = arm_smmu_handle_evt(smmu, evt);
-                       if (!ret)
+                       if (!ret || !__ratelimit(&rs))
                                continue;
 
                        dev_info(smmu->dev, "event 0x%02x received:\n", id);