diff options
author | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-03 19:04:51 +0300 |
---|---|---|
committer | Leonard Crestez <leonard.crestez@nxp.com> | 2018-08-24 12:41:33 +0300 |
commit | e3f0526371189f916d0c238b51ec1fc83f1a34f7 (patch) | |
tree | d88ec7c6de79d9db3430683a1ef308a7f3ed1083 /arch/arm/mach-imx | |
parent | e9231deefa5a65e9525c55b903124f6018066245 (diff) |
MLK-19047-2 ARM: imx: busfreq: Prevent double reduce_bus_freq
The low_bus_freq_handler can be scheduled again between when it starts
executing and when it takes the bus_freq_mutex. This can result in
calling reduce_bus_freq twice as shown in the following trace:
[ 762.101949] set_low_bus_freq(743): begin
[ 762.101971] set_low_bus_freq(768): schedule low_bus_freq
[ 762.114111] set_low_bus_freq(771): scheduled low_bus_freq
[ 765.125161] reduce_bus_freq_handler(722): lock...
[ 765.125174] bus_freq_daemon_handler(1043): lock...
[ 765.125191] bus_freq_daemon_handler(1048): call set_low_bus_freq
[ 765.125200] set_low_bus_freq(743): begin
[ 765.125210] set_low_bus_freq(768): schedule low_bus_freq
[ 765.125228] set_low_bus_freq(771): scheduled low_bus_freq
[ 765.125239] bus_freq_daemon_handler(1052): unlock...
[ 765.160624] reduce_bus_freq_handler(726): call reduce
[ 765.166952] reduce_bus_freq(685): begin
[ 765.170865] busfreq_notify(159): notify low enter
[ 765.176095] Bus freq set to 24000000 start...
[ 765.182731] Bus freq set to 24000000 done! cpu=0
[ 765.192646] imx_busfreq soc:busfreq: Bus freq set to low mode. Count: high 0, med 0, audio 0
[ 765.203912] reduce_bus_freq(717): end
[ 765.208903] reduce_bus_freq_handler(733): unlock...
[ 768.166631] reduce_bus_freq_handler(722): lock...
[ 768.172386] reduce_bus_freq_handler(726): call reduce
[ 768.186330] reduce_bus_freq(685): begin
[ 768.191310] busfreq_notify(159): notify low enter
Prevent this scenario by explicitly calling cancel_low_bus_freq_handler
from inside reduce_bus_freq_handler.
Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
Acked-by: Anson Huang <Anson.Huang@nxp.com>
Diffstat (limited to 'arch/arm/mach-imx')
-rw-r--r-- | arch/arm/mach-imx/busfreq-imx.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/arch/arm/mach-imx/busfreq-imx.c b/arch/arm/mach-imx/busfreq-imx.c index 3e68df65f068..b1a51a1c985e 100644 --- a/arch/arm/mach-imx/busfreq-imx.c +++ b/arch/arm/mach-imx/busfreq-imx.c @@ -695,12 +695,20 @@ static void reduce_bus_freq(void) high_bus_count, med_bus_count, audio_bus_count); } +static inline void cancel_low_bus_freq_handler(void) +{ + cancel_delayed_work(&low_bus_freq_handler); + cancel_reduce_bus_freq = true; +} + static void reduce_bus_freq_handler(struct work_struct *work) { mutex_lock(&bus_freq_mutex); - if (!cancel_reduce_bus_freq) + if (!cancel_reduce_bus_freq) { reduce_bus_freq(); + cancel_low_bus_freq_handler(); + } mutex_unlock(&bus_freq_mutex); } @@ -738,12 +746,6 @@ static int set_low_bus_freq(void) return 0; } -static inline void cancel_low_bus_freq_handler(void) -{ - cancel_delayed_work(&low_bus_freq_handler); - cancel_reduce_bus_freq = true; -} - /* * Set the DDR to either 528MHz or 400MHz for iMX6qd * or 400MHz for iMX6dl. |