Browse Source

iommu/amd: Fix device_state reference counting

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 <jroedel@suse.de>
Tested-by: Oded Gabbay <oded.gabbay@amd.com>
Joerg Roedel 11 years ago
parent
commit
75058a302b
1 changed files with 7 additions and 0 deletions
  1. 7 0
      drivers/iommu/amd_iommu_v2.c

+ 7 - 0
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);