Re: [PATCH v9 01/12] iommu/arm-smmu-v3: Do not enable EVTQ/PRIQ interrupts in kdump kernel
From: Jason Gunthorpe
Date: Fri Aug 21 2026 - 19:17:37 EST
> static irqreturn_t arm_smmu_combined_irq_handler(int irq, void *dev)
> {
> - arm_smmu_gerror_handler(irq, dev);
> + irqreturn_t ret = arm_smmu_gerror_handler(irq, dev);
> +
> + /* In kdump, EVTQ/PRIQ are disabled and there is no thread to wake */
> + if (is_kdump_kernel())
> + return ret;
> return IRQ_WAKE_THREAD;
To Robin's earlier point, how about some ARM_SMMU_FEAT_EVTQ ? We already have
ARM_SMMU_FEAT_PRI. Unset these by kdump instead of sprinkling kdump things
everywhere?
I'm not especially kean on these kdump annotations as a long term
maintainability, but having a FEAT to protect a well defined area of
functionality seems more understandable long term.
Plus maybe an embedded user would disable FEAT_PRI for other reasons, somehow?
> @@ -4625,6 +4629,21 @@ static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu)
> arm_smmu_setup_msis(smmu);
>
> /* Request interrupt lines */
> + irq = smmu->gerr_irq;
> + if (irq) {
> + ret = devm_request_irq(smmu->dev, irq, arm_smmu_gerror_handler,
> + 0, "arm-smmu-v3-gerror", smmu);
> + if (ret < 0)
> + dev_warn(smmu->dev, "failed to enable gerror irq\n");
> + } else {
> + dev_warn(smmu->dev,
> + "no gerr irq - errors will not be reported!\n");
> + }
> +
> + /* No EVTQ/PRIQ interrupts in kdump -- queues are disabled */
> + if (is_kdump_kernel())
> + return;
Then this would flow nicer, you just wrap evtq in a FEAT_EVTQ test and don't
have to move things
> +> @@ -4682,19 +4691,30 @@ static int arm_smmu_setup_irqs(struct arm_smmu_device *smmu)
> /*
> * Cavium ThunderX2 implementation doesn't support unique irq
> * lines. Use a single irq line for all the SMMUv3 interrupts.
> + *
> + * In kdump, EVTQ/PRIQ are disabled, so no threaded handling.
> */
Why? I mean I get we might not need a threaded IRQ handler without PRI, but is
there a reason kdump would not want to create one anyhow?
> - if (smmu->features & ARM_SMMU_FEAT_PRI)
> - irqen_flags |= IRQ_CTRL_PRIQ_IRQEN;
> + /* No EVTQ/PRIQ IRQ generation in kdump -- queues are disabled */
> + if (!is_kdump_kernel()) {
> + irqen_flags |= IRQ_CTRL_EVTQ_IRQEN;
> + if (smmu->features & ARM_SMMU_FEAT_PRI)
> + irqen_flags |= IRQ_CTRL_PRIQ_IRQEN;
> + }
And here is also just a simple FEAT_EVTQ?
The overall thing looks broadly right to me
--
Jason