From 16d6aa6ee544fcff71abd3c18a935d2d4193d2ed Mon Sep 17 00:00:00 2001 From: Junjie Wu Date: Tue, 3 Feb 2015 14:31:09 -0800 Subject: [PATCH] qcom-cpufreq: Remove save/restore of scheduling policy Different structures might need to be saved and restored based on different scheduling policies of current thread. Saving and restoring priority using scheduler APIs is very fragile due to potential changes in scheduler code. In addition, the priority change doesn't provide any starvation guarantee because threads can be preempted before the priority change. Therefore remove save and restore of priority to avoid potential bugs when scheduler API changes. Caller will now be responsible for setting the right priority for their CPU frequency scaling workqueue/thread. Change-Id: I2a5d8599e75c0c4aa902df3214c17ab2b13dc9a9 Signed-off-by: Junjie Wu --- drivers/cpufreq/qcom-cpufreq.c | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/drivers/cpufreq/qcom-cpufreq.c b/drivers/cpufreq/qcom-cpufreq.c index 25d6a962ca48..6f12bd3e1d2b 100644 --- a/drivers/cpufreq/qcom-cpufreq.c +++ b/drivers/cpufreq/qcom-cpufreq.c @@ -1,9 +1,9 @@ -/* arch/arm/mach-msm/cpufreq.c +/* drivers/cpufreq/qcom-cpufreq.c * * MSM architecture cpufreq driver * * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2007-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2007-2015, The Linux Foundation. All rights reserved. * Author: Mike A. Chan * * This software is licensed under the terms of the GNU General Public @@ -22,8 +22,6 @@ #include #include #include -#include -#include #include #include #include @@ -49,27 +47,13 @@ static int set_cpu_freq(struct cpufreq_policy *policy, unsigned int new_freq, unsigned int index) { int ret = 0; - int saved_sched_policy = -EINVAL; - int saved_sched_rt_prio = -EINVAL; struct cpufreq_freqs freqs; - struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; unsigned long rate; freqs.old = policy->cur; freqs.new = new_freq; freqs.cpu = policy->cpu; - /* - * Put the caller into SCHED_FIFO priority to avoid cpu starvation - * while increasing frequencies - */ - - if (freqs.new > freqs.old && current->policy != SCHED_FIFO) { - saved_sched_policy = current->policy; - saved_sched_rt_prio = current->rt_priority; - sched_setscheduler_nocheck(current, SCHED_FIFO, ¶m); - } - cpufreq_notify_transition(policy, &freqs, CPUFREQ_PRECHANGE); trace_cpu_frequency_switch_start(freqs.old, freqs.new, policy->cpu); @@ -82,11 +66,6 @@ static int set_cpu_freq(struct cpufreq_policy *policy, unsigned int new_freq, trace_cpu_frequency_switch_end(policy->cpu); } - /* Restore priority after clock ramp-up */ - if (freqs.new > freqs.old && saved_sched_policy >= 0) { - param.sched_priority = saved_sched_rt_prio; - sched_setscheduler_nocheck(current, saved_sched_policy, ¶m); - } return ret; }