]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sched/hrtick: Mark hrtick timer LAZY_REARM
authorPeter Zijlstra <peterz@infradead.org>
Tue, 24 Feb 2026 16:36:06 +0000 (17:36 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Fri, 27 Feb 2026 15:40:06 +0000 (16:40 +0100)
The hrtick timer is frequently rearmed before expiry and most of the time
the new expiry is past the armed one. As this happens on every context
switch it becomes expensive with scheduling heavy work loads especially in
virtual machines as the "hardware" reprogamming implies a VM exit.

hrtimer now provide a lazy rearm mode flag which skips the reprogamming if:

    1) The timer was the first expiring timer before the rearm

    2) The new expiry time is farther out than the armed time

This avoids a massive amount of reprogramming operations of the hrtick
timer for the price of eventually taking the alredy armed interrupt for
nothing.

Mark the hrtick timer accordingly.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/20260224163429.475409346@kernel.org
kernel/sched/core.c

index 5bc446e1b3d66d41ad23ebce20764ecac981dd13..2d1239a8b2306a1d20e792ef2a2e22a6a58e96c1 100644 (file)
@@ -998,7 +998,8 @@ static void hrtick_rq_init(struct rq *rq)
 {
        INIT_CSD(&rq->hrtick_csd, __hrtick_start, rq);
        rq->hrtick_sched = HRTICK_SCHED_NONE;
-       hrtimer_setup(&rq->hrtick_timer, hrtick, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
+       hrtimer_setup(&rq->hrtick_timer, hrtick, CLOCK_MONOTONIC,
+                     HRTIMER_MODE_REL_HARD | HRTIMER_MODE_LAZY_REARM);
 }
 #else /* !CONFIG_SCHED_HRTICK: */
 static inline void hrtick_clear(struct rq *rq) { }