diff options
Diffstat (limited to 'drivers/iommu/amd_iommu_v2.c')
| -rw-r--r-- | drivers/iommu/amd_iommu_v2.c | 35 | 
1 files changed, 11 insertions, 24 deletions
diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c index 90f70d0e1141..6d5a5c44453b 100644 --- a/drivers/iommu/amd_iommu_v2.c +++ b/drivers/iommu/amd_iommu_v2.c @@ -1,6 +1,6 @@  /*   * Copyright (C) 2010-2012 Advanced Micro Devices, Inc. - * Author: Joerg Roedel <joerg.roedel@amd.com> + * Author: Joerg Roedel <jroedel@suse.de>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License version 2 as published @@ -31,7 +31,7 @@  #include "amd_iommu_proto.h"  MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Joerg Roedel <joerg.roedel@amd.com>"); +MODULE_AUTHOR("Joerg Roedel <jroedel@suse.de>");  #define MAX_DEVICES		0x10000  #define PRI_QUEUE_SIZE		512 @@ -151,18 +151,6 @@ static void put_device_state(struct device_state *dev_state)  		wake_up(&dev_state->wq);  } -static void put_device_state_wait(struct device_state *dev_state) -{ -	DEFINE_WAIT(wait); - -	prepare_to_wait(&dev_state->wq, &wait, TASK_UNINTERRUPTIBLE); -	if (!atomic_dec_and_test(&dev_state->count)) -		schedule(); -	finish_wait(&dev_state->wq, &wait); - -	free_device_state(dev_state); -} -  /* Must be called under dev_state->lock */  static struct pasid_state **__get_pasid_state_ptr(struct device_state *dev_state,  						  int pasid, bool alloc) @@ -278,14 +266,7 @@ static void put_pasid_state(struct pasid_state *pasid_state)  static void put_pasid_state_wait(struct pasid_state *pasid_state)  { -	DEFINE_WAIT(wait); - -	prepare_to_wait(&pasid_state->wq, &wait, TASK_UNINTERRUPTIBLE); - -	if (!atomic_dec_and_test(&pasid_state->count)) -		schedule(); - -	finish_wait(&pasid_state->wq, &wait); +	wait_event(pasid_state->wq, !atomic_read(&pasid_state->count));  	free_pasid_state(pasid_state);  } @@ -851,7 +832,13 @@ void amd_iommu_free_device(struct pci_dev *pdev)  	/* Get rid of any remaining pasid states */  	free_pasid_states(dev_state); -	put_device_state_wait(dev_state); +	put_device_state(dev_state); +	/* +	 * Wait until the last reference is dropped before freeing +	 * the device state. +	 */ +	wait_event(dev_state->wq, !atomic_read(&dev_state->count)); +	free_device_state(dev_state);  }  EXPORT_SYMBOL(amd_iommu_free_device); @@ -921,7 +908,7 @@ static int __init amd_iommu_v2_init(void)  {  	int ret; -	pr_info("AMD IOMMUv2 driver by Joerg Roedel <joerg.roedel@amd.com>\n"); +	pr_info("AMD IOMMUv2 driver by Joerg Roedel <jroedel@suse.de>\n");  	if (!amd_iommu_v2_supported()) {  		pr_info("AMD IOMMUv2 functionality not available on this system\n");  | 
