diff options
author | Peter Boonstoppel <pboonstoppel@nvidia.com> | 2013-01-24 11:04:02 -0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 12:57:28 -0700 |
commit | 0aed9f3787b98d17ef120625f718ce64df73a177 (patch) | |
tree | 11914b52a3a0a25ba0c85216adc8246b5e2abd44 /drivers/cpuquiet | |
parent | 2ddf04d025328c5e95e121478793a2c5ed838520 (diff) |
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 <pboonstoppel@nvidia.com>
Reviewed-on: http://git-master/r/193881
Reviewed-by: Mandar Padmawar <mpadmawar@nvidia.com>
Tested-by: Mandar Padmawar <mpadmawar@nvidia.com>
Diffstat (limited to 'drivers/cpuquiet')
-rw-r--r-- | drivers/cpuquiet/governors/runnable_threads.c | 6 |
1 files changed, 1 insertions, 5 deletions
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); |