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: 06f4b8d09d
("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>
This commit is contained in:
parent
e65a6897be
commit
6927d35238
|
@ -748,12 +748,16 @@ bad_req:
|
||||||
* If prq is to be handled outside iommu driver via receiver of
|
* If prq is to be handled outside iommu driver via receiver of
|
||||||
* the fault notifiers, we skip the page response here.
|
* the fault notifiers, we skip the page response here.
|
||||||
*/
|
*/
|
||||||
if (!pdev || intel_svm_prq_report(iommu, &pdev->dev, req))
|
if (!pdev)
|
||||||
handle_bad_prq_event(iommu, req, QI_RESP_INVALID);
|
goto bad_req;
|
||||||
|
|
||||||
trace_prq_report(iommu, &pdev->dev, req->qw_0, req->qw_1,
|
if (intel_svm_prq_report(iommu, &pdev->dev, req))
|
||||||
req->priv_data[0], req->priv_data[1],
|
handle_bad_prq_event(iommu, req, QI_RESP_INVALID);
|
||||||
iommu->prq_seq_number++);
|
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:
|
prq_advance:
|
||||||
head = (head + sizeof(*req)) & PRQ_RING_MASK;
|
head = (head + sizeof(*req)) & PRQ_RING_MASK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue