Commit 6927d3523807 for kernel

commit 6927d352380797ddbee18631491ec428741696e2
Author: Yang Yingliang <yangyingliang@huawei.com>
Date:   Thu Dec 1 12:01:25 2022 +0800

    iommu/vt-d: Fix PCI device refcount leak in prq_event_thread()

    As comment of pci_get_domain_bus_and_slot() says, it returns a pci device
    with refcount increment, when finish using it, the caller must decrease
    the reference count by calling pci_dev_put(). So call pci_dev_put() after
    using the 'pdev' to avoid refcount leak.

    Besides, if the 'pdev' is null or intel_svm_prq_report() returns error,
    there is no need to trace this fault.

    Fixes: 06f4b8d09dba ("iommu/vt-d: Remove unnecessary SVA data accesses in page fault path")
    Suggested-by: Lu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
    Link: https://lore.kernel.org/r/20221119144028.2452731-1-yangyingliang@huawei.com
    Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: Joerg Roedel <jroedel@suse.de>

diff --git a/drivers/iommu/intel/svm.c b/drivers/iommu/intel/svm.c
index fe615c53479c..03b25358946c 100644
--- a/drivers/iommu/intel/svm.c
+++ b/drivers/iommu/intel/svm.c
@@ -748,12 +748,16 @@ static irqreturn_t prq_event_thread(int irq, void *d)
 		 * If prq is to be handled outside iommu driver via receiver of
 		 * the fault notifiers, we skip the page response here.
 		 */
-		if (!pdev || intel_svm_prq_report(iommu, &pdev->dev, req))
-			handle_bad_prq_event(iommu, req, QI_RESP_INVALID);
+		if (!pdev)
+			goto bad_req;

-		trace_prq_report(iommu, &pdev->dev, req->qw_0, req->qw_1,
-				 req->priv_data[0], req->priv_data[1],
-				 iommu->prq_seq_number++);
+		if (intel_svm_prq_report(iommu, &pdev->dev, req))
+			handle_bad_prq_event(iommu, req, QI_RESP_INVALID);
+		else
+			trace_prq_report(iommu, &pdev->dev, req->qw_0, req->qw_1,
+					 req->priv_data[0], req->priv_data[1],
+					 iommu->prq_seq_number++);
+		pci_dev_put(pdev);
 prq_advance:
 		head = (head + sizeof(*req)) & PRQ_RING_MASK;
 	}