genirq / PM: describe IRQF_COND_SUSPEND
[linux-2.6-microblaze.git] / drivers / iommu / amd_iommu_v2.c
index 90f70d0..6d5a5c4 100644 (file)
@@ -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");