From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794591588; b=uhEZ5wc3ADlSnrFMMi8OLLESDsjNrhZEeURZGA3XcXlwwvvfPHfrv3VCQcuM6AQGY5Rx 1XUBcGJ/rTbrBlii75b+WSucUNR8/SzkdSHV8JxmLVlsWY2lf1JXXQD3kVJVQKEnXMft2 +9bUVTqY1XTB3C6olAr4Q586WndJr1xnpy2bXmbdsQ216fwRBVHeZ7J5qDN/DhUY8HIM6 n10KmKsyfBGNE/MPFotlTr/HqYFCWHzNeOIBmm/brFErM7ts11vdcO9Ozbrpzza2fjQ2M QyzZAPNqZNQEWmDhpRc/sYCWkJJ30/D465pow9l8AiGz5Cq0fMrtUmi2xQnwmORPFSw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794591588; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID:X-Mailer: In-Reply-To:References:User-Agent:X-stable:X-Patchwork-Hint: MIME-Version:Content-Transfer-Encoding; bh=ONV86HvHenw/fSV+8x3s6Uns0waMhCYSEKobEOjajpo=; b=yzbbzrzM0AnfNHLqj3MBrzshgRN3/BQKGC9gBf1LAFjncjI92djNgDYXOX58XOGb2tQe BwkHj78FTTc9rTLUbDqu5l9sancNJJxfw4vY7xztRIokqziZxNB+bASEDFZej6MfhGtCG xrMppSjun3stKBmC8x4fvgXmcJ/AinKC0bxXjyJnKC7PcDBb/rKw5AL2T/JZ+oezZEpCK aubgD72khZinMHUhozDx2lygiZSUFHpvo3u+mULDSUe2w5A+/eKW49QxHC0U20dVZLGPf sMYItUjFOBnF9jp1/eMqCe6x2cScWkYHQUx+zN5AFf41TcRtelG1soaDwxf6ZFczLog== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=sLqe2HB2; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 73527606E651; Fri, 13 Nov 2026 17:39:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.a=rsa-sha256 header.s=korg header.b=sLqe2HB2 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1EA371F000C4; Fri, 13 Nov 2026 17:39:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxfoundation.org; s=korg; t=1794591588; bh=ONV86HvHenw/fSV+8x3s6Uns0waMhCYSEKobEOjajpo=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=sLqe2HB2/WyL58ATU3m/7UCBWKuutujs1KJJ7SP7sWfV7iPDUq1fgskITda1UwERG RQmGlOVy5hnsSlN/AQv8/wD0NbaQcIcpbXU2cDlysVyvF3iMMqgE3L2Vv95CYqM5L2 gEu2GqVPH0sX3WZ5cqMpoSRwQZ48NrRq6iJ1ZKXc= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Hung-Jui Lin , Thomas Gleixner , Sasha Levin Subject: [PATCH 6.12 634/670] posix-timers: Report zero remaining time for disarmed SIGEV_NONE timers Date: Fri, 13 Nov 2026 10:53:18 -0500 Message-ID: <20261113153833.285986060@linuxfoundation.org> X-Mailer: git-send-email 2.56.0 In-Reply-To: <20261113153811.177190860@linuxfoundation.org> References: <20261113153811.177190860@linuxfoundation.org> User-Agent: quilt/0.69 X-stable: review X-Patchwork-Hint: ignore X-Mailing-List: patches@lists.linux.dev List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.12-stable review patch. If anyone has any objections, please let me know. ------------------ From: Hung-Jui Lin [ Upstream commit 141a27750ec3d91ad9d1ad1764ebb5e51b963478 ] SIGEV_NONE timers are never queued. common_timer_get() emulates their expiry by computing the remaining time from the stored expiry value. Because an armed SIGEV_NONE oneshot timer is not queued, its it_status stays POSIX_TIMER_DISARMED. So common_timer_get() cannot use it_status to skip a disarmed SIGEV_NONE timer and evaluates the stored expiry value for all SIGEV_NONE timers. Disarming a timer with timer_settime() and a zero it_value cancels the timer and sets it_status to POSIX_TIMER_DISARMED, but leaves the expiry value unchanged. As a consequence, timer_gettime() on a disarmed SIGEV_NONE timer reports the remaining time of the previous arming until that time has passed, instead of zero as POSIX requires for a disarmed timer. Example with a CLOCK_MONOTONIC timer armed with it_value = 10ms and it_interval = 100ms, then disarmed with an all-zero itimerspec: armed: it_value = 0.009999000 it_interval = 0.100000000 disarmed: it_value = 0.008700792 it_interval = 0.000000000 SIGEV_SIGNAL timers and SIGEV_NONE CPU timers report zero in the same situation. All clocks which use common_timer_get() are affected, including the alarm timer clocks. Mark SIGEV_NONE timers as POSIX_TIMER_ARMED when they are armed, so that common_timer_get() returns early for every disarmed timer. Forward SIGEV_NONE interval timers in common_timer_get() regardless of it_status, as they are never queued and therefore never forwarded by the expiry code. After the change the disarmed timer above reports zero. Armed SIGEV_NONE oneshot and interval timers on CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME and CLOCK_BOOTTIME_ALARM still report their remaining time, and the posix_timers selftest passes. Fixes: becf8b5d00f4 ("[PATCH] hrtimer: convert posix timers completely") Signed-off-by: Hung-Jui Lin Signed-off-by: Thomas Gleixner Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20261023151411.28685-1-alex.lin.programmer@gmail.com [ sashal: adapted timer state tracking from it_status to it_active using the existing void timer_arm() callback ] Signed-off-by: Sasha Levin --- kernel/time/posix-timers.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c index c5d9bfbb082b8..1e7f01c3daaa0 100644 --- a/kernel/time/posix-timers.c +++ b/kernel/time/posix-timers.c @@ -656,16 +656,8 @@ void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting) if (iv) { cur_setting->it_interval = ktime_to_timespec64(iv); } else if (!timr->it_active) { - /* - * SIGEV_NONE oneshot timers are never queued and therefore - * timr->it_active is always false. The check below - * vs. remaining time will handle this case. - * - * For all other timers there is nothing to update here, so - * return. - */ - if (!sig_none) - return; + /* Nothing to update for a disarmed timer */ + return; } now = kc->clock_get_ktime(timr->it_clock); @@ -916,7 +908,15 @@ int common_timer_set(struct k_itimer *timr, int flags, sigev_none = timr->it_sigev_notify == SIGEV_NONE; kc->timer_arm(timr, expires, flags & TIMER_ABSTIME, sigev_none); - timr->it_active = !sigev_none; + /* + * SIGEV_NONE timers are not queued, but mark them armed + * so that common_timer_get() can tell them apart from + * disarmed timers. An expired SIGEV_NONE timer stays + * armed, which is harmless: common_timer_get() reports + * zero remaining time for it and it never reaches the + * signal delivery code. + */ + timr->it_active = 1; return 0; } -- 2.53.0