runnables_stop() can deadlock when cancel_work_sync() waits for the
work function to end and the work function blocks on the same lock
held by runnables_stop().
Removing the locks from runnables_work_func() fixes this. This should
be safe because runnables_lock protects runnables_state and
runnables_work_func() only reads runnables_state. Also, the functions
that change state to DISABLED do a cancel_work_sync() to guarantee the
work function stopped running.
Bug
1215668
Change-Id: I70617b3b0fc81db8555869e67e3b11652af8d94c
Signed-off-by: Peter Boonstoppel <pboonstoppel@nvidia.com>
Reviewed-on: http://git-master/r/193881
Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com>
Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
unsigned int cpu = nr_cpu_ids;
int action;
- mutex_lock(&runnables_lock);
- if (runnables_state != RUNNING) {
- mutex_unlock(&runnables_lock);
+ if (runnables_state != RUNNING)
return;
- }
action = get_action(nr_run_last);
if (action > 0) {
if (cpu < nr_cpu_ids)
cpuquiet_quiesence_cpu(cpu);
}
- mutex_unlock(&runnables_lock);
}
CPQ_BASIC_ATTRIBUTE(sample_rate, 0644, uint);