On Wed, Dec 06, 2017 at 09:49:59AM -0700, Jerry Snitselaar wrote: > It is unlikely request_threaded_irq will fail, but if it does for some > reason we should clear iommu->pr_irq in the error path. Also > intel_svm_finish_prq shouldn't try to clean up the page request > interrupt if pr_irq is 0. Without these, if request_threaded_irq were > to fail the following occurs:
Looks good. Reviewed-by: Ashok Raj <ashok....@intel.com> Cheers, Ashok > > Cc: Alex Williamson <alex.william...@redhat.com> > Cc: Joerg Roedel <j...@8bytes.org> > Cc: Ashok Raj <ashok....@intel.com> > Signed-off-by: Jerry Snitselaar <jsnit...@redhat.com> > --- > drivers/iommu/intel-svm.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c > index ed1cf7c5a43b..6643277e321e 100644 > --- a/drivers/iommu/intel-svm.c > +++ b/drivers/iommu/intel-svm.c > @@ -129,6 +129,7 @@ int intel_svm_enable_prq(struct intel_iommu *iommu) > pr_err("IOMMU: %s: Failed to request IRQ for page request > queue\n", > iommu->name); > dmar_free_hwirq(irq); > + iommu->pr_irq = 0; > goto err; > } > dmar_writeq(iommu->reg + DMAR_PQH_REG, 0ULL); > @@ -144,9 +145,11 @@ int intel_svm_finish_prq(struct intel_iommu *iommu) > dmar_writeq(iommu->reg + DMAR_PQT_REG, 0ULL); > dmar_writeq(iommu->reg + DMAR_PQA_REG, 0ULL); > > - free_irq(iommu->pr_irq, iommu); > - dmar_free_hwirq(iommu->pr_irq); > - iommu->pr_irq = 0; > + if (iommu->pr_irq) { > + free_irq(iommu->pr_irq, iommu); > + dmar_free_hwirq(iommu->pr_irq); > + iommu->pr_irq = 0; > + } > > free_pages((unsigned long)iommu->prq, PRQ_ORDER); > iommu->prq = NULL; > -- > 2.14.3 >