From: Joerg Roedel <jroe...@suse.de>

The references to the device state are not dropped
everywhere. This might cause a dead-lock in
amd_iommu_free_device(). Fix it.

Signed-off-by: Joerg Roedel <jroe...@suse.de>
Tested-by: Oded Gabbay <oded.gab...@amd.com>
---
 drivers/iommu/amd_iommu_v2.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c
index 524fd67..2de13be 100644
--- a/drivers/iommu/amd_iommu_v2.c
+++ b/drivers/iommu/amd_iommu_v2.c
@@ -368,6 +368,9 @@ static void free_pasid_states(struct device_state 
*dev_state)
 
                put_pasid_state_wait(pasid_state); /* Reference taken in
                                                      amd_iommu_pasid_bind */
+
+               /* Drop reference taken in amd_iommu_bind_pasid */
+               put_device_state(dev_state);
        }
 
        if (dev_state->pasid_levels == 2)
@@ -748,6 +751,10 @@ void amd_iommu_unbind_pasid(struct pci_dev *pdev, int 
pasid)
        put_pasid_state_wait(pasid_state); /* Reference taken in
                                              amd_iommu_pasid_bind */
 out:
+       /* Drop reference taken in this function */
+       put_device_state(dev_state);
+
+       /* Drop reference taken in amd_iommu_bind_pasid */
        put_device_state(dev_state);
 }
 EXPORT_SYMBOL(amd_iommu_unbind_pasid);
-- 
1.9.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to