| #include "edac_module.h" | 
 |  | 
 | static struct workqueue_struct *wq; | 
 |  | 
 | bool edac_queue_work(struct delayed_work *work, unsigned long delay) | 
 | { | 
 | 	return queue_delayed_work(wq, work, delay); | 
 | } | 
 | EXPORT_SYMBOL_GPL(edac_queue_work); | 
 |  | 
 | bool edac_mod_work(struct delayed_work *work, unsigned long delay) | 
 | { | 
 | 	return mod_delayed_work(wq, work, delay); | 
 | } | 
 | EXPORT_SYMBOL_GPL(edac_mod_work); | 
 |  | 
 | bool edac_stop_work(struct delayed_work *work) | 
 | { | 
 | 	bool ret; | 
 |  | 
 | 	ret = cancel_delayed_work_sync(work); | 
 | 	flush_workqueue(wq); | 
 |  | 
 | 	return ret; | 
 | } | 
 | EXPORT_SYMBOL_GPL(edac_stop_work); | 
 |  | 
 | int edac_workqueue_setup(void) | 
 | { | 
 | 	wq = alloc_ordered_workqueue("edac-poller", WQ_MEM_RECLAIM); | 
 | 	if (!wq) | 
 | 		return -ENODEV; | 
 | 	else | 
 | 		return 0; | 
 | } | 
 |  | 
 | void edac_workqueue_teardown(void) | 
 | { | 
 | 	flush_workqueue(wq); | 
 | 	destroy_workqueue(wq); | 
 | 	wq = NULL; | 
 | } |