tick: Get rid of tick_period
[ Upstream commit b996544916429946bf4934c1c01a306d1690972c ] The variable tick_period is initialized to NSEC_PER_TICK / HZ during boot and never updated again. If NSEC_PER_TICK is not an integer multiple of HZ this computation is less accurate than TICK_NSEC which has proper rounding in place. Aside of the inaccuracy there is no reason for having this variable at all. It's just a pointless indirection and all usage sites can just use the TICK_NSEC constant. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20201117132006.766643526@linutronix.de Stable-dep-of: e9523a0d8189 ("tick/common: Align tick period with the HZ tick.") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
3df29117d8
commit
04be737176
4 changed files with 15 additions and 18 deletions
|
|
@ -331,7 +331,7 @@ static void tick_handle_periodic_broadcast(struct clock_event_device *dev)
|
||||||
bc_local = tick_do_periodic_broadcast();
|
bc_local = tick_do_periodic_broadcast();
|
||||||
|
|
||||||
if (clockevent_state_oneshot(dev)) {
|
if (clockevent_state_oneshot(dev)) {
|
||||||
ktime_t next = ktime_add(dev->next_event, tick_period);
|
ktime_t next = ktime_add_ns(dev->next_event, TICK_NSEC);
|
||||||
|
|
||||||
clockevents_program_event(dev, next, true);
|
clockevents_program_event(dev, next, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ DEFINE_PER_CPU(struct tick_device, tick_cpu_device);
|
||||||
* Tick next event: keeps track of the tick time
|
* Tick next event: keeps track of the tick time
|
||||||
*/
|
*/
|
||||||
ktime_t tick_next_period;
|
ktime_t tick_next_period;
|
||||||
ktime_t tick_period;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tick_do_timer_cpu is a timer core internal variable which holds the CPU NR
|
* tick_do_timer_cpu is a timer core internal variable which holds the CPU NR
|
||||||
|
|
@ -88,7 +87,7 @@ static void tick_periodic(int cpu)
|
||||||
write_seqcount_begin(&jiffies_seq);
|
write_seqcount_begin(&jiffies_seq);
|
||||||
|
|
||||||
/* Keep track of the next tick event */
|
/* Keep track of the next tick event */
|
||||||
tick_next_period = ktime_add(tick_next_period, tick_period);
|
tick_next_period = ktime_add_ns(tick_next_period, TICK_NSEC);
|
||||||
|
|
||||||
do_timer(1);
|
do_timer(1);
|
||||||
write_seqcount_end(&jiffies_seq);
|
write_seqcount_end(&jiffies_seq);
|
||||||
|
|
@ -127,7 +126,7 @@ void tick_handle_periodic(struct clock_event_device *dev)
|
||||||
* Setup the next period for devices, which do not have
|
* Setup the next period for devices, which do not have
|
||||||
* periodic mode:
|
* periodic mode:
|
||||||
*/
|
*/
|
||||||
next = ktime_add(next, tick_period);
|
next = ktime_add_ns(next, TICK_NSEC);
|
||||||
|
|
||||||
if (!clockevents_program_event(dev, next, false))
|
if (!clockevents_program_event(dev, next, false))
|
||||||
return;
|
return;
|
||||||
|
|
@ -173,7 +172,7 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (!clockevents_program_event(dev, next, false))
|
if (!clockevents_program_event(dev, next, false))
|
||||||
return;
|
return;
|
||||||
next = ktime_add(next, tick_period);
|
next = ktime_add_ns(next, TICK_NSEC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -220,7 +219,6 @@ static void tick_setup_device(struct tick_device *td,
|
||||||
tick_do_timer_cpu = cpu;
|
tick_do_timer_cpu = cpu;
|
||||||
|
|
||||||
tick_next_period = ktime_get();
|
tick_next_period = ktime_get();
|
||||||
tick_period = NSEC_PER_SEC / HZ;
|
|
||||||
#ifdef CONFIG_NO_HZ_FULL
|
#ifdef CONFIG_NO_HZ_FULL
|
||||||
/*
|
/*
|
||||||
* The boot CPU may be nohz_full, in which case set
|
* The boot CPU may be nohz_full, in which case set
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
|
DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
|
||||||
extern ktime_t tick_next_period;
|
extern ktime_t tick_next_period;
|
||||||
extern ktime_t tick_period;
|
|
||||||
extern int tick_do_timer_cpu __read_mostly;
|
extern int tick_do_timer_cpu __read_mostly;
|
||||||
|
|
||||||
extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
|
extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
|
||||||
|
|
|
||||||
|
|
@ -92,17 +92,17 @@ static void tick_do_update_jiffies64(ktime_t now)
|
||||||
write_seqcount_begin(&jiffies_seq);
|
write_seqcount_begin(&jiffies_seq);
|
||||||
|
|
||||||
delta = ktime_sub(now, tick_next_period);
|
delta = ktime_sub(now, tick_next_period);
|
||||||
if (unlikely(delta >= tick_period)) {
|
if (unlikely(delta >= TICK_NSEC)) {
|
||||||
/* Slow path for long idle sleep times */
|
/* Slow path for long idle sleep times */
|
||||||
s64 incr = ktime_to_ns(tick_period);
|
s64 incr = TICK_NSEC;
|
||||||
|
|
||||||
ticks += ktime_divns(delta, incr);
|
ticks += ktime_divns(delta, incr);
|
||||||
|
|
||||||
last_jiffies_update = ktime_add_ns(last_jiffies_update,
|
last_jiffies_update = ktime_add_ns(last_jiffies_update,
|
||||||
incr * ticks);
|
incr * ticks);
|
||||||
} else {
|
} else {
|
||||||
last_jiffies_update = ktime_add(last_jiffies_update,
|
last_jiffies_update = ktime_add_ns(last_jiffies_update,
|
||||||
tick_period);
|
TICK_NSEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
do_timer(ticks);
|
do_timer(ticks);
|
||||||
|
|
@ -112,7 +112,7 @@ static void tick_do_update_jiffies64(ktime_t now)
|
||||||
* pairs with the READ_ONCE() in the lockless quick check above.
|
* pairs with the READ_ONCE() in the lockless quick check above.
|
||||||
*/
|
*/
|
||||||
WRITE_ONCE(tick_next_period,
|
WRITE_ONCE(tick_next_period,
|
||||||
ktime_add(last_jiffies_update, tick_period));
|
ktime_add_ns(last_jiffies_update, TICK_NSEC));
|
||||||
|
|
||||||
write_seqcount_end(&jiffies_seq);
|
write_seqcount_end(&jiffies_seq);
|
||||||
raw_spin_unlock(&jiffies_lock);
|
raw_spin_unlock(&jiffies_lock);
|
||||||
|
|
@ -659,7 +659,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
|
||||||
hrtimer_set_expires(&ts->sched_timer, ts->last_tick);
|
hrtimer_set_expires(&ts->sched_timer, ts->last_tick);
|
||||||
|
|
||||||
/* Forward the time to expire in the future */
|
/* Forward the time to expire in the future */
|
||||||
hrtimer_forward(&ts->sched_timer, now, tick_period);
|
hrtimer_forward(&ts->sched_timer, now, TICK_NSEC);
|
||||||
|
|
||||||
if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
|
if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
|
||||||
hrtimer_start_expires(&ts->sched_timer,
|
hrtimer_start_expires(&ts->sched_timer,
|
||||||
|
|
@ -1221,7 +1221,7 @@ static void tick_nohz_handler(struct clock_event_device *dev)
|
||||||
if (unlikely(ts->tick_stopped))
|
if (unlikely(ts->tick_stopped))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hrtimer_forward(&ts->sched_timer, now, tick_period);
|
hrtimer_forward(&ts->sched_timer, now, TICK_NSEC);
|
||||||
tick_program_event(hrtimer_get_expires(&ts->sched_timer), 1);
|
tick_program_event(hrtimer_get_expires(&ts->sched_timer), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1258,7 +1258,7 @@ static void tick_nohz_switch_to_nohz(void)
|
||||||
next = tick_init_jiffy_update();
|
next = tick_init_jiffy_update();
|
||||||
|
|
||||||
hrtimer_set_expires(&ts->sched_timer, next);
|
hrtimer_set_expires(&ts->sched_timer, next);
|
||||||
hrtimer_forward_now(&ts->sched_timer, tick_period);
|
hrtimer_forward_now(&ts->sched_timer, TICK_NSEC);
|
||||||
tick_program_event(hrtimer_get_expires(&ts->sched_timer), 1);
|
tick_program_event(hrtimer_get_expires(&ts->sched_timer), 1);
|
||||||
tick_nohz_activate(ts, NOHZ_MODE_LOWRES);
|
tick_nohz_activate(ts, NOHZ_MODE_LOWRES);
|
||||||
}
|
}
|
||||||
|
|
@ -1324,7 +1324,7 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
|
||||||
if (unlikely(ts->tick_stopped))
|
if (unlikely(ts->tick_stopped))
|
||||||
return HRTIMER_NORESTART;
|
return HRTIMER_NORESTART;
|
||||||
|
|
||||||
hrtimer_forward(timer, now, tick_period);
|
hrtimer_forward(timer, now, TICK_NSEC);
|
||||||
|
|
||||||
return HRTIMER_RESTART;
|
return HRTIMER_RESTART;
|
||||||
}
|
}
|
||||||
|
|
@ -1358,13 +1358,13 @@ void tick_setup_sched_timer(void)
|
||||||
|
|
||||||
/* Offset the tick to avert jiffies_lock contention. */
|
/* Offset the tick to avert jiffies_lock contention. */
|
||||||
if (sched_skew_tick) {
|
if (sched_skew_tick) {
|
||||||
u64 offset = ktime_to_ns(tick_period) >> 1;
|
u64 offset = TICK_NSEC >> 1;
|
||||||
do_div(offset, num_possible_cpus());
|
do_div(offset, num_possible_cpus());
|
||||||
offset *= smp_processor_id();
|
offset *= smp_processor_id();
|
||||||
hrtimer_add_expires_ns(&ts->sched_timer, offset);
|
hrtimer_add_expires_ns(&ts->sched_timer, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
hrtimer_forward(&ts->sched_timer, now, tick_period);
|
hrtimer_forward(&ts->sched_timer, now, TICK_NSEC);
|
||||||
hrtimer_start_expires(&ts->sched_timer, HRTIMER_MODE_ABS_PINNED_HARD);
|
hrtimer_start_expires(&ts->sched_timer, HRTIMER_MODE_ABS_PINNED_HARD);
|
||||||
tick_nohz_activate(ts, NOHZ_MODE_HIGHRES);
|
tick_nohz_activate(ts, NOHZ_MODE_HIGHRES);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue