Hi,

On Tue, Sep 17, 2019 at 7:45 AM Robin Murphy <robin.mur...@arm.com> wrote:
>
> Although CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT is a welcome tool
> for smoking out inadequate firmware, the failure mode is non-obvious
> and can be confusing for end users. Add some special-case reporting of
> Unidentified Stream Faults to help clarify this particular symptom.
> Since we're adding yet another print to the mix, also break out an
> explicit ratelimit state to make sure everything stays together (and
> reduce the static storage footprint a little).
>
> CC: Douglas Anderson <diand...@chromium.org>

nit: Cc, not CC.


> Signed-off-by: Robin Murphy <robin.mur...@arm.com>
> ---
>  drivers/iommu/arm-smmu.c | 21 ++++++++++++++++-----
>  drivers/iommu/arm-smmu.h |  2 ++
>  2 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
> index b7cf24402a94..b27020fd6c90 100644
> --- a/drivers/iommu/arm-smmu.c
> +++ b/drivers/iommu/arm-smmu.c
> @@ -36,6 +36,7 @@
>  #include <linux/pci.h>
>  #include <linux/platform_device.h>
>  #include <linux/pm_runtime.h>
> +#include <linux/ratelimit.h>
>  #include <linux/slab.h>
>
>  #include <linux/amba/bus.h>
> @@ -485,6 +486,8 @@ static irqreturn_t arm_smmu_global_fault(int irq, void 
> *dev)
>  {
>         u32 gfsr, gfsynr0, gfsynr1, gfsynr2;
>         struct arm_smmu_device *smmu = dev;
> +       static DEFINE_RATELIMIT_STATE(rs, DEFAULT_RATELIMIT_INTERVAL,
> +                                     DEFAULT_RATELIMIT_BURST);
>
>         gfsr = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSR);
>         gfsynr0 = arm_smmu_gr0_read(smmu, ARM_SMMU_GR0_sGFSYNR0);
> @@ -494,11 +497,19 @@ static irqreturn_t arm_smmu_global_fault(int irq, void 
> *dev)
>         if (!gfsr)
>                 return IRQ_NONE;
>
> -       dev_err_ratelimited(smmu->dev,
> -               "Unexpected global fault, this could be serious\n");
> -       dev_err_ratelimited(smmu->dev,
> -               "\tGFSR 0x%08x, GFSYNR0 0x%08x, GFSYNR1 0x%08x, GFSYNR2 
> 0x%08x\n",
> -               gfsr, gfsynr0, gfsynr1, gfsynr2);
> +       if (__ratelimit(&rs)) {
> +               if (IS_ENABLED(CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT) &&
> +                   (gfsr & sGFSR_USF))
> +                       dev_err(smmu->dev,
> +                               "Blocked unknown Stream ID 0x%hx; boot with 
> \"arm-smmu.disable_bypass=0\" to allow, but this may have security 
> implications\n",

optional nit: "%#hx" instead of "0x%hx"

Reviewed-by: Douglas Anderson <diand...@chromium.org>
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to