{"id":2220424,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2220424/?format=json","web_url":"http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260407083247.763539663@kernel.org/","project":{"id":26,"url":"http://patchwork.ozlabs.org/api/1.1/projects/26/?format=json","name":"Netfilter Development","link_name":"netfilter-devel","list_id":"netfilter-devel.vger.kernel.org","list_email":"netfilter-devel@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260407083247.763539663@kernel.org>","date":"2026-04-07T08:54:33","name":"[04/12] posix-timers: Expand timer_[re]arm() callbacks with a boolean return value","commit_ref":null,"pull_url":null,"state":"accepted","archived":true,"hash":"8c8ee19d759ccf803e4b9ddb4d74015303304215","submitter":{"id":92397,"url":"http://patchwork.ozlabs.org/api/1.1/people/92397/?format=json","name":"Thomas Gleixner","email":"tglx@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260407083247.763539663@kernel.org/mbox/","series":[{"id":498944,"url":"http://patchwork.ozlabs.org/api/1.1/series/498944/?format=json","web_url":"http://patchwork.ozlabs.org/project/netfilter-devel/list/?series=498944","date":"2026-04-07T08:54:12","name":"hrtimers: Prevent hrtimer interrupt starvation","version":1,"mbox":"http://patchwork.ozlabs.org/series/498944/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2220424/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2220424/checks/","tags":{},"headers":{"Return-Path":"\n <netfilter-devel+bounces-11646-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","netfilter-devel@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=n1Bw8dCu;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.234.253.10; helo=sea.lore.kernel.org;\n envelope-from=netfilter-devel+bounces-11646-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"n1Bw8dCu\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fqg790rBzz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 07 Apr 2026 18:57:09 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 5428E3051C8B\n\tfor <incoming@patchwork.ozlabs.org>; Tue,  7 Apr 2026 08:54:39 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 6E2D939B4AB;\n\tTue,  7 Apr 2026 08:54:37 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id ECDC5399373;\n\tTue,  7 Apr 2026 08:54:36 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id CB8DAC116C6;\n\tTue,  7 Apr 2026 08:54:35 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1775552077; cv=none;\n b=HTs5eB+QsppEBKwGl9WPKn1sZZp7wQNbczAUaj7pGHDgniMtMzpLtr9GnWxOdkt4liw566vkp+4CBHTvsQjeCgPTIAMru/lOMm0rDlDatu0OKR6GCXV8qbVcbglcxViBFWab19puLu5C5PeI96/EGQmS5aW7/LBF3IdjgUnGnvo=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1775552077; c=relaxed/simple;\n\tbh=fg5QkEhmDz/cgOtfzkM/5WwK/iSkv+EmITv2kHMzaOY=;\n\th=Date:Message-ID:From:To:Cc:Subject:References:MIME-Version:\n\t Content-Type;\n b=gnx+XWee6OKtTWaXhupP6T3r8r/9jlMlDmulCkpII6Se8qFustNeRspyIc7GMVapkqkwQt3Hr4V2w05HCGVVOvdOy5uij6jasdTNc/m3lI7waDa5NMwftZHIeF/UT5SLIoJHAxWD7mUDut6x8l7KvdU1HvvNlqlxXHnHCzwigbU=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=n1Bw8dCu; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1775552076;\n\tbh=fg5QkEhmDz/cgOtfzkM/5WwK/iSkv+EmITv2kHMzaOY=;\n\th=Date:From:To:Cc:Subject:References:From;\n\tb=n1Bw8dCuEoUDyisTz3XSnH43hxiIt6uQzDP4A0CTwL3gjv/OjP42U5Nn1/lEbHnhV\n\t VAwYW71QUOM+CC+jXwtmtjaCbIHEq/EDPl9p1guC/lje5aUDLLVg8gPMLiCxOqIgk8\n\t Ghv8o06eH15s57o4hH6/+3QnwoD9dwphGCNM868VNLoTyZB+QuJ9sZ+OzG4alPnk4E\n\t HcUjY8qyWmFFMZutdVKN2PGfnhoLxD60GCjTnKguB4CkTf6PjN0cZCKlSY8wRA1ao+\n\t TXcvoZosP3BoQGHZhnXfeDylVhrXDH7IAOviVEUXFcB/wbkGhKBfQ9+kU8iO3M6YEn\n\t XfXA8XZaxNLGw==","Date":"Tue, 07 Apr 2026 10:54:33 +0200","Message-ID":"<20260407083247.763539663@kernel.org>","User-Agent":"quilt/0.68","From":"Thomas Gleixner <tglx@kernel.org>","To":"LKML <linux-kernel@vger.kernel.org>","Cc":"John Stultz <jstultz@google.com>,\n Stephen Boyd <sboyd@kernel.org>,\n Anna-Maria Behnsen <anna-maria@linutronix.de>,\n Frederic Weisbecker <frederic@kernel.org>,\n Calvin Owens <calvin@wbinvd.org>,\n Peter Zijlstra <peterz@infradead.org>,\n Ingo Molnar <mingo@kernel.org>,\n Alexander Viro <viro@zeniv.linux.org.uk>,\n Christian Brauner <brauner@kernel.org>,\n Jan Kara <jack@suse.cz>,\n linux-fsdevel@vger.kernel.org,\n Sebastian Reichel <sre@kernel.org>,\n linux-pm@vger.kernel.org,\n Pablo Neira Ayuso <pablo@netfilter.org>,\n Florian Westphal <fw@strlen.de>,\n Phil Sutter <phil@nwl.cc>,\n netfilter-devel@vger.kernel.org,\n coreteam@netfilter.org","Subject":"[patch 04/12] posix-timers: Expand timer_[re]arm() callbacks with a\n boolean return value","References":"<20260407083219.478203185@kernel.org>","Precedence":"bulk","X-Mailing-List":"netfilter-devel@vger.kernel.org","List-Id":"<netfilter-devel.vger.kernel.org>","List-Subscribe":"<mailto:netfilter-devel+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:netfilter-devel+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8"},"content":"In order to catch expiry times which are already in the past the\ntimer_arm() and timer_rearm() callbacks need to be able to report back to\nthe caller whether the timer has been queued or not.\n\nChange the function signature and let all implementations return true for\nnow. While at it simplify posix_cpu_timer_rearm().\n\nNo functional change intended.\n\nSigned-off-by: Thomas Gleixner <tglx@kernel.org>\nCc: John Stultz <jstultz@google.com>\nCc: Stephen Boyd <sboyd@kernel.org>\nCc: Anna-Maria Behnsen <anna-maria@linutronix.de>\nCc: Frederic Weisbecker <frederic@kernel.org>\n---\n kernel/time/alarmtimer.c       |    6 ++++--\n kernel/time/posix-cpu-timers.c |   18 ++++++++++--------\n kernel/time/posix-timers.c     |    6 ++++--\n kernel/time/posix-timers.h     |    4 ++--\n 4 files changed, 20 insertions(+), 14 deletions(-)","diff":"--- a/kernel/time/alarmtimer.c\n+++ b/kernel/time/alarmtimer.c\n@@ -523,12 +523,13 @@ static void alarm_handle_timer(struct al\n  * alarm_timer_rearm - Posix timer callback for rearming timer\n  * @timr:\tPointer to the posixtimer data struct\n  */\n-static void alarm_timer_rearm(struct k_itimer *timr)\n+static bool alarm_timer_rearm(struct k_itimer *timr)\n {\n \tstruct alarm *alarm = &timr->it.alarm.alarmtimer;\n \n \ttimr->it_overrun += alarm_forward_now(alarm, timr->it_interval);\n \talarm_start(alarm, alarm->node.expires);\n+\treturn true;\n }\n \n /**\n@@ -584,7 +585,7 @@ static void alarm_timer_wait_running(str\n  * @absolute:\tExpiry value is absolute time\n  * @sigev_none:\tPosix timer does not deliver signals\n  */\n-static void alarm_timer_arm(struct k_itimer *timr, ktime_t expires,\n+static bool alarm_timer_arm(struct k_itimer *timr, ktime_t expires,\n \t\t\t    bool absolute, bool sigev_none)\n {\n \tstruct alarm *alarm = &timr->it.alarm.alarmtimer;\n@@ -596,6 +597,7 @@ static void alarm_timer_arm(struct k_iti\n \t\talarm->node.expires = expires;\n \telse\n \t\talarm_start(&timr->it.alarm.alarmtimer, expires);\n+\treturn true;\n }\n \n /**\n--- a/kernel/time/posix-cpu-timers.c\n+++ b/kernel/time/posix-cpu-timers.c\n@@ -19,7 +19,7 @@\n \n #include \"posix-timers.h\"\n \n-static void posix_cpu_timer_rearm(struct k_itimer *timer);\n+static bool posix_cpu_timer_rearm(struct k_itimer *timer);\n \n void posix_cputimers_group_init(struct posix_cputimers *pct, u64 cpu_limit)\n {\n@@ -1011,24 +1011,27 @@ static void check_process_timers(struct\n /*\n  * This is called from the signal code (via posixtimer_rearm)\n  * when the last timer signal was delivered and we have to reload the timer.\n+ *\n+ * Return true unconditionally so the core code assumes the timer to be\n+ * armed. Otherwise it would requeue the signal.\n  */\n-static void posix_cpu_timer_rearm(struct k_itimer *timer)\n+static bool posix_cpu_timer_rearm(struct k_itimer *timer)\n {\n \tclockid_t clkid = CPUCLOCK_WHICH(timer->it_clock);\n-\tstruct task_struct *p;\n \tstruct sighand_struct *sighand;\n+\tstruct task_struct *p;\n \tunsigned long flags;\n \tu64 now;\n \n-\trcu_read_lock();\n+\tguard(rcu)();\n \tp = cpu_timer_task_rcu(timer);\n \tif (!p)\n-\t\tgoto out;\n+\t\treturn true;\n \n \t/* Protect timer list r/w in arm_timer() */\n \tsighand = lock_task_sighand(p, &flags);\n \tif (unlikely(sighand == NULL))\n-\t\tgoto out;\n+\t\treturn true;\n \n \t/*\n \t * Fetch the current sample and update the timer's expiry time.\n@@ -1045,8 +1048,7 @@ static void posix_cpu_timer_rearm(struct\n \t */\n \tarm_timer(timer, p);\n \tunlock_task_sighand(p, &flags);\n-out:\n-\trcu_read_unlock();\n+\treturn true;\n }\n \n /**\n--- a/kernel/time/posix-timers.c\n+++ b/kernel/time/posix-timers.c\n@@ -288,12 +288,13 @@ static inline int timer_overrun_to_int(s\n \treturn (int)timr->it_overrun_last;\n }\n \n-static void common_hrtimer_rearm(struct k_itimer *timr)\n+static bool common_hrtimer_rearm(struct k_itimer *timr)\n {\n \tstruct hrtimer *timer = &timr->it.real.timer;\n \n \ttimr->it_overrun += hrtimer_forward_now(timer, timr->it_interval);\n \thrtimer_restart(timer);\n+\treturn true;\n }\n \n static bool __posixtimer_deliver_signal(struct kernel_siginfo *info, struct k_itimer *timr)\n@@ -795,7 +796,7 @@ SYSCALL_DEFINE1(timer_getoverrun, timer_\n \t\treturn timer_overrun_to_int(scoped_timer);\n }\n \n-static void common_hrtimer_arm(struct k_itimer *timr, ktime_t expires,\n+static bool common_hrtimer_arm(struct k_itimer *timr, ktime_t expires,\n \t\t\t       bool absolute, bool sigev_none)\n {\n \tstruct hrtimer *timer = &timr->it.real.timer;\n@@ -822,6 +823,7 @@ static void common_hrtimer_arm(struct k_\n \n \tif (!sigev_none)\n \t\thrtimer_start_expires(timer, HRTIMER_MODE_ABS);\n+\treturn true;\n }\n \n static int common_hrtimer_try_to_cancel(struct k_itimer *timr)\n--- a/kernel/time/posix-timers.h\n+++ b/kernel/time/posix-timers.h\n@@ -27,11 +27,11 @@ struct k_clock {\n \tint\t(*timer_del)(struct k_itimer *timr);\n \tvoid\t(*timer_get)(struct k_itimer *timr,\n \t\t\t     struct itimerspec64 *cur_setting);\n-\tvoid\t(*timer_rearm)(struct k_itimer *timr);\n+\tbool\t(*timer_rearm)(struct k_itimer *timr);\n \ts64\t(*timer_forward)(struct k_itimer *timr, ktime_t now);\n \tktime_t\t(*timer_remaining)(struct k_itimer *timr, ktime_t now);\n \tint\t(*timer_try_to_cancel)(struct k_itimer *timr);\n-\tvoid\t(*timer_arm)(struct k_itimer *timr, ktime_t expires,\n+\tbool\t(*timer_arm)(struct k_itimer *timr, ktime_t expires,\n \t\t\t     bool absolute, bool sigev_none);\n \tvoid\t(*timer_wait_running)(struct k_itimer *timr);\n };\n","prefixes":["04/12"]}