ARM: tegra: cpuidle: Make abort_flag atomic

Replace memory accessors with atomic API just to make code consistent
with the abort_barrier. The new variant may be even more correct now
since atomic_read() will prevent compiler from generating wrong things
like carrying abort_flag value in a register instead of re-fetching it
from memory.

Acked-by: Peter De Schrijver <pdeschrijver@nvidia.com>
Tested-by: Peter Geis <pgwipeout@gmail.com>
Tested-by: Jasper Korten <jja2000@gmail.com>
Tested-by: David Heidelberg <david@ixit.cz>
Tested-by: Nicolas Chauvet <kwizart@gmail.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
Dmitry Osipenko 2020-02-25 01:40:50 +03:00 committed by Thierry Reding
parent 51da5f1cd8
commit f0c69bdfb0
1 changed files with 5 additions and 4 deletions

View File

@ -32,7 +32,7 @@
#include "sleep.h" #include "sleep.h"
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static bool abort_flag; static atomic_t abort_flag;
static atomic_t abort_barrier; static atomic_t abort_barrier;
static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev, static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
struct cpuidle_driver *drv, struct cpuidle_driver *drv,
@ -171,13 +171,14 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
bool entered_lp2 = false; bool entered_lp2 = false;
if (tegra_pending_sgi()) if (tegra_pending_sgi())
WRITE_ONCE(abort_flag, true); atomic_set(&abort_flag, 1);
cpuidle_coupled_parallel_barrier(dev, &abort_barrier); cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
if (abort_flag) { if (atomic_read(&abort_flag)) {
cpuidle_coupled_parallel_barrier(dev, &abort_barrier); cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
abort_flag = false; /* clean flag for next coming */ /* clean flag for next coming */
atomic_set(&abort_flag, 0);
return -EINTR; return -EINTR;
} }