PCI: pciehp: Drop slot workqueue
authorLukas Wunner <lukas@wunner.de>
Thu, 19 Jul 2018 22:27:42 +0000 (17:27 -0500)
committerBjorn Helgaas <helgaas@kernel.org>
Mon, 23 Jul 2018 22:04:13 +0000 (17:04 -0500)
Previously the slot workqueue was used to handle events and enable or
disable the slot.  That's no longer the case as those tasks are done
synchronously in the IRQ thread.  The slot workqueue is thus merely used
to handle a button press after the 5 second delay and only one such work
item may be in flight at any given time.  A separate workqueue isn't
necessary for this simple task, so use the system workqueue instead.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/hotplug/pciehp.h
drivers/pci/hotplug/pciehp_core.c
drivers/pci/hotplug/pciehp_ctrl.c
drivers/pci/hotplug/pciehp_hpc.c

index 82ff77cc92f53fc58be1678717213d9a5d59f8e8..0d005c5fabfaad8f6b6b116c08b2122f81d1092c 100644 (file)
@@ -69,7 +69,6 @@ do {                                                                  \
  *     protects scheduling, execution and cancellation of @work
  * @hotplug_lock: serializes calls to pciehp_enable_slot() and
  *     pciehp_disable_slot()
- * @wq: work queue on which @work is scheduled
  */
 struct slot {
        u8 state;
@@ -78,7 +77,6 @@ struct slot {
        struct delayed_work work;
        struct mutex lock;
        struct mutex hotplug_lock;
-       struct workqueue_struct *wq;
 };
 
 /**
index 8a2133856dfd65c258be37e033ddaeb9a64bab50..b360645377c236c3a11308f10de505f630109fc8 100644 (file)
@@ -62,12 +62,6 @@ static int reset_slot(struct hotplug_slot *slot, int probe);
  */
 static void release_slot(struct hotplug_slot *hotplug_slot)
 {
-       struct slot *slot = hotplug_slot->private;
-
-       /* queued work needs hotplug_slot name */
-       cancel_delayed_work(&slot->work);
-       drain_workqueue(slot->wq);
-
        kfree(hotplug_slot->ops);
        kfree(hotplug_slot->info);
        kfree(hotplug_slot);
index 5763e81be2ed02ea3d5544a8c6924d22c2c0ad8e..a4a8a5457aca87e0f15acb004f18f9153c8b24a0 100644 (file)
@@ -165,7 +165,7 @@ void pciehp_handle_button_press(struct slot *p_slot)
                /* blink green LED and turn off amber */
                pciehp_green_led_blink(p_slot);
                pciehp_set_attention_status(p_slot, 0);
-               queue_delayed_work(p_slot->wq, &p_slot->work, 5*HZ);
+               schedule_delayed_work(&p_slot->work, 5 * HZ);
                break;
        case BLINKINGOFF_STATE:
        case BLINKINGON_STATE:
index 31544998e1bdd27435b56eeb81d3d53d55fee590..dcbdee50cd850f1754b7223583ba4d3697f4f5c7 100644 (file)
@@ -767,26 +767,19 @@ static int pcie_init_slot(struct controller *ctrl)
        if (!slot)
                return -ENOMEM;
 
-       slot->wq = alloc_ordered_workqueue("pciehp-%u", 0, PSN(ctrl));
-       if (!slot->wq)
-               goto abort;
-
        slot->ctrl = ctrl;
        mutex_init(&slot->lock);
        mutex_init(&slot->hotplug_lock);
        INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
        ctrl->slot = slot;
        return 0;
-abort:
-       kfree(slot);
-       return -ENOMEM;
 }
 
 static void pcie_cleanup_slot(struct controller *ctrl)
 {
        struct slot *slot = ctrl->slot;
 
-       destroy_workqueue(slot->wq);
+       cancel_delayed_work_sync(&slot->work);
        kfree(slot);
 }