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>
This commit is contained in:
		
							parent
							
								
									a827ea307b
								
							
						
					
					
						commit
						e24dcbef93
					
				| @ -35,6 +35,7 @@ | ||||
| #include <linux/delay.h> | ||||
| #include <linux/sched.h>	/* signal_pending(), struct timer_list */ | ||||
| #include <linux/mutex.h> | ||||
| #include <linux/workqueue.h> | ||||
| 
 | ||||
| #if !defined(MODULE) | ||||
| 	#define MY_NAME	"shpchp" | ||||
| @ -46,6 +47,7 @@ extern int shpchp_poll_mode; | ||||
| extern int shpchp_poll_time; | ||||
| extern int shpchp_debug; | ||||
| extern struct workqueue_struct *shpchp_wq; | ||||
| extern struct workqueue_struct *shpchp_ordered_wq; | ||||
| 
 | ||||
| #define dbg(format, arg...)						\ | ||||
| do {									\ | ||||
|  | ||||
| @ -33,7 +33,6 @@ | ||||
| #include <linux/types.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/pci.h> | ||||
| #include <linux/workqueue.h> | ||||
| #include "shpchp.h" | ||||
| 
 | ||||
| /* Global variables */ | ||||
| @ -41,6 +40,7 @@ int shpchp_debug; | ||||
| int shpchp_poll_mode; | ||||
| int shpchp_poll_time; | ||||
| struct workqueue_struct *shpchp_wq; | ||||
| struct workqueue_struct *shpchp_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>" | ||||
| @ -174,8 +174,8 @@ void cleanup_slots(struct controller *ctrl) | ||||
| 		slot = list_entry(tmp, struct slot, slot_list); | ||||
| 		list_del(&slot->slot_list); | ||||
| 		cancel_delayed_work(&slot->work); | ||||
| 		flush_scheduled_work(); | ||||
| 		flush_workqueue(shpchp_wq); | ||||
| 		flush_workqueue(shpchp_ordered_wq); | ||||
| 		pci_hp_deregister(slot->hotplug_slot); | ||||
| 	} | ||||
| } | ||||
| @ -360,9 +360,23 @@ static int __init shpcd_init(void) | ||||
| { | ||||
| 	int retval = 0; | ||||
| 
 | ||||
| 	shpchp_wq = alloc_ordered_workqueue("shpchp", 0); | ||||
| 	if (!shpchp_wq) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	shpchp_ordered_wq = alloc_ordered_workqueue("shpchp_ordered", 0); | ||||
| 	if (!shpchp_ordered_wq) { | ||||
| 		destroy_workqueue(shpchp_wq); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	retval = pci_register_driver(&shpc_driver); | ||||
| 	dbg("%s: pci_register_driver = %d\n", __func__, retval); | ||||
| 	info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); | ||||
| 	if (retval) { | ||||
| 		destroy_workqueue(shpchp_ordered_wq); | ||||
| 		destroy_workqueue(shpchp_wq); | ||||
| 	} | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| @ -370,6 +384,8 @@ static void __exit shpcd_cleanup(void) | ||||
| { | ||||
| 	dbg("unload_shpchpd()\n"); | ||||
| 	pci_unregister_driver(&shpc_driver); | ||||
| 	destroy_workqueue(shpchp_ordered_wq); | ||||
| 	destroy_workqueue(shpchp_wq); | ||||
| 	info(DRIVER_DESC " version: " DRIVER_VERSION " unloaded\n"); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -32,7 +32,6 @@ | ||||
| #include <linux/types.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/pci.h> | ||||
| #include <linux/workqueue.h> | ||||
| #include "../pci.h" | ||||
| #include "shpchp.h" | ||||
| 
 | ||||
| @ -52,7 +51,7 @@ static int queue_interrupt_event(struct slot *p_slot, u32 event_type) | ||||
| 	info->p_slot = p_slot; | ||||
| 	INIT_WORK(&info->work, interrupt_event_handler); | ||||
| 
 | ||||
| 	schedule_work(&info->work); | ||||
| 	queue_work(shpchp_wq, &info->work); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| @ -457,7 +456,7 @@ void shpchp_queue_pushbutton_work(struct work_struct *work) | ||||
| 		kfree(info); | ||||
| 		goto out; | ||||
| 	} | ||||
| 	queue_work(shpchp_wq, &info->work); | ||||
| 	queue_work(shpchp_ordered_wq, &info->work); | ||||
|  out: | ||||
| 	mutex_unlock(&p_slot->lock); | ||||
| } | ||||
| @ -505,7 +504,7 @@ static void handle_button_press_event(struct slot *p_slot) | ||||
| 		p_slot->hpc_ops->green_led_blink(p_slot); | ||||
| 		p_slot->hpc_ops->set_attention_status(p_slot, 0); | ||||
| 
 | ||||
| 		schedule_delayed_work(&p_slot->work, 5*HZ); | ||||
| 		queue_delayed_work(shpchp_wq, &p_slot->work, 5*HZ); | ||||
| 		break; | ||||
| 	case BLINKINGOFF_STATE: | ||||
| 	case BLINKINGON_STATE: | ||||
|  | ||||
| @ -179,8 +179,6 @@ | ||||
| #define SLOT_EVENT_LATCH	0x2 | ||||
| #define SLOT_SERR_INT_MASK	0x3 | ||||
| 
 | ||||
| static atomic_t shpchp_num_controllers = ATOMIC_INIT(0); | ||||
| 
 | ||||
| static irqreturn_t shpc_isr(int irq, void *dev_id); | ||||
| static void start_int_poll_timer(struct controller *ctrl, int sec); | ||||
| static int hpc_check_cmd_status(struct controller *ctrl); | ||||
| @ -614,13 +612,6 @@ static void hpc_release_ctlr(struct controller *ctrl) | ||||
| 
 | ||||
| 	iounmap(ctrl->creg); | ||||
| 	release_mem_region(ctrl->mmio_base, ctrl->mmio_size); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If this is the last controller to be released, destroy the | ||||
| 	 * shpchpd work queue | ||||
| 	 */ | ||||
| 	if (atomic_dec_and_test(&shpchp_num_controllers)) | ||||
| 		destroy_workqueue(shpchp_wq); | ||||
| } | ||||
| 
 | ||||
| static int hpc_power_on_slot(struct slot * slot) | ||||
| @ -1077,9 +1068,8 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev) | ||||
| 
 | ||||
| 		rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED, | ||||
| 				 MY_NAME, (void *)ctrl); | ||||
| 		ctrl_dbg(ctrl, "request_irq %d for hpc%d (returns %d)\n", | ||||
| 			 ctrl->pci_dev->irq, | ||||
| 		    atomic_read(&shpchp_num_controllers), rc); | ||||
| 		ctrl_dbg(ctrl, "request_irq %d (returns %d)\n", | ||||
| 			 ctrl->pci_dev->irq, rc); | ||||
| 		if (rc) { | ||||
| 			ctrl_err(ctrl, "Can't get irq %d for the hotplug " | ||||
| 				 "controller\n", ctrl->pci_dev->irq); | ||||
| @ -1091,18 +1081,6 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev) | ||||
| 	shpc_get_max_bus_speed(ctrl); | ||||
| 	shpc_get_cur_bus_speed(ctrl); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If this is the first controller to be initialized, | ||||
| 	 * initialize the shpchpd work queue | ||||
| 	 */ | ||||
| 	if (atomic_add_return(1, &shpchp_num_controllers) == 1) { | ||||
| 		shpchp_wq = create_singlethread_workqueue("shpchpd"); | ||||
| 		if (!shpchp_wq) { | ||||
| 			rc = -ENOMEM; | ||||
| 			goto abort_iounmap; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Unmask all event interrupts of all slots | ||||
| 	 */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user