Hi Aaro, On Fri, May 28, 2021 at 11:09:58AM +0300, Aaro Koskinen wrote: > Hi, > > On Mon, Feb 24, 2020 at 07:23:56PM +0100, Jean-Philippe Brucker wrote: > > When a device or driver misbehaves, it is possible to receive events > > much faster than we can print them out. Ratelimit the printing of > > events. > > > > Signed-off-by: Jean-Philippe Brucker <jean-philippe@xxxxxxxxxx> > > Tested-by: Aaro Koskinen <aaro.koskinen@xxxxxxxxx> > > > During the SVA tests when the device driver didn't properly stop DMA > > before unbinding, the event queue thread would almost lock-up the server > > with a flood of event 0xa. This patch helped recover from the error. > > I was just debugging a similar case, and this patch was required to > prevent system from locking up. > > Could you please resend this patch independently from the other patches > in the series, as it seems it's a worthwhile fix and still relevent for > current kernels. Thanks, Ok, I'll resend it Thanks, Jean > > A. > > > --- > > drivers/iommu/arm-smmu-v3.c | 13 ++++++++----- > > 1 file changed, 8 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c > > index 28f8583cd47b..6a5987cce03f 100644 > > --- a/drivers/iommu/arm-smmu-v3.c > > +++ b/drivers/iommu/arm-smmu-v3.c > > @@ -2243,17 +2243,20 @@ 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 { > > while (!queue_remove_raw(q, evt)) { > > u8 id = FIELD_GET(EVTQ_0_ID, evt[0]); > > > > - dev_info(smmu->dev, "event 0x%02x received:\n", id); > > - for (i = 0; i < ARRAY_SIZE(evt); ++i) > > - dev_info(smmu->dev, "\t0x%016llx\n", > > - (unsigned long long)evt[i]); > > - > > + if (__ratelimit(&rs)) { > > + dev_info(smmu->dev, "event 0x%02x received:\n", id); > > + for (i = 0; i < ARRAY_SIZE(evt); ++i) > > + dev_info(smmu->dev, "\t0x%016llx\n", > > + (unsigned long long)evt[i]); > > + } > > } > > > > /*