Merge "workqueue: fix possible livelock with concurrent mod_delayed_work()"

This commit is contained in:
qctecmdr 2019-07-30 07:29:44 -07:00 • committed by Gerrit - the friendly Code Review server
commit d142f00cbe

View file

@ -50,6 +50,8 @@
#include <linux/uaccess.h>
#include <linux/sched/isolation.h>
#include <linux/nmi.h>
#include <linux/bug.h>
#include <linux/delay.h>
#include "workqueue_internal.h"
@ -1305,6 +1307,12 @@ fail:
if (work_is_canceling(work))
return -ENOENT;
cpu_relax();
/*
* The queueing is in progress in another context. If we keep
* taking the pool->lock in a busy loop, the other context may
* never get the lock. Give 1 usec delay to avoid this contention.
*/
udelay(1);
return -EAGAIN;
}