Commit 9d7d6e36 authored by Colin Cross's avatar Colin Cross Committed by Tony Lindgren

ARM: OMAP: counter: add locking to read_persistent_clock

read_persistent_clock uses a global variable, use a spinlock to
ensure non-atomic updates to the variable don't overlap and cause
time to move backwards.
Signed-off-by: default avatarColin Cross <ccross@android.com>
Signed-off-by: default avatarR Sricharan <r.sricharan@ti.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 5e090ed7
...@@ -52,22 +52,29 @@ static u32 notrace omap_32k_read_sched_clock(void) ...@@ -52,22 +52,29 @@ static u32 notrace omap_32k_read_sched_clock(void)
* nsecs and adds to a monotonically increasing timespec. * nsecs and adds to a monotonically increasing timespec.
*/ */
static struct timespec persistent_ts; static struct timespec persistent_ts;
static cycles_t cycles, last_cycles; static cycles_t cycles;
static unsigned int persistent_mult, persistent_shift; static unsigned int persistent_mult, persistent_shift;
static DEFINE_SPINLOCK(read_persistent_clock_lock);
static void omap_read_persistent_clock(struct timespec *ts) static void omap_read_persistent_clock(struct timespec *ts)
{ {
unsigned long long nsecs; unsigned long long nsecs;
cycles_t delta; cycles_t last_cycles;
struct timespec *tsp = &persistent_ts; unsigned long flags;
spin_lock_irqsave(&read_persistent_clock_lock, flags);
last_cycles = cycles; last_cycles = cycles;
cycles = sync32k_cnt_reg ? __raw_readl(sync32k_cnt_reg) : 0; cycles = sync32k_cnt_reg ? __raw_readl(sync32k_cnt_reg) : 0;
delta = cycles - last_cycles;
nsecs = clocksource_cyc2ns(delta, persistent_mult, persistent_shift); nsecs = clocksource_cyc2ns(cycles - last_cycles,
persistent_mult, persistent_shift);
timespec_add_ns(&persistent_ts, nsecs);
*ts = persistent_ts;
timespec_add_ns(tsp, nsecs); spin_unlock_irqrestore(&read_persistent_clock_lock, flags);
*ts = *tsp;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment