Messages in this thread Patch in this message | | | Date | Fri, 13 Apr 2012 17:35:25 +0300 | From | Dan Carpenter <> | Subject | [RFC] workqueue: do a sanity check on new work |
| |
There may be a better way to do this. If someone tries to call shedule_work() on a work_struck before doing an INIT_WORK() then we hit the BUG_ON(!list_empty(&work->entry)) in __queue_work() and hang. Instead of that, we could just print a stack dump and return.
It only works if the work->func is NULL at the start but a lot of these things get initialized with kzalloc() so it probably catches most of them.
Reported-by: Matt Renzelmann <mjr@cs.wisc.edu> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 5abf42f..45be34f 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1088,6 +1088,11 @@ queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work) { int ret = 0; + if (!work->func) { + WARN_ON(1); + return 1; + } + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) { __queue_work(cpu, wq, work); ret = 1;
| |