Patch "iommu/arm-smmu: Disable stalling faults for all endpoints" has been added to the 4.7-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
iommu/arm-smmu: Disable stalling faults for all endpoints
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
iommu-arm-smmu-disable-stalling-faults-for-all-endpoints.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
3714ce1d6655098ee69ede632883e5874d67e4abMon Sep 17 00:00:00 2001
From: Will Deacon <[email protected]>
Date: Fri, 5 Aug 2016 19:49:45 +0100
Subject: iommu/arm-smmu: Disable stalling faults for all endpoints
From: Will Deacon <[email protected]>
commit 3714ce1d6655098ee69ede632883e5874d67e4ab upstream.
Enabling stalling faults can result in hardware deadlock on poorly designed systems, particularly those with a PCI root complex upstream of the SMMU.
Although it's not really Linux's job to save hardware integrators from their own misfortune, it *is* our job to stop userspace (e.g. VFIO clients) from hosing the system for everybody else, even if they might already be required to have elevated privileges.
Given that the fault handling code currently executes entirely in IRQ context, there is nothing that can sensibly be done to recover from things like page faults anyway, so let's rip this code out for now and avoid the potential for deadlock.
--- drivers/iommu/arm-smmu.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
drivers/iommu/arm-smmu.c +7 -27
@@ -686,8 +686,7 @@ static struct iommu_gather_ops arm_smmu_static irqreturn_t arm_smmu_context_fault (int irq,void *dev) { -int flags, ret; -u32 fsr, fsynr, resume; +u32 fsr, fsynr;unsigned long iova;struct iommu_domain *domain = dev;struct arm_smmu_domain *smmu_domain =to_smmu_domain (domain);
@@ -701,34 +700,15 @@ static irqreturn_t arm_smmu_context_faulif (!(fsr &FSR_FAULT ))return IRQ_NONE ; -if (fsr &FSR_IGN ) -dev_err_ratelimited (smmu->dev, -"Unexpected context fault (fsr 0x%x)\n" , - fsr); - fsynr =readl_relaxed (cb_base +ARM_SMMU_CB_FSYNR0 ); - flags = fsynr &FSYNR0_WNR ?IOMMU_FAULT_WRITE :IOMMU_FAULT_READ ; - iova =readq_relaxed (cb_base +ARM_SMMU_CB_FAR ); -if (!report_iommu_fault (domain, smmu->dev, iova, flags)) { - ret =IRQ_HANDLED ; - resume =RESUME_RETRY ; - }else { -dev_err_ratelimited (smmu->dev, -"Unhandled context fault: iova=0x%08lx, fsynr=0x%x, cb=%d\n" , - iova, fsynr, cfg->cbndx); - ret =IRQ_NONE ; - resume =RESUME_TERMINATE ; - } -/* Clear the faulting FSR */ -writel (fsr, cb_base +ARM_SMMU_CB_FSR ); - -/* Retry or terminate any stalled transactions */ -if (fsr &FSR_SS ) -writel_relaxed (resume, cb_base +ARM_SMMU_CB_RESUME ); +dev_err_ratelimited (smmu->dev, +"Unhandled context fault: fsr=0x%x, iova=0x%08lx, fsynr=0x%x, cb=%d\n" , + fsr, iova, fsynr, cfg->cbndx); -return ret; +writel (fsr, cb_base +ARM_SMMU_CB_FSR ); +return IRQ_HANDLED ; }static irqreturn_t arm_smmu_global_fault (int irq,void *dev)
@@ -837,7 +817,7 @@ static void arm_smmu_init_context_bank(s }/* SCTLR */ - reg =SCTLR_CFCFG |SCTLR_CFIE |SCTLR_CFRE |SCTLR_M |SCTLR_EAE_SBOP ; + reg =SCTLR_CFIE |SCTLR_CFRE |SCTLR_M |SCTLR_EAE_SBOP ;if (stage1) reg |=SCTLR_S1_ASIDPNE ;#ifdef __BIG_ENDIAN
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/arm64-kernel-fix-unmasked-debug-exceptions-when-restoring-mdscr_el1.patch queue-4.7/iommu-io-pgtable-arm-v7s-fix-attributes-when-splitting-blocks.patch queue-4.7/iommu-arm-smmu-disable-stalling-faults-for-all-endpoints.patch queue-4.7/arm64-avoid-tlb-conflict-with-config_randomize_base.patch queue-4.7/arm64-define-at_vector_size_arch-for-arch_dlinfo.patch queue-4.7/iommu-arm-smmu-don-t-bug-if-we-find-aborting-stes-with-disable_bypass.patch queue-4.7/iommu-arm-smmu-fix-cmdq-error-handling.patch