diff options
| author | Tejun Heo <tj@kernel.org> | 2010-10-18 02:33:02 -0400 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2010-10-18 02:33:02 -0400 |
| commit | e24dcbef93dbbf529fbedfc6ce8ab22d2cef35f0 (patch) | |
| tree | 6ab3a2004ed8d21a48ce2eeda6c5b733b76599e4 | |
| parent | a827ea307b147aeb050803433b3f6842582c6ced (diff) | |
shpchp: update workqueue usage
* Rename shpchp_wq to shpchp_ordered_wq and add non-ordered shpchp_wq
which is used instead of the system workqueue. This is to remove
the use of flush_scheduled_work() which is deprecated and scheduled
for removal.
* With cmwq in place, there's no point in creating workqueues lazily.
Create both shpchp_wq and shpchp_ordered_wq upfront.
* Include workqueue.h from shpchp.h.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
| -rw-r--r-- | drivers/pci/hotplug/shpchp.h | 2 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp_core.c | 20 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp_ctrl.c | 7 | ||||
| -rw-r--r-- | drivers/pci/hotplug/shpchp_hpc.c | 26 |
4 files changed, 25 insertions, 30 deletions
diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index d2627e1c3ac1..e0c90e643b5f 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
| 36 | #include <linux/sched.h> /* signal_pending(), struct timer_list */ | 36 | #include <linux/sched.h> /* signal_pending(), struct timer_list */ |
| 37 | #include <linux/mutex.h> | 37 | #include <linux/mutex.h> |
| 38 | #include <linux/workqueue.h> | ||
| 38 | 39 | ||
| 39 | #if !defined(MODULE) | 40 | #if !defined(MODULE) |
| 40 | #define MY_NAME "shpchp" | 41 | #define MY_NAME "shpchp" |
| @@ -46,6 +47,7 @@ extern int shpchp_poll_mode; | |||
| 46 | extern int shpchp_poll_time; | 47 | extern int shpchp_poll_time; |
| 47 | extern int shpchp_debug; | 48 | extern int shpchp_debug; |
| 48 | extern struct workqueue_struct *shpchp_wq; | 49 | extern struct workqueue_struct *shpchp_wq; |
| 50 | extern struct workqueue_struct *shpchp_ordered_wq; | ||
| 49 | 51 | ||
| 50 | #define dbg(format, arg...) \ | 52 | #define dbg(format, arg...) \ |
| 51 | do { \ | 53 | do { \ |
diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c index a7bd5048396e..aca972bbfb4c 100644 --- a/drivers/pci/hotplug/shpchp_core.c +++ b/drivers/pci/hotplug/shpchp_core.c | |||
| @@ -33,7 +33,6 @@ | |||
| 33 | #include <linux/types.h> | 33 | #include <linux/types.h> |
| 34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
| 35 | #include <linux/pci.h> | 35 | #include <linux/pci.h> |
| 36 | #include <linux/workqueue.h> | ||
| 37 | #include "shpchp.h" | 36 | #include "shpchp.h" |
| 38 | 37 | ||
| 39 | /* Global variables */ | 38 | /* Global variables */ |
| @@ -41,6 +40,7 @@ int shpchp_debug; | |||
| 41 | int shpchp_poll_mode; | 40 | int shpchp_poll_mode; |
| 42 | int shpchp_poll_time; | 41 | int shpchp_poll_time; |
| 43 | struct workqueue_struct *shpchp_wq; | 42 | struct workqueue_struct *shpchp_wq; |
| 43 | struct workqueue_struct *shpchp_ordered_wq; | ||
| 44 | 44 | ||
| 45 | #define DRIVER_VERSION "0.4" | 45 | #define DRIVER_VERSION "0.4" |
| 46 | #define DRIVER_AUTHOR "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>" | 46 | #define DRIVER_AUTHOR "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>" |
| @@ -174,8 +174,8 @@ void cleanup_slots(struct controller *ctrl) | |||
| 174 | slot = list_entry(tmp, struct slot, slot_list); | 174 | slot = list_entry(tmp, struct slot, slot_list); |
| 175 | list_del(&slot->slot_list); | 175 | list_del(&slot->slot_list); |
| 176 | cancel_delayed_work(&slot->work); | 176 | cancel_delayed_work(&slot->work); |
| 177 | flush_scheduled_work(); | ||
| 178 | flush_workqueue(shpchp_wq); | 177 | flush_workqueue(shpchp_wq); |
| 178 | flush_workqueue(shpchp_ordered_wq); | ||
| 179 | pci_hp_deregister(slot->hotplug_slot); | 179 | pci_hp_deregister(slot->hotplug_slot); |
| 180 | } | 180 | } |
| 181 | } | 181 | } |
| @@ -360,9 +360,23 @@ static int __init shpcd_init(void) | |||
| 360 | { | 360 | { |
| 361 | int retval = 0; | 361 | int retval = 0; |
| 362 | 362 | ||
| 363 | shpchp_wq = alloc_ordered_workqueue("shpchp", 0); | ||
| 364 | if (!shpchp_wq) | ||
| 365 | return -ENOMEM; | ||
| 366 | |||
| 367 | shpchp_ordered_wq = alloc_ordered_workqueue("shpchp_ordered", 0); | ||
| 368 | if (!shpchp_ordered_wq) { | ||
| 369 | destroy_workqueue(shpchp_wq); | ||
| 370 | return -ENOMEM; | ||
| 371 | } | ||
| 372 | |||
| 363 | retval = pci_register_driver(&shpc_driver); | 373 | retval = pci_register_driver(&shpc_driver); |
| 364 | dbg("%s: pci_register_driver = %d\n", __func__, retval); | 374 | dbg("%s: pci_register_driver = %d\n", __func__, retval); |
| 365 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); | 375 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); |
| 376 | if (retval) { | ||
| 377 | destroy_workqueue(shpchp_ordered_wq); | ||
| 378 | destroy_workqueue(shpchp_wq); | ||
| 379 | } | ||
| 366 | return retval; | 380 | return retval; |
| 367 | } | 381 | } |
| 368 | 382 | ||
| @@ -370,6 +384,8 @@ static void __exit shpcd_cleanup(void) | |||
| 370 | { | 384 | { |
| 371 | dbg("unload_shpchpd()\n"); | 385 | dbg("unload_shpchpd()\n"); |
| 372 | pci_unregister_driver(&shpc_driver); | 386 | pci_unregister_driver(&shpc_driver); |
| 387 | destroy_workqueue(shpchp_ordered_wq); | ||
| 388 | destroy_workqueue(shpchp_wq); | ||
| 373 | info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); | 389 | info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); |
| 374 | } | 390 | } |
| 375 | 391 | ||
diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c index 3387fbfb0c54..b00b09bdd38a 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <linux/types.h> | 32 | #include <linux/types.h> |
| 33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
| 34 | #include <linux/pci.h> | 34 | #include <linux/pci.h> |
| 35 | #include <linux/workqueue.h> | ||
| 36 | #include "../pci.h" | 35 | #include "../pci.h" |
| 37 | #include "shpchp.h" | 36 | #include "shpchp.h" |
| 38 | 37 | ||
| @@ -52,7 +51,7 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type) | |||
| 52 | info->p_slot = p_slot; | 51 | info->p_slot = p_slot; |
| 53 | INIT_WORK(&info->work, interrupt_event_handler); | 52 | INIT_WORK(&info->work, interrupt_event_handler); |
| 54 | 53 | ||
| 55 | schedule_work(&info->work); | 54 | queue_work(shpchp_wq, &info->work); |
| 56 | 55 | ||
| 57 | return 0; | 56 | return 0; |
| 58 | } | 57 | } |
| @@ -457,7 +456,7 @@ void shpchp_queue_pushbutton_work(struct work_struct *work) | |||
| 457 | kfree(info); | 456 | kfree(info); |
| 458 | goto out; | 457 | goto out; |
| 459 | } | 458 | } |
| 460 | queue_work(shpchp_wq, &info->work); | 459 | queue_work(shpchp_ordered_wq, &info->work); |
| 461 | out: | 460 | out: |
| 462 | mutex_unlock(&p_slot->lock); | 461 | mutex_unlock(&p_slot->lock); |
| 463 | } | 462 | } |
| @@ -505,7 +504,7 @@ static void handle_button_press_event(struct slot *p_slot) | |||
| 505 | p_slot->hpc_ops->green_led_blink(p_slot); | 504 | p_slot->hpc_ops->green_led_blink(p_slot); |
| 506 | p_slot->hpc_ops->set_attention_status(p_slot, 0); | 505 | p_slot->hpc_ops->set_attention_status(p_slot, 0); |
| 507 | 506 | ||
| 508 | schedule_delayed_work(&p_slot->work, 5*HZ); | 507 | queue_delayed_work(shpchp_wq, &p_slot->work, 5*HZ); |
| 509 | break; | 508 | break; |
| 510 | case BLINKINGOFF_STATE: | 509 | case BLINKINGOFF_STATE: |
| 511 | case BLINKINGON_STATE: | 510 | case BLINKINGON_STATE: |
diff --git a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c index d3985e7deab7..36547f0ce305 100644 --- a/drivers/pci/hotplug/shpchp_hpc.c +++ b/drivers/pci/hotplug/shpchp_hpc.c | |||
| @@ -179,8 +179,6 @@ | |||
| 179 | #define SLOT_EVENT_LATCH 0x2 | 179 | #define SLOT_EVENT_LATCH 0x2 |
| 180 | #define SLOT_SERR_INT_MASK 0x3 | 180 | #define SLOT_SERR_INT_MASK 0x3 |
| 181 | 181 | ||
| 182 | static atomic_t shpchp_num_controllers = ATOMIC_INIT(0); | ||
| 183 | |||
| 184 | static irqreturn_t shpc_isr(int irq, void *dev_id); | 182 | static irqreturn_t shpc_isr(int irq, void *dev_id); |
| 185 | static void start_int_poll_timer(struct controller *ctrl, int sec); | 183 | static void start_int_poll_timer(struct controller *ctrl, int sec); |
| 186 | static int hpc_check_cmd_status(struct controller *ctrl); | 184 | static int hpc_check_cmd_status(struct controller *ctrl); |
| @@ -614,13 +612,6 @@ static void hpc_release_ctlr(struct controller *ctrl) | |||
| 614 | 612 | ||
| 615 | iounmap(ctrl->creg); | 613 | iounmap(ctrl->creg); |
| 616 | release_mem_region(ctrl->mmio_base, ctrl->mmio_size); | 614 | release_mem_region(ctrl->mmio_base, ctrl->mmio_size); |
| 617 | |||
| 618 | /* | ||
| 619 | * If this is the last controller to be released, destroy the | ||
| 620 | * shpchpd work queue | ||
| 621 | */ | ||
| 622 | if (atomic_dec_and_test(&shpchp_num_controllers)) | ||
| 623 | destroy_workqueue(shpchp_wq); | ||
| 624 | } | 615 | } |
| 625 | 616 | ||
| 626 | static int hpc_power_on_slot(struct slot * slot) | 617 | static int hpc_power_on_slot(struct slot * slot) |
| @@ -1077,9 +1068,8 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev) | |||
| 1077 | 1068 | ||
| 1078 | rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED, | 1069 | rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED, |
| 1079 | MY_NAME, (void *)ctrl); | 1070 | MY_NAME, (void *)ctrl); |
| 1080 | ctrl_dbg(ctrl, "request_irq %d for hpc%d (returns %d)\n", | 1071 | ctrl_dbg(ctrl, "request_irq %d (returns %d)\n", |
| 1081 | ctrl->pci_dev->irq, | 1072 | ctrl->pci_dev->irq, rc); |
| 1082 | atomic_read(&shpchp_num_controllers), rc); | ||
| 1083 | if (rc) { | 1073 | if (rc) { |
| 1084 | ctrl_err(ctrl, "Can't get irq %d for the hotplug " | 1074 | ctrl_err(ctrl, "Can't get irq %d for the hotplug " |
| 1085 | "controller\n", ctrl->pci_dev->irq); | 1075 | "controller\n", ctrl->pci_dev->irq); |
| @@ -1092,18 +1082,6 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev) | |||
| 1092 | shpc_get_cur_bus_speed(ctrl); | 1082 | shpc_get_cur_bus_speed(ctrl); |
| 1093 | 1083 | ||
| 1094 | /* | 1084 | /* |
| 1095 | * If this is the first controller to be initialized, | ||
| 1096 | * initialize the shpchpd work queue | ||
| 1097 | */ | ||
| 1098 | if (atomic_add_return(1, &shpchp_num_controllers) == 1) { | ||
| 1099 | shpchp_wq = create_singlethread_workqueue("shpchpd"); | ||
| 1100 | if (!shpchp_wq) { | ||
| 1101 | rc = -ENOMEM; | ||
| 1102 | goto abort_iounmap; | ||
| 1103 | } | ||
| 1104 | } | ||
| 1105 | |||
| 1106 | /* | ||
| 1107 | * Unmask all event interrupts of all slots | 1085 | * Unmask all event interrupts of all slots |
| 1108 | */ | 1086 | */ |
| 1109 | for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) { | 1087 | for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) { |
