Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull timer updates from Thomas Gleixner:
"A rather smalish set of updates for timers and timekeeping:
- Two core fixes to prevent potential undefinded behaviour about
which gcc is complaining rightfully.
- A fix to prevent stopping the tick on an (soon) offline CPU so it
can complete the shutdown procedure.
- Wait for clocks to stabilize before making decisions, so a not yet
validated clock is not rejected.
- The usual pile of fixes to the various clocksource drivers.
- Core code typo and include fixlets"
* 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
timekeeping: Include the correct header for errno definitions
clocksource/drivers/ti-32k: Prevent ftrace recursion
clocksource/mips-gic-timer: Stop checking cpu_has_counter
clocksource/mips-gic-timer: Print an error if IRQ setup fails
tick/nohz: Prevent stopping the tick on an offline CPU
clocksource/drivers/oxnas: Add OX820 compatible
clocksource/drivers/timer-atmel-pit: Simplify IRQ handler
clocksource/drivers/timer-atmel-pit: Remove uselesss WARN_ON_ONCE
clocksource/drivers/timer-atmel-pit: Drop at91sam926x_pit_common_init
clocksource/drivers/moxart: Replace panic by pr_err
clocksource/drivers/moxart: Replace setup_irq by request_irq
clocksource/drivers/moxart: Add Aspeed support
clocksource/drivers/moxart: Use struct to hold state
clocksource/drivers/moxart: Refactor enable/disable
time: Avoid undefined behaviour in ktime_add_safe()
time: Avoid undefined behaviour in timespec64_add_safe()
timekeeping: Prints the amounts of time spent during suspend
clocksource: Defer override invalidation unless clock is unstable
hrtimer: Spelling fixes
This commit is contained in:
@@ -600,9 +600,18 @@ static void __clocksource_select(bool skipcur)
|
||||
*/
|
||||
if (!(cs->flags & CLOCK_SOURCE_VALID_FOR_HRES) && oneshot) {
|
||||
/* Override clocksource cannot be used. */
|
||||
pr_warn("Override clocksource %s is not HRT compatible - cannot switch while in HRT/NOHZ mode\n",
|
||||
cs->name);
|
||||
override_name[0] = 0;
|
||||
if (cs->flags & CLOCK_SOURCE_UNSTABLE) {
|
||||
pr_warn("Override clocksource %s is unstable and not HRT compatible - cannot switch while in HRT/NOHZ mode\n",
|
||||
cs->name);
|
||||
override_name[0] = 0;
|
||||
} else {
|
||||
/*
|
||||
* The override cannot be currently verified.
|
||||
* Deferring to let the watchdog check.
|
||||
*/
|
||||
pr_info("Override clocksource %s is not currently HRT compatible - deferring\n",
|
||||
cs->name);
|
||||
}
|
||||
} else
|
||||
/* Override clocksource can be used. */
|
||||
best = cs;
|
||||
|
||||
@@ -307,7 +307,7 @@ EXPORT_SYMBOL_GPL(__ktime_divns);
|
||||
*/
|
||||
ktime_t ktime_add_safe(const ktime_t lhs, const ktime_t rhs)
|
||||
{
|
||||
ktime_t res = ktime_add(lhs, rhs);
|
||||
ktime_t res = ktime_add_unsafe(lhs, rhs);
|
||||
|
||||
/*
|
||||
* We use KTIME_SEC_MAX here, the maximum timeout which we can
|
||||
@@ -703,7 +703,7 @@ static void clock_was_set_work(struct work_struct *work)
|
||||
static DECLARE_WORK(hrtimer_work, clock_was_set_work);
|
||||
|
||||
/*
|
||||
* Called from timekeeping and resume code to reprogramm the hrtimer
|
||||
* Called from timekeeping and resume code to reprogram the hrtimer
|
||||
* interrupt device on all cpus.
|
||||
*/
|
||||
void clock_was_set_delayed(void)
|
||||
@@ -1241,7 +1241,7 @@ static void __run_hrtimer(struct hrtimer_cpu_base *cpu_base,
|
||||
|
||||
/*
|
||||
* Note: We clear the running state after enqueue_hrtimer and
|
||||
* we do not reprogramm the event hardware. Happens either in
|
||||
* we do not reprogram the event hardware. Happens either in
|
||||
* hrtimer_start_range_ns() or in hrtimer_interrupt()
|
||||
*
|
||||
* Note: Because we dropped the cpu_base->lock above,
|
||||
|
||||
@@ -186,10 +186,13 @@ static bool check_tick_dependency(atomic_t *dep)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool can_stop_full_tick(struct tick_sched *ts)
|
||||
static bool can_stop_full_tick(int cpu, struct tick_sched *ts)
|
||||
{
|
||||
WARN_ON_ONCE(!irqs_disabled());
|
||||
|
||||
if (unlikely(!cpu_online(cpu)))
|
||||
return false;
|
||||
|
||||
if (check_tick_dependency(&tick_dep_mask))
|
||||
return false;
|
||||
|
||||
@@ -843,7 +846,7 @@ static void tick_nohz_full_update_tick(struct tick_sched *ts)
|
||||
if (!ts->tick_stopped && ts->nohz_mode == NOHZ_MODE_INACTIVE)
|
||||
return;
|
||||
|
||||
if (can_stop_full_tick(ts))
|
||||
if (can_stop_full_tick(cpu, ts))
|
||||
tick_nohz_stop_sched_tick(ts, ktime_get(), cpu);
|
||||
else if (ts->tick_stopped)
|
||||
tick_nohz_restart_sched_tick(ts, ktime_get());
|
||||
|
||||
@@ -780,7 +780,7 @@ struct timespec64 timespec64_add_safe(const struct timespec64 lhs,
|
||||
{
|
||||
struct timespec64 res;
|
||||
|
||||
set_normalized_timespec64(&res, lhs.tv_sec + rhs.tv_sec,
|
||||
set_normalized_timespec64(&res, (timeu64_t) lhs.tv_sec + rhs.tv_sec,
|
||||
lhs.tv_nsec + rhs.tv_nsec);
|
||||
|
||||
if (unlikely(res.tv_sec < lhs.tv_sec || res.tv_sec < rhs.tv_sec)) {
|
||||
|
||||
@@ -75,5 +75,7 @@ void tk_debug_account_sleep_time(struct timespec64 *t)
|
||||
int bin = min(fls(t->tv_sec), NUM_BINS-1);
|
||||
|
||||
sleep_time_bin[bin]++;
|
||||
pr_info("Suspended for %lld.%03lu seconds\n", (s64)t->tv_sec,
|
||||
t->tv_nsec / NSEC_PER_MSEC);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user