Skip to content

Commit 9861f7f

Browse files
committed
locking/csd-lock: Switch from sched_clock() to ktime_get_mono_fast_ns()
Currently, the CONFIG_CSD_LOCK_WAIT_DEBUG code uses sched_clock() to check for excessive CSD-lock wait times. This works, but does not guarantee monotonic timestamps on x86 due to the sched_clock() function's use of the rdtsc instruction, which does not guarantee ordering. This means that, given successive calls to sched_clock(), the second might return an earlier time than the second, that is, time might seem to go backwards. This can (and does!) result in false-positive CSD-lock wait complaints claiming almost 2^64 nanoseconds of delay. Therefore, switch from sched_clock() to ktime_get_mono_fast_ns(), which does guarantee monotonic timestamps via the rdtsc_ordered() function, which as the name implies, does guarantee ordered timestamps, at least in the absence of calls from NMI handlers, which are not involved in this code path. Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Reviewed-by: Rik van Riel <riel@surriel.com> Cc: Neeraj Upadhyay <neeraj.upadhyay@kernel.org> Cc: Leonardo Bras <leobras@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
1 parent 9852d85 commit 9861f7f

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

kernel/smp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ static bool csd_lock_wait_toolong(call_single_data_t *csd, u64 ts0, u64 *ts1, in
246246
return true;
247247
}
248248

249-
ts2 = sched_clock();
249+
ts2 = ktime_get_mono_fast_ns();
250250
/* How long since we last checked for a stuck CSD lock.*/
251251
ts_delta = ts2 - *ts1;
252252
if (likely(ts_delta <= csd_lock_timeout_ns * (*nmessages + 1) *
@@ -321,7 +321,7 @@ static void __csd_lock_wait(call_single_data_t *csd)
321321
int bug_id = 0;
322322
u64 ts0, ts1;
323323

324-
ts1 = ts0 = sched_clock();
324+
ts1 = ts0 = ktime_get_mono_fast_ns();
325325
for (;;) {
326326
if (csd_lock_wait_toolong(csd, ts0, &ts1, &bug_id, &nmessages))
327327
break;

0 commit comments

Comments
 (0)