{"id":2220900,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2220900/?format=json","web_url":"http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260408114952.130222296@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":"<20260408114952.130222296@kernel.org>","date":"2026-04-08T11:53:56","name":"[V2,03/11] posix-timers: Expand timer_[re]arm() callbacks with a boolean return value","commit_ref":null,"pull_url":null,"state":"handled-elsewhere","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/20260408114952.130222296@kernel.org/mbox/","series":[{"id":499126,"url":"http://patchwork.ozlabs.org/api/1.1/series/499126/?format=json","web_url":"http://patchwork.ozlabs.org/project/netfilter-devel/list/?series=499126","date":"2026-04-08T11:53:41","name":"hrtimers: Prevent hrtimer interrupt starvation","version":2,"mbox":"http://patchwork.ozlabs.org/series/499126/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2220900/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2220900/checks/","tags":{},"headers":{"Return-Path":"\n <netfilter-devel+bounces-11716-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=USfOR16j;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=netfilter-devel+bounces-11716-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=\"USfOR16j\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4frM4S72Q5z1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 08 Apr 2026 21:57:12 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id A11C430BCB4E\n\tfor <incoming@patchwork.ozlabs.org>; Wed,  8 Apr 2026 11:54:25 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 2A8A93BE644;\n\tWed,  8 Apr 2026 11:54:01 +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 A249C3BE17C;\n\tWed,  8 Apr 2026 11:54:00 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id 7BA5FC19421;\n\tWed,  8 Apr 2026 11:53:59 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1775649240; cv=none;\n b=pFcyog3RCgDb9iYH2/J9sAwOlPVymzY9Hlvmxm55dg4s3mTaHjQdKTxuJzO7ox/p2KJqU0dNuQHenzxGb0fg0gcTexhnqjMLWCUg/aECXNhPS3D+PSjBMkR/GkAxm0gHHhO8r2Won159B7lfLp1rAXEnfsnEuV3rC5Dtv1mSgoI=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1775649240; c=relaxed/simple;\n\tbh=oEkNKRlMqQdHenWzq/XG7pKeJ9UvzaFKdXhbrVbFvYI=;\n\th=Date:Message-ID:From:To:Cc:Subject:References:MIME-Version:\n\t Content-Type;\n b=V1yQIXH9RUhqGdp8MSMsHyEeW4uCkRFEY78ZmmaT41MvNQJAZUcDns8V0GhKouUVmY3kkJ4tOGx8wutPOqW6CwqYPwuMqP+bynlsWPg62MOwtdtptFXUNywd/ZzfNCXBK3wActdvzjk2+1rLflaE3apRkaCz43gzKi/Zwr0IiWA=","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=USfOR16j; 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=1775649240;\n\tbh=oEkNKRlMqQdHenWzq/XG7pKeJ9UvzaFKdXhbrVbFvYI=;\n\th=Date:From:To:Cc:Subject:References:From;\n\tb=USfOR16jQhkS0mgICQgAfc4UwZX4zRHIG5sbx1xTTTU6ZAwFFQFOdTgGG5M3AJ21h\n\t k96QLHpArsD3PJ96pYpkZ9PA13mD5r7nMZMloDwFOqb8ueo2GNxjoJHCb8QHi0cZHl\n\t FmvL2nWfbMKYCrRxGgekMEzBjtJqRBiphlU0J6UtDi9XupjQXuanSHGNiJ2hzZKGFw\n\t 56tsvw3Y1qpqAxc4LAsLDAxBl6Xa5GgA+TgSMCTO5n387aYAPYE5xZDdMI4oFfWfGl\n\t wpllRYbHn3YTMCYdMq83mNBoTvSwVw1BHjG/yR6h1eaka3/fmNRiUMfhlzwv0BUPAm\n\t vU5s2vr6VyWRA==","Date":"Wed, 08 Apr 2026 13:53:56 +0200","Message-ID":"<20260408114952.130222296@kernel.org>","User-Agent":"quilt/0.68","From":"Thomas Gleixner <tglx@kernel.org>","To":"LKML <linux-kernel@vger.kernel.org>","Cc":"\"Peter Zijlstra (Intel)\" <peterz@infradead.org>,\n 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 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 V2 03/11] posix-timers: Expand timer_[re]arm() callbacks with\n a boolean return value","References":"<20260408102356.783133335@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>\nAcked-by: Peter Zijlstra (Intel) <peterz@infradead.org>\nAcked-by: 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---\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@@ -527,12 +527,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@@ -588,7 +589,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@@ -600,6 +601,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":["V2","03/11"]}