mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
iommu/arm-smmu-v3: Convert to use atomic poll timeout
The arm_smmu_write_reg_sync() helper is currently implemented using
readl_relaxed_poll_timeout() (that relies on usleep_range() internally)
which becomes a critical issue when used in the gerror irq handler.
If the SMMU hits a gerror and enters Service Failure Mode
(GERROR_SFM_ERR), the gerror handler calls arm_smmu_device_disable() in
hard-irq context. This becomes a problem as arm_smmu_device_disable()
inevitably calls arm_smmu_write_reg_sync() which might attempt to sleep
inside a hard-irq context.
Fix this by converting the arm_smmu_write_reg_sync to use the
readl_relaxed_poll_timeout_atomic() polling helper.
(Discovered while running Sashiko locally on another patch series).
Reported-by: Sashiko <sashiko-bot@kernel.org>
Fixes: 48ec83bcbc ("iommu/arm-smmu: Add initial driver support for ARM SMMUv3 devices")
Signed-off-by: Pranjal Shrivastava <praan@google.com>
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
f99d3b4bb0
commit
eced8058c8
|
|
@ -4618,8 +4618,9 @@ static int arm_smmu_write_reg_sync(struct arm_smmu_device *smmu, u32 val,
|
|||
u32 reg;
|
||||
|
||||
writel_relaxed(val, smmu->base + reg_off);
|
||||
return readl_relaxed_poll_timeout(smmu->base + ack_off, reg, reg == val,
|
||||
1, ARM_SMMU_POLL_TIMEOUT_US);
|
||||
return readl_relaxed_poll_timeout_atomic(smmu->base + ack_off, reg,
|
||||
reg == val, 1,
|
||||
ARM_SMMU_POLL_TIMEOUT_US);
|
||||
}
|
||||
|
||||
/* GBPA is "special" */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user