From nobody Wed Oct 8 17:34:01 2025 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3AD732D877C; Wed, 25 Jun 2025 16:16:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750868168; cv=none; b=To2gQldzxOIGOamyxiuPZemxtK1T4QgxIT5MTkIHTEaekMhvugnfmsvr+UdjtlddCRlZyEUcBJIHOBUQHkPm4BENK+lVehAb8V1VyPj4gRgnywO4C3O+Qgp7G7hzjzCYebHDSoAXDgPcTR8L0RoPjZ/hFm2WHa3Dv1mWqd3O9cg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750868168; c=relaxed/simple; bh=x6bwLThVDb8MJJNTHRvM0oR9cnhjtrMoRQdnLvs0sZo=; h=Date:From:To:Subject:Cc:In-Reply-To:References:MIME-Version: Message-ID:Content-Type; b=TDS0jNWtdUnun+vo2kyVfNRy5O5oY6jTDN1oW1SonrAHUMvr+RTP/NT+9hCeGZfeP4HshhKffGzs1v6uYV8sCvf3yB9s0m9jsvWCrvqQUzmPp4WDjzsHejWmSczh+VgHlbxjHPoU78aH46LULlCISbnNv8vhVrlqPRmVY9qxfAc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=J/87wv/l; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=vCfyUCNW; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="J/87wv/l"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="vCfyUCNW" Date: Wed, 25 Jun 2025 16:16:03 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1750868164; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bvbSW+jIg+mTtpZzUOrXycTnjJ/94Kuc3RPbgBWchhU=; b=J/87wv/l/3CLVzJAabpPIGSoHqvhVZht1lnE1lnPTKY4jj4N7hPNACZmH+4foQIyXt8WSw eNLzG4Ve9xYEFKkPQiTb/lzieVKrbMXIb8LzOFPpVUOt3mN+DPrbFPXOtsJ2ac4X9WLFFV TvO6XO9qQVxCe2kLn2Y9HJaUpJCpnMEAe0JvpVDAIM2SFPflRHGUY6fXtw8fX5jFtA4rRx SFo7WOeHcx8QncxK2dqEcsfmd3Ppyfh57Ra5fypRyuIRfw0gdr8L8K4BY7LI3URF/X/65l 9eLqf6cdbiyLfza4/HoPo/DopYdi1QVV6hfE3h05Au/xEwNS94rCNnawaJ5Nlg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1750868164; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bvbSW+jIg+mTtpZzUOrXycTnjJ/94Kuc3RPbgBWchhU=; b=vCfyUCNWpYm1qgcaKCMB4O73xMJ+8Mduzltm24OyYhrbSCzHq6Lafs+XljsijN0K+AtBoj 15qJSC7o2XfuunBA== From: "tip-bot2 for Thomas Gleixner" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: timers/ptp] ntp: Add timekeeper ID arguments to public functions Cc: Thomas Gleixner , John Stultz , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20250519083026.032425931@linutronix.de> References: <20250519083026.032425931@linutronix.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <175086816349.406.14743543414755960253.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Precedence: bulk Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The following commit has been merged into the timers/ptp branch of tip: Commit-ID: 5ffa25f573cf524ff53660c5ff7a158ee10f23c7 Gitweb: https://git.kernel.org/tip/5ffa25f573cf524ff53660c5ff7a158ee= 10f23c7 Author: Thomas Gleixner AuthorDate: Mon, 19 May 2025 10:33:22 +02:00 Committer: Thomas Gleixner CommitterDate: Thu, 19 Jun 2025 14:28:23 +02:00 ntp: Add timekeeper ID arguments to public functions In preparation for supporting auxiliary POSIX clocks, add a timekeeper ID to the relevant functions. Signed-off-by: Thomas Gleixner Acked-by: John Stultz Link: https://lore.kernel.org/all/20250519083026.032425931@linutronix.de --- kernel/time/ntp.c | 33 +++++++++++++++++++-------------- kernel/time/ntp_internal.h | 11 +++++------ kernel/time/timekeeping.c | 12 ++++++------ 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 5b5a0f7..e28dc53 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c @@ -351,33 +351,38 @@ static void __ntp_clear(struct ntp_data *ntpdata) =20 /** * ntp_clear - Clears the NTP state variables + * @tkid: Timekeeper ID to be able to select proper ntp data array member */ -void ntp_clear(void) +void ntp_clear(unsigned int tkid) { - __ntp_clear(&tk_ntp_data[TIMEKEEPER_CORE]); + __ntp_clear(&tk_ntp_data[tkid]); } =20 =20 -u64 ntp_tick_length(void) +u64 ntp_tick_length(unsigned int tkid) { - return tk_ntp_data[TIMEKEEPER_CORE].tick_length; + return tk_ntp_data[tkid].tick_length; } =20 /** * ntp_get_next_leap - Returns the next leapsecond in CLOCK_REALTIME ktime= _t + * @tkid: Timekeeper ID * - * Provides the time of the next leapsecond against CLOCK_REALTIME in - * a ktime_t format. Returns KTIME_MAX if no leapsecond is pending. + * Returns: For @tkid =3D=3D TIMEKEEPER_CORE this provides the time of the= next + * leap second against CLOCK_REALTIME in a ktime_t format if a + * leap second is pending. KTIME_MAX otherwise. */ -ktime_t ntp_get_next_leap(void) +ktime_t ntp_get_next_leap(unsigned int tkid) { struct ntp_data *ntpdata =3D &tk_ntp_data[TIMEKEEPER_CORE]; - ktime_t ret; + + if (tkid !=3D TIMEKEEPER_CORE) + return KTIME_MAX; =20 if ((ntpdata->time_state =3D=3D TIME_INS) && (ntpdata->time_status & STA_= INS)) return ktime_set(ntpdata->ntp_next_leap_sec, 0); - ret =3D KTIME_MAX; - return ret; + + return KTIME_MAX; } =20 /* @@ -390,9 +395,9 @@ ktime_t ntp_get_next_leap(void) * * Also handles leap second processing, and returns leap offset */ -int second_overflow(time64_t secs) +int second_overflow(unsigned int tkid, time64_t secs) { - struct ntp_data *ntpdata =3D &tk_ntp_data[TIMEKEEPER_CORE]; + struct ntp_data *ntpdata =3D &tk_ntp_data[tkid]; s64 delta; int leap =3D 0; s32 rem; @@ -762,10 +767,10 @@ static inline void process_adjtimex_modes(struct ntp_= data *ntpdata, const struct * adjtimex() mainly allows reading (and writing, if superuser) of * kernel time-keeping variables. used by xntpd. */ -int __do_adjtimex(struct __kernel_timex *txc, const struct timespec64 *ts, +int __do_adjtimex(unsigned int tkid, struct __kernel_timex *txc, const str= uct timespec64 *ts, s32 *time_tai, struct audit_ntp_data *ad) { - struct ntp_data *ntpdata =3D &tk_ntp_data[TIMEKEEPER_CORE]; + struct ntp_data *ntpdata =3D &tk_ntp_data[tkid]; int result; =20 if (txc->modes & ADJ_ADJTIME) { diff --git a/kernel/time/ntp_internal.h b/kernel/time/ntp_internal.h index 5a633dc..2d3e966 100644 --- a/kernel/time/ntp_internal.h +++ b/kernel/time/ntp_internal.h @@ -3,13 +3,12 @@ #define _LINUX_NTP_INTERNAL_H =20 extern void ntp_init(void); -extern void ntp_clear(void); +extern void ntp_clear(unsigned int tkid); /* Returns how long ticks are at present, in ns / 2^NTP_SCALE_SHIFT. */ -extern u64 ntp_tick_length(void); -extern ktime_t ntp_get_next_leap(void); -extern int second_overflow(time64_t secs); -extern int __do_adjtimex(struct __kernel_timex *txc, - const struct timespec64 *ts, +extern u64 ntp_tick_length(unsigned int tkid); +extern ktime_t ntp_get_next_leap(unsigned int tkid); +extern int second_overflow(unsigned int tkid, time64_t secs); +extern int __do_adjtimex(unsigned int tkid, struct __kernel_timex *txc, co= nst struct timespec64 *ts, s32 *time_tai, struct audit_ntp_data *ad); extern void __hardpps(const struct timespec64 *phase_ts, const struct time= spec64 *raw_ts); =20 diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index f4692fc..e1b8e26 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c @@ -601,7 +601,7 @@ EXPORT_SYMBOL_GPL(pvclock_gtod_unregister_notifier); */ static inline void tk_update_leap_state(struct timekeeper *tk) { - tk->next_leap_ktime =3D ntp_get_next_leap(); + tk->next_leap_ktime =3D ntp_get_next_leap(tk->id); if (tk->next_leap_ktime !=3D KTIME_MAX) /* Convert to monotonic time */ tk->next_leap_ktime =3D ktime_sub(tk->next_leap_ktime, tk->offs_real); @@ -678,7 +678,7 @@ static void timekeeping_update_from_shadow(struct tk_da= ta *tkd, unsigned int act =20 if (action & TK_CLEAR_NTP) { tk->ntp_error =3D 0; - ntp_clear(); + ntp_clear(tk->id); } =20 tk_update_leap_state(tk); @@ -2049,7 +2049,7 @@ static __always_inline void timekeeping_apply_adjustm= ent(struct timekeeper *tk, */ static void timekeeping_adjust(struct timekeeper *tk, s64 offset) { - u64 ntp_tl =3D ntp_tick_length(); + u64 ntp_tl =3D ntp_tick_length(tk->id); u32 mult; =20 /* @@ -2130,7 +2130,7 @@ static inline unsigned int accumulate_nsecs_to_secs(s= truct timekeeper *tk) } =20 /* Figure out if its a leap sec and apply if needed */ - leap =3D second_overflow(tk->xtime_sec); + leap =3D second_overflow(tk->id, tk->xtime_sec); if (unlikely(leap)) { struct timespec64 ts; =20 @@ -2227,7 +2227,7 @@ static bool __timekeeping_advance(enum timekeeping_ad= v_mode mode) shift =3D ilog2(offset) - ilog2(tk->cycle_interval); shift =3D max(0, shift); /* Bound shift to one less than what overflows tick_length */ - maxshift =3D (64 - (ilog2(ntp_tick_length())+1)) - 1; + maxshift =3D (64 - (ilog2(ntp_tick_length(tk->id)) + 1)) - 1; shift =3D min(shift, maxshift); while (offset >=3D tk->cycle_interval) { offset =3D logarithmic_accumulation(tk, offset, shift, &clock_set); @@ -2586,7 +2586,7 @@ int do_adjtimex(struct __kernel_timex *txc) } =20 orig_tai =3D tai =3D tks->tai_offset; - ret =3D __do_adjtimex(txc, &ts, &tai, &ad); + ret =3D __do_adjtimex(tks->id, txc, &ts, &tai, &ad); =20 if (tai !=3D orig_tai) { __timekeeping_set_tai_offset(tks, tai);