diff options
| author | Joerg Roedel <jroedel@suse.de> | 2014-07-30 16:04:39 +0200 | 
|---|---|---|
| committer | Joerg Roedel <jroedel@suse.de> | 2014-07-30 16:07:50 +0200 | 
| commit | 75058a302bfa80ff59bf5b25ddb987683a4da650 (patch) | |
| tree | 8a60a0e4d6f66077ab653db5e6f9a5ba43d05201 /drivers/iommu/amd_iommu_v2.c | |
| parent | 8301da53fbc1dff07c96f7ebf32bda331e4775e3 (diff) | |
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>
Diffstat (limited to 'drivers/iommu/amd_iommu_v2.c')
| -rw-r--r-- | drivers/iommu/amd_iommu_v2.c | 7 | 
1 files changed, 7 insertions, 0 deletions
| diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c index 524fd67a85b1..2de13be17268 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); | 
