| From ab4b158c70a5b72b8e40b84d3ed5893ee067d0de Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 19 Jan 2022 07:07:54 +0000 |
| Subject: iommu/arm-smmu-v3: fix event handling soft lockup |
| |
| From: Zhou Guanghui <zhouguanghui1@huawei.com> |
| |
| [ Upstream commit 30de2b541af98179780054836b48825fcfba4408 ] |
| |
| During event processing, events are read from the event queue one |
| by one until the queue is empty.If the master device continuously |
| requests address access at the same time and the SMMU generates |
| events, the cyclic processing of the event takes a long time and |
| softlockup warnings may be reported. |
| |
| arm-smmu-v3 arm-smmu-v3.34.auto: event 0x0a received: |
| arm-smmu-v3 arm-smmu-v3.34.auto: 0x00007f220000280a |
| arm-smmu-v3 arm-smmu-v3.34.auto: 0x000010000000007e |
| arm-smmu-v3 arm-smmu-v3.34.auto: 0x00000000034e8670 |
| watchdog: BUG: soft lockup - CPU#0 stuck for 22s! [irq/268-arm-smm:247] |
| Call trace: |
| _dev_info+0x7c/0xa0 |
| arm_smmu_evtq_thread+0x1c0/0x230 |
| irq_thread_fn+0x30/0x80 |
| irq_thread+0x128/0x210 |
| kthread+0x134/0x138 |
| ret_from_fork+0x10/0x1c |
| Kernel panic - not syncing: softlockup: hung tasks |
| |
| Fix this by calling cond_resched() after the event information is |
| printed. |
| |
| Signed-off-by: Zhou Guanghui <zhouguanghui1@huawei.com> |
| Link: https://lore.kernel.org/r/20220119070754.26528-1-zhouguanghui1@huawei.com |
| Signed-off-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |
| index f5848b351b19..af00714c8056 100644 |
| --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |
| +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c |
| @@ -1558,6 +1558,7 @@ static irqreturn_t arm_smmu_evtq_thread(int irq, void *dev) |
| dev_info(smmu->dev, "\t0x%016llx\n", |
| (unsigned long long)evt[i]); |
| |
| + cond_resched(); |
| } |
| |
| /* |
| -- |
| 2.35.1 |
| |