iommu/arm-smmu-v3: Ratelimit event dump
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>
This commit is contained in:
parent
395ad89d11
commit
9cff922bba
|
@ -1518,6 +1518,8 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev)
|
||||||
struct arm_smmu_device *smmu = dev;
|
struct arm_smmu_device *smmu = dev;
|
||||||
struct arm_smmu_queue *q = &smmu->evtq.q;
|
struct arm_smmu_queue *q = &smmu->evtq.q;
|
||||||
struct arm_smmu_ll_queue *llq = &q->llq;
|
struct arm_smmu_ll_queue *llq = &q->llq;
|
||||||
|
static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
|
||||||
|
DEFAULT_RATELIMIT_BURST);
|
||||||
u64 evt[EVTQ_ENT_DWORDS];
|
u64 evt[EVTQ_ENT_DWORDS];
|
||||||
|
|
||||||
do {
|
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]);
|
u8 id = FIELD_GET(EVTQ_0_ID, evt[0]);
|
||||||
|
|
||||||
ret = arm_smmu_handle_evt(smmu, evt);
|
ret = arm_smmu_handle_evt(smmu, evt);
|
||||||
if (!ret)
|
if (!ret || !__ratelimit(&rs))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dev_info(smmu->dev, "event 0x%02x received:\n", id);
|
dev_info(smmu->dev, "event 0x%02x received:\n", id);
|
||||||
|
|
Loading…
Reference in New Issue