#include #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Michal Schmidt"); static void wq_func(struct work_struct *w); static DECLARE_DELAYED_WORK(wq_work, wq_func); static struct workqueue_struct *wq; static DECLARE_WAIT_QUEUE_HEAD(ctl_wq); static void wq_func(struct work_struct *w) { /* * So that this work is most likely cwq->current_work * when destroy_workqueue comes... */ ssleep(1); queue_delayed_work(wq, &wq_work, HZ/100); } static int wqtest_start(void) { wq = create_workqueue("wqtest"); if (!wq) return -1; queue_delayed_work(wq, &wq_work, HZ/100); return 0; } static void wqtest_stop(void) { printk(KERN_CRIT "wqtest: cancelling the work\n"); cancel_rearming_delayed_work(&wq_work); printk(KERN_CRIT "wqtest: destroying the wq\n"); destroy_workqueue(wq); printk(KERN_CRIT "wqtest: done\n"); } module_init(wqtest_start); module_exit(wqtest_stop);