mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 06:33:07 +00:00
clocksource: Handle negative skews in "skew is too large" messages
[ Upstream commite40806e9bc
] The nanosecond-to-millisecond skew computation uses unsigned arithmetic, which produces user-unfriendly large positive numbers for negative skews. Therefore, use signed arithmetic for this computation in order to preserve the negativity. Reported-by: Chris Bainbridge <chris.bainbridge@gmail.com> Reported-by: Feng Tang <feng.tang@intel.com> Fixes:dd02926994
("clocksource: Improve "skew is too large" messages") Reviewed-by: Feng Tang <feng.tang@intel.com> Tested-by: Chris Bainbridge <chris.bainbridge@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e5de968a90
commit
de1dbbefac
1 changed files with 4 additions and 4 deletions
|
@ -473,8 +473,8 @@ static void clocksource_watchdog(struct timer_list *unused)
|
||||||
/* Check the deviation from the watchdog clocksource. */
|
/* Check the deviation from the watchdog clocksource. */
|
||||||
md = cs->uncertainty_margin + watchdog->uncertainty_margin;
|
md = cs->uncertainty_margin + watchdog->uncertainty_margin;
|
||||||
if (abs(cs_nsec - wd_nsec) > md) {
|
if (abs(cs_nsec - wd_nsec) > md) {
|
||||||
u64 cs_wd_msec;
|
s64 cs_wd_msec;
|
||||||
u64 wd_msec;
|
s64 wd_msec;
|
||||||
u32 wd_rem;
|
u32 wd_rem;
|
||||||
|
|
||||||
pr_warn("timekeeping watchdog on CPU%d: Marking clocksource '%s' as unstable because the skew is too large:\n",
|
pr_warn("timekeeping watchdog on CPU%d: Marking clocksource '%s' as unstable because the skew is too large:\n",
|
||||||
|
@ -483,8 +483,8 @@ static void clocksource_watchdog(struct timer_list *unused)
|
||||||
watchdog->name, wd_nsec, wdnow, wdlast, watchdog->mask);
|
watchdog->name, wd_nsec, wdnow, wdlast, watchdog->mask);
|
||||||
pr_warn(" '%s' cs_nsec: %lld cs_now: %llx cs_last: %llx mask: %llx\n",
|
pr_warn(" '%s' cs_nsec: %lld cs_now: %llx cs_last: %llx mask: %llx\n",
|
||||||
cs->name, cs_nsec, csnow, cslast, cs->mask);
|
cs->name, cs_nsec, csnow, cslast, cs->mask);
|
||||||
cs_wd_msec = div_u64_rem(cs_nsec - wd_nsec, 1000U * 1000U, &wd_rem);
|
cs_wd_msec = div_s64_rem(cs_nsec - wd_nsec, 1000 * 1000, &wd_rem);
|
||||||
wd_msec = div_u64_rem(wd_nsec, 1000U * 1000U, &wd_rem);
|
wd_msec = div_s64_rem(wd_nsec, 1000 * 1000, &wd_rem);
|
||||||
pr_warn(" Clocksource '%s' skewed %lld ns (%lld ms) over watchdog '%s' interval of %lld ns (%lld ms)\n",
|
pr_warn(" Clocksource '%s' skewed %lld ns (%lld ms) over watchdog '%s' interval of %lld ns (%lld ms)\n",
|
||||||
cs->name, cs_nsec - wd_nsec, cs_wd_msec, watchdog->name, wd_nsec, wd_msec);
|
cs->name, cs_nsec - wd_nsec, cs_wd_msec, watchdog->name, wd_nsec, wd_msec);
|
||||||
if (curr_clocksource == cs)
|
if (curr_clocksource == cs)
|
||||||
|
|
Loading…
Reference in a new issue