In the zero delay case in queue_delayed_work() use the return value
from taskqueue_enqueue() instead of reading "ta_pending" unlocked and also ensure the callout is stopped before proceeding. MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
55d445d317
commit
9782763db2
@ -105,13 +105,15 @@ queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work,
|
||||
{
|
||||
int pending;
|
||||
|
||||
pending = work->work.work_task.ta_pending;
|
||||
work->work.taskqueue = wq->taskqueue;
|
||||
if (delay != 0)
|
||||
if (delay != 0) {
|
||||
pending = work->work.work_task.ta_pending;
|
||||
callout_reset(&work->timer, delay, linux_delayed_work_fn, work);
|
||||
else
|
||||
linux_delayed_work_fn((void *)work);
|
||||
|
||||
} else {
|
||||
callout_stop(&work->timer);
|
||||
pending = taskqueue_enqueue(work->work.taskqueue,
|
||||
&work->work.work_task);
|
||||
}
|
||||
return (!pending);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user