All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Stultz <jstultz@google.com>
To: LKML <linux-kernel@vger.kernel.org>
Cc: John Stultz <jstultz@google.com>,
	Anna-Maria Behnsen <anna-maria@linutronix.de>,
	 Frederic Weisbecker <frederic@kernel.org>,
	Ingo Molnar <mingo@kernel.org>,
	 Thomas Gleixner <tglx@linutronix.de>,
	Peter Zijlstra <peterz@infradead.org>,
	 Juri Lelli <juri.lelli@redhat.com>,
	Vincent Guittot <vincent.guittot@linaro.org>,
	 Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	 Ben Segall <bsegall@google.com>, Mel Gorman <mgorman@suse.de>,
	 Valentin Schneider <vschneid@redhat.com>,
	Stephen Boyd <sboyd@kernel.org>,
	 Yury Norov <yury.norov@gmail.com>,
	Bitao Hu <yaoma@linux.alibaba.com>,
	 Andrew Morton <akpm@linux-foundation.org>,
	kernel-team@android.com
Subject: [RFC][PATCH 2/3] time/tick: Introduce a dyn_hz boot option
Date: Mon, 27 Jan 2025 22:32:54 -0800	[thread overview]
Message-ID: <20250128063301.3879317-3-jstultz@google.com> (raw)
In-Reply-To: <20250128063301.3879317-1-jstultz@google.com>

Introduce dyn_hz= option, which allows the actual timer tick to
be scaled down at boot time.

This allows kerenls to be built with HZ=1000 but systems to
effectively run as if HZ=100 if specified.

The system will still run with the configured HZ value, but
ticks will just arrive "late".

The valid values are between 100 and the build time CONFIG_HZ
value.

Cc: Anna-Maria Behnsen <anna-maria@linutronix.de>
Cc: Frederic Weisbecker <frederic@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Ben Segall <bsegall@google.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Stephen Boyd <sboyd@kernel.org>
Cc: Yury Norov <yury.norov@gmail.com>
Cc: Bitao Hu <yaoma@linux.alibaba.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: kernel-team@android.com
Signed-off-by: John Stultz <jstultz@google.com>
---
 include/linux/tick.h      | 11 +++++++++--
 kernel/Kconfig.hz         |  9 +++++++++
 kernel/time/tick-common.c | 30 ++++++++++++++++++++++++++++++
 kernel/time/tick-sched.c  |  4 ++--
 4 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/include/linux/tick.h b/include/linux/tick.h
index b8ddc8e631a3c..734ee1e08c9ef 100644
--- a/include/linux/tick.h
+++ b/include/linux/tick.h
@@ -14,6 +14,13 @@
 #include <linux/rcupdate.h>
 #include <linux/static_key.h>
 
+#ifdef CONFIG_DYN_HZ
+extern long long dyn_tick_nsec;
+#define DYN_TICK_NSEC (dyn_tick_nsec)
+#else
+#define DYN_TICK_NSEC TICK_NSEC
+#endif
+
 #ifdef CONFIG_GENERIC_CLOCKEVENTS
 extern void __init tick_init(void);
 /* Should be core only, but ARM BL switcher requires it */
@@ -153,11 +160,11 @@ static inline bool tick_nohz_idle_got_tick(void) { return false; }
 static inline ktime_t tick_nohz_get_next_hrtimer(void)
 {
 	/* Next wake up is the tick period, assume it starts now */
-	return ktime_add(ktime_get(), TICK_NSEC);
+	return ktime_add(ktime_get(), DYN_TICK_NSEC);
 }
 static inline ktime_t tick_nohz_get_sleep_length(ktime_t *delta_next)
 {
-	*delta_next = TICK_NSEC;
+	*delta_next = DYN_TICK_NSEC;
 	return *delta_next;
 }
 static inline u64 get_cpu_idle_time_us(int cpu, u64 *unused) { return -1; }
diff --git a/kernel/Kconfig.hz b/kernel/Kconfig.hz
index 38ef6d06888ef..76714317674c5 100644
--- a/kernel/Kconfig.hz
+++ b/kernel/Kconfig.hz
@@ -55,5 +55,14 @@ config HZ
 	default 300 if HZ_300
 	default 1000 if HZ_1000
 
+config DYN_HZ
+	bool "Support dynamic HZ via boot argument"
+	default n
+	help
+	 Allow for the tick rate to be set at boot time via the dynhz=
+	 boot argument. This allows the tick rate to be lower then the
+	 build time configured HZ value.
+	 If you are unsure, say no.
+
 config SCHED_HRTICK
 	def_bool HIGH_RES_TIMERS
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index ae5c5befdc58b..75fd9dadb8273 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -80,6 +80,30 @@ int tick_is_oneshot_available(void)
 	return tick_broadcast_oneshot_available();
 }
 
+#ifdef CONFIG_DYN_HZ
+long long dyn_tick_nsec = TICK_NSEC;
+
+static int __init set_dyn_hz(char *str)
+{
+	int ret, dyn_hz;
+
+	ret = kstrtoint(str, 0, &dyn_hz);
+	if (ret)
+		return ret;
+	if (dyn_hz > HZ || dyn_hz < 100)
+		dyn_hz = HZ;
+	dyn_tick_nsec = TICK_NSEC * HZ / dyn_hz;
+	return 1;
+}
+#else /* !CONFIG_DYN_HZ */
+static int __init set_dyn_hz(char *str)
+{
+	pr_warn("CONFIG_DYN_HZ not enabled, ignoring dyn_hz boot argument\n");
+	return -1;
+}
+#endif /* CONFIG_DYN_HZ */
+__setup("dyn_hz=", set_dyn_hz);
+
 /*
  * Periodic tick
  */
@@ -575,4 +599,10 @@ void __init tick_init(void)
 {
 	tick_broadcast_init();
 	tick_nohz_init();
+	if (DYN_TICK_NSEC != TICK_NSEC) {
+		long long dynhz = TICK_NSEC * HZ;
+
+		do_div(dynhz, DYN_TICK_NSEC);
+		pr_info("dynHZ in use! HZ=%ld dynHZ=%lld\n", (long)HZ, dynhz);
+	}
 }
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
index 983790923aee9..040ad70c31d38 100644
--- a/kernel/time/tick-sched.c
+++ b/kernel/time/tick-sched.c
@@ -309,7 +309,7 @@ static enum hrtimer_restart tick_nohz_handler(struct hrtimer *timer)
 	if (unlikely(tick_sched_flag_test(ts, TS_FLAG_STOPPED)))
 		return HRTIMER_NORESTART;
 
-	hrtimer_forward(timer, now, TICK_NSEC);
+	hrtimer_forward(timer, now, DYN_TICK_NSEC);
 
 	return HRTIMER_RESTART;
 }
@@ -842,7 +842,7 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)
 	hrtimer_set_expires(&ts->sched_timer, ts->last_tick);
 
 	/* Forward the time to expire in the future */
-	hrtimer_forward(&ts->sched_timer, now, TICK_NSEC);
+	hrtimer_forward(&ts->sched_timer, now, DYN_TICK_NSEC);
 
 	if (tick_sched_flag_test(ts, TS_FLAG_HIGHRES)) {
 		hrtimer_start_expires(&ts->sched_timer,
-- 
2.48.1.262.g85cc9f2d1e-goog


  parent reply	other threads:[~2025-01-28  6:33 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-28  6:32 [RFC][PATCH 0/3] DynamicHZ: Configuring the timer tick rate at boot time John Stultz
2025-01-28  6:32 ` [RFC][PATCH 1/3] time/tick: Pipe tick count down through cputime accounting John Stultz
2025-01-28 14:44   ` Thomas Gleixner
2025-01-29  4:10     ` John Stultz
2025-01-28  6:32 ` John Stultz [this message]
2025-01-28  9:07   ` [RFC][PATCH 2/3] time/tick: Introduce a dyn_hz boot option Peter Zijlstra
2025-01-28 17:29     ` John Stultz
2025-01-28 19:30       ` Peter Zijlstra
2025-01-28  6:32 ` [RFC][PATCH 3/3] Kconfig: Add CONFIG_DYN_HZ_DEFAULT to specify the default dynhz= boot option value John Stultz
2025-01-28 16:46 ` [RFC][PATCH 0/3] DynamicHZ: Configuring the timer tick rate at boot time Thomas Gleixner
2025-01-29  6:10   ` John Stultz
2025-01-29  8:09     ` Thomas Gleixner
2025-02-10 16:54       ` David Laight
2025-02-03 11:14   ` Peter Zijlstra
2025-02-10  1:14     ` Qais Yousef
2025-02-10  1:09   ` Qais Yousef

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250128063301.3879317-3-jstultz@google.com \
    --to=jstultz@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=anna-maria@linutronix.de \
    --cc=bsegall@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=frederic@kernel.org \
    --cc=juri.lelli@redhat.com \
    --cc=kernel-team@android.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mgorman@suse.de \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=sboyd@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=yaoma@linux.alibaba.com \
    --cc=yury.norov@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.