OSDN Git Service

ARM: tegra: cpuidle: Make abort_flag atomic
authorDmitry Osipenko <digetx@gmail.com>
Mon, 24 Feb 2020 22:40:50 +0000 (01:40 +0300)
committerThierry Reding <treding@nvidia.com>
Fri, 13 Mar 2020 10:23:09 +0000 (11:23 +0100)
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>
arch/arm/mach-tegra/cpuidle-tegra20.c

index d6b9b4c..97cae47 100644 (file)
@@ -32,7 +32,7 @@
 #include "sleep.h"
 
 #ifdef CONFIG_PM_SLEEP
-static bool abort_flag;
+static atomic_t abort_flag;
 static atomic_t abort_barrier;
 static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
                                    struct cpuidle_driver *drv,
@@ -171,13 +171,14 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
        bool entered_lp2 = false;
 
        if (tegra_pending_sgi())
-               WRITE_ONCE(abort_flag, true);
+               atomic_set(&abort_flag, 1);
 
        cpuidle_coupled_parallel_barrier(dev, &abort_barrier);
 
-       if (abort_flag) {
+       if (atomic_read(&abort_flag)) {
                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;
        }