From: Peter Boonstoppel Date: Thu, 24 Jan 2013 19:04:02 +0000 (-0800) Subject: cpuquiet: Remove synchronization from runnables_work_func() X-Git-Tag: firefly_0821_release~4158^2~29 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a0529ec18b5c492bb55707061873d4db078b0445;p=firefly-linux-kernel-4.4.55.git cpuquiet: Remove synchronization from runnables_work_func() 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 Reviewed-on: http://git-master/r/193881 Reviewed-by: Mandar Padmawar Tested-by: Mandar Padmawar --- diff --git a/drivers/cpuquiet/governors/runnable_threads.c b/drivers/cpuquiet/governors/runnable_threads.c index 22cab876d508..c91d4566a47d 100644 --- a/drivers/cpuquiet/governors/runnable_threads.c +++ b/drivers/cpuquiet/governors/runnable_threads.c @@ -183,11 +183,8 @@ static void runnables_work_func(struct work_struct *work) 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) { @@ -199,7 +196,6 @@ static void runnables_work_func(struct work_struct *work) if (cpu < nr_cpu_ids) cpuquiet_quiesence_cpu(cpu); } - mutex_unlock(&runnables_lock); } CPQ_BASIC_ATTRIBUTE(sample_rate, 0644, uint);