From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D62481C75E2 for ; Tue, 28 Jan 2025 06:33:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.73 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738045999; cv=none; b=lzbK7s+177RT2I1c8x9RLbWtDdWT9NkYX0cD3BMU1ULDaL5ohzlYBs4s2CBIKqv07tK6DRgG5tIaapbDxnCa/3T9HnLqBO21AEjuPOW+RMaRdoJtCDL2SduS6sm/uyBCBaMAEjKkd0v/xHAX0IWhqBD2IVmJQ/L7MepNt4lNAIs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738045999; c=relaxed/simple; bh=dYmdh5+nj0I5jVtNjGFw5+rR9YOwiqYeLWBF1x9RDg0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=cXdsfLMzmKEzOdgf6aLvLJBXL9M8lpuQGI1tOkiI+55cCod6gl30e+KgKivjZbCd+bhjiF8UGx7SjkaySUjbNIY5B7OAwsAsriKgE+bOAYXR9/O7NtEDr4d9eFqiQH4nUlwEVuE5rIhBMIc/XRbgOqWbPeIlQj8Wi5X1/Gqf0Do= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--jstultz.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=NgEHSBY5; arc=none smtp.client-ip=209.85.216.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--jstultz.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="NgEHSBY5" Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-2f46b7851fcso15654267a91.1 for ; Mon, 27 Jan 2025 22:33:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738045997; x=1738650797; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=gEZshJoa6l7tyDIUkv7YvD8gPZZNJ3FYO7xNYHl9y/Y=; b=NgEHSBY5+QBzmyQYyHCV+4rWufPOIx+9INYQdZlyW0yzFTgNHt/N79AmE0jULgL7oC mjCB+kDPFfTOfIX4x1PKK5p7VmbME7Sg2+ZDL3GeaeeVXME4Ehh9EJp/vunJHgfcv+cw ms5/Fu7aD0TT4sQH5NH1XR7chDN+O4vplek7tKUqHHSAwor+mDJQzQSmbdspsGxUQjpd 9uj1t5HRQNLAX/6BARv05klst/L8+RNOcaiqAoG+DCLWZHjl/3W7Cl/8/Qbeowe9R5XH k1p+ZaWNdfqoYtgQL2kvlJzg9dZ6eKtJkMtc69w5mxwaQh6UtZ9Sx1pBH2RMUXdvQlkG YIIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738045997; x=1738650797; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gEZshJoa6l7tyDIUkv7YvD8gPZZNJ3FYO7xNYHl9y/Y=; b=HyiCipbb7NAnzNecgmYGYYpxC1sPsNII+wOrWxphSs3Lf/2ZMiZof9YLCvbkNCzbqB EGdzJIF/QDfVjVZmqs8eavDpb9a90zTQBn2bNd4rkTPT5jpSIUwJSujvT2A4zRnynheV qnKpYSIaLsCzcSk6mtEE2aMkf2P2AltevLZYvpO8TIopfsVhGXJZH/bo5SaEeg61IqI9 Rthc4RHCllKSVnfeuhJN1hyX8PNc/NU8v1zUEtNAtZFn27/lj4Z5GLND5DMAoeRvQnD8 RAYFCP5abZVey0gfJiXfAt++6NlyQMOJGyU8kA0vridck3/lj6ok9HAw6jZeV1P6riK4 F5vQ== X-Gm-Message-State: AOJu0YxXGD/GbGCH4xG9BDn45EHl7HSnp6BZ8CBpPj3fCv9AiHaMRDEy /1vLtYjyaSAtVv6hc31uVufzyAtOzyrwduyxk1A4hidHjF13iLYAwQB4UjsLVZUb9IxC1UHigNc YIMxFIlv+jWcPUB1BENi9VTjOH9NGOmGli7K+KFKYXB0F40cO5NmMcBg2ST5kAA1k1fbweyXeFh kk3dJATFRkaDu1jfr6cdbXr9uKRgu2d0aIyDprfkMi3nxi X-Google-Smtp-Source: AGHT+IGd7LeDaSOcH0fVHNUrXcUhz016WNaceOXc+/qF/L+edP6tTde/nSfujzR0A+DFsFLmo763ZbiFlrtB X-Received: from pfbbq24.prod.google.com ([2002:a05:6a00:e18:b0:724:e19a:dfd1]) (user=jstultz job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:2184:b0:72a:8cc8:34aa with SMTP id d2e1a72fcca58-72daf88b65dmr65861952b3a.0.1738045997079; Mon, 27 Jan 2025 22:33:17 -0800 (PST) Date: Mon, 27 Jan 2025 22:32:54 -0800 In-Reply-To: <20250128063301.3879317-1-jstultz@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250128063301.3879317-1-jstultz@google.com> X-Mailer: git-send-email 2.48.1.262.g85cc9f2d1e-goog Message-ID: <20250128063301.3879317-3-jstultz@google.com> Subject: [RFC][PATCH 2/3] time/tick: Introduce a dyn_hz boot option From: John Stultz To: LKML Cc: John Stultz , Anna-Maria Behnsen , Frederic Weisbecker , Ingo Molnar , Thomas Gleixner , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Valentin Schneider , Stephen Boyd , Yury Norov , Bitao Hu , Andrew Morton , kernel-team@android.com Content-Type: text/plain; charset="UTF-8" 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 Cc: Frederic Weisbecker Cc: Ingo Molnar Cc: Thomas Gleixner Cc: Peter Zijlstra Cc: Juri Lelli Cc: Vincent Guittot Cc: Dietmar Eggemann Cc: Steven Rostedt Cc: Ben Segall Cc: Mel Gorman Cc: Valentin Schneider Cc: Stephen Boyd Cc: Yury Norov Cc: Bitao Hu Cc: Andrew Morton Cc: kernel-team@android.com Signed-off-by: John Stultz --- 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 #include +#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