diff options
| author | Joerg Roedel <joerg.roedel@amd.com> | 2009-09-01 12:07:08 +0200 | 
|---|---|---|
| committer | Joerg Roedel <joerg.roedel@amd.com> | 2009-09-03 16:15:44 +0200 | 
| commit | eba6ac60ba66c6bf6858938442204feaa67dea31 (patch) | |
| tree | 625b39539ebdc6222307b174eae9802bb367f163 | |
| parent | aa879fff5d12318259816aa35023e941a1e4d3d9 (diff) | |
x86/amd-iommu: Align locking between attach_device and detach_device
This patch makes the locking behavior between the functions
attach_device and __attach_device consistent with the
locking behavior between detach_device and __detach_device.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 19 | 
1 files changed, 14 insertions, 5 deletions
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 2b1e77c714ff..9aa135d4453f 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c @@ -1077,29 +1077,38 @@ static void __attach_device(struct amd_iommu *iommu,  			    struct protection_domain *domain,  			    u16 devid)  { -	unsigned long flags; -	u64 pte_root = virt_to_phys(domain->pt_root); +	u64 pte_root; -	domain->dev_cnt += 1; +	/* lock domain */ +	spin_lock(&domain->lock); + +	pte_root = virt_to_phys(domain->pt_root);  	pte_root |= (domain->mode & DEV_ENTRY_MODE_MASK)  		    << DEV_ENTRY_MODE_SHIFT;  	pte_root |= IOMMU_PTE_IR | IOMMU_PTE_IW | IOMMU_PTE_P | IOMMU_PTE_TV; -	write_lock_irqsave(&amd_iommu_devtable_lock, flags);  	amd_iommu_dev_table[devid].data[2] = domain->id;  	amd_iommu_dev_table[devid].data[1] = upper_32_bits(pte_root);  	amd_iommu_dev_table[devid].data[0] = lower_32_bits(pte_root);  	amd_iommu_pd_table[devid] = domain; -	write_unlock_irqrestore(&amd_iommu_devtable_lock, flags); + +	domain->dev_cnt += 1; + +	/* ready */ +	spin_unlock(&domain->lock);  }  static void attach_device(struct amd_iommu *iommu,  			  struct protection_domain *domain,  			  u16 devid)  { +	unsigned long flags; + +	write_lock_irqsave(&amd_iommu_devtable_lock, flags);  	__attach_device(iommu, domain, devid); +	write_unlock_irqrestore(&amd_iommu_devtable_lock, flags);  	/*  	 * We might boot into a crash-kernel here. The crashed kernel  | 
