PCI: pciehp: Handle push button event asynchronously
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Mon, 7 Nov 2011 11:56:50 +0000 (20:56 +0900)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 6 Feb 2013 04:33:32 +0000 (04:33 +0000)
commit 486b10b9f43500741cd63a878d0ef23cd87fc66d upstream.

Use non-ordered workqueue for attention button events.

Attention button events on each slot can be handled asynchronously. So
we should use non-ordered workqueue. This patch also removes ordered
workqueue in pciehp as a result.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/pci/hotplug/pciehp.h
drivers/pci/hotplug/pciehp_core.c
drivers/pci/hotplug/pciehp_ctrl.c
drivers/pci/hotplug/pciehp_hpc.c

index 838f571..9a33fdd 100644 (file)
@@ -45,7 +45,6 @@ extern int pciehp_poll_time;
 extern int pciehp_debug;
 extern int pciehp_force;
 extern struct workqueue_struct *pciehp_wq;
-extern struct workqueue_struct *pciehp_ordered_wq;
 
 #define dbg(format, arg...)                                            \
 do {                                                                   \
index a13ad13..b8c99d3 100644 (file)
@@ -43,7 +43,6 @@ int pciehp_poll_mode;
 int pciehp_poll_time;
 int pciehp_force;
 struct workqueue_struct *pciehp_wq;
-struct workqueue_struct *pciehp_ordered_wq;
 
 #define DRIVER_VERSION "0.4"
 #define DRIVER_AUTHOR  "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>"
@@ -345,18 +344,11 @@ static int __init pcied_init(void)
        if (!pciehp_wq)
                return -ENOMEM;
 
-       pciehp_ordered_wq = alloc_ordered_workqueue("pciehp_ordered", 0);
-       if (!pciehp_ordered_wq) {
-               destroy_workqueue(pciehp_wq);
-               return -ENOMEM;
-       }
-
        pciehp_firmware_init();
        retval = pcie_port_service_register(&hpdriver_portdrv);
        dbg("pcie_port_service_register = %d\n", retval);
        info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
        if (retval) {
-               destroy_workqueue(pciehp_ordered_wq);
                destroy_workqueue(pciehp_wq);
                dbg("Failure to register service\n");
        }
@@ -367,7 +359,6 @@ static void __exit pcied_cleanup(void)
 {
        dbg("unload_pciehpd()\n");
        pcie_port_service_unregister(&hpdriver_portdrv);
-       destroy_workqueue(pciehp_ordered_wq);
        destroy_workqueue(pciehp_wq);
        info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n");
 }
index 085dbb5..27f4429 100644 (file)
@@ -344,7 +344,7 @@ void pciehp_queue_pushbutton_work(struct work_struct *work)
                kfree(info);
                goto out;
        }
-       queue_work(pciehp_ordered_wq, &info->work);
+       queue_work(pciehp_wq, &info->work);
  out:
        mutex_unlock(&p_slot->lock);
 }
@@ -439,7 +439,7 @@ static void handle_surprise_event(struct slot *p_slot)
        else
                p_slot->state = POWERON_STATE;
 
-       queue_work(pciehp_ordered_wq, &info->work);
+       queue_work(pciehp_wq, &info->work);
 }
 
 static void interrupt_event_handler(struct work_struct *work)
index 7b14148..bcdbb16 100644 (file)
@@ -806,7 +806,6 @@ static void pcie_cleanup_slot(struct controller *ctrl)
        struct slot *slot = ctrl->slot;
        cancel_delayed_work(&slot->work);
        flush_workqueue(pciehp_wq);
-       flush_workqueue(pciehp_ordered_wq);
        kfree(slot);
 }