From: K Prateek Nayak <kprateek.nayak@amd.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Gabriele Monaco <gmonaco@redhat.com>,
Sechang Lim <rhkrqnwk98@gmail.com>,
Ingo Molnar <mingo@redhat.com>,
Juri Lelli <juri.lelli@redhat.com>,
"Vincent Guittot" <vincent.guittot@linaro.org>,
Dietmar Eggemann <dietmar.eggemann@arm.com>,
Steven Rostedt <rostedt@goodmis.org>,
Ben Segall <bsegall@google.com>, Mel Gorman <mgorman@suse.de>,
Valentin Schneider <vschneid@redhat.com>,
<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2] sched: set TIF_NEED_RESCHED before calling __trace_set_need_resched()
Date: Wed, 1 Jul 2026 13:39:23 +0530 [thread overview]
Message-ID: <14abaec8-05ca-4034-b153-b993ed60a1fb@amd.com> (raw)
In-Reply-To: <20260701065447.GI48970@noisy.programming.kicks-ass.net>
Hello Peter,
On 7/1/2026 12:24 PM, Peter Zijlstra wrote:
>> @@ -1204,16 +1217,16 @@ static void __resched_curr(struct rq *rq, int tif)
>> cpu = cpu_of(rq);
>>
>> if (cpu == smp_processor_id()) {
>> - set_ti_thread_flag(cti, tif);
>> + int set = test_and_set_ti_thread_flag(cti, tif);
>> +
>> + if (trace_sched_set_need_resched_tp_enabled() && !set)
>> + trace_call__sched_set_need_resched_tp(curr, cpu, tif);
>> if (tif == TIF_NEED_RESCHED)
>> set_preempt_need_resched();
>> - trace_sched_set_need_resched_tp(curr, cpu, tif);
>> return;
>> }
>
> I can't help but notice that the local and !POLLING cases show
> remarkable similarity. Just not sure extracting that isn't going to make
> a mess.
>
> Anyway, yes this looks about right.
If the fetch_or() based path is okay for !POLLING and local cases which
uses a slightly (vastly?) worse instruction to set the ti->flags, we can
instead do:
(Lightly tested after removing "HAVE_TIF_POLLING_NRFLAG" for x86)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index bd2f7fb87dc93..ea793e8a94a8f 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -1029,6 +1029,15 @@ static inline void hrtick_schedule_enter(struct rq *rq) { }
static inline void hrtick_schedule_exit(struct rq *rq) { }
#endif /* !CONFIG_SCHED_HRTICK */
+#ifndef TIF_POLLING_NRFLAG
+/*
+ * If arch doesn't define _TIF_POLLING_NRFLAG, set it 0 to
+ * allow compilers to optimize (val & _TIF_POLLING_NRFLAG)
+ * based branches during build.
+ */
+#define _TIF_POLLING_NRFLAG 0U
+#endif
+
/*
* try_cmpxchg based fetch_or() macro so it works for different integer types:
*/
@@ -1043,7 +1052,6 @@ static inline void hrtick_schedule_exit(struct rq *rq) { }
_val; \
})
-#ifdef TIF_POLLING_NRFLAG
/*
* Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG,
* this avoids any races wrt polling state changes and thereby avoids
@@ -1083,25 +1091,6 @@ static bool set_nr_if_polling(struct task_struct *p)
return true;
}
-#else
-static inline bool set_nr_and_not_polling(struct rq *rq, int tif)
-{
- struct task_struct *curr = rq->curr;
- struct thread_info *ti = task_thread_info(curr);
- int set = test_and_set_ti_thread_flag(ti, tif);
-
- if (trace_sched_set_need_resched_tp_enabled() && !set)
- trace_call__sched_set_need_resched_tp(curr, cpu_of(rq), tif);
-
- return true;
-}
-
-static inline bool set_nr_if_polling(struct task_struct *p)
-{
- return false;
-}
-#endif
-
static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task)
{
struct wake_q_node *node = &task->wake_q;
@@ -1216,19 +1205,19 @@ static void __resched_curr(struct rq *rq, int tif)
cpu = cpu_of(rq);
- if (cpu == smp_processor_id()) {
- int set = test_and_set_ti_thread_flag(cti, tif);
-
- if (trace_sched_set_need_resched_tp_enabled() && !set)
- trace_call__sched_set_need_resched_tp(curr, cpu, tif);
- if (tif == TIF_NEED_RESCHED)
- set_preempt_need_resched();
- return;
- }
-
if (set_nr_and_not_polling(rq, tif)) {
- if (tif == TIF_NEED_RESCHED)
- smp_send_reschedule(cpu);
+ if (tif != TIF_NEED_RESCHED)
+ return;
+ /*
+ * For local CPU, folding the NEED_RESCHED
+ * into preempt_count() is sufficient.
+ */
+ if (cpu == smp_processor_id()) {
+ set_preempt_need_resched();
+ return;
+ }
+ /* Use an IPI for remote CPUs. */
+ smp_send_reschedule(cpu);
} else {
trace_sched_wake_idle_without_ipi(cpu);
}
---
set_nr_and_not_polling() will always return true for !POLLING which will
go down the above path in __resched_curr() that deals appropriately with
local CPU case.
set_nr_if_polling() will always return false for !POLLING from the first
condition in the do-while loop.
Thoughts?
--
Thanks and Regards,
Prateek
next prev parent reply other threads:[~2026-07-01 8:11 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-27 8:16 [PATCH v2] sched: set TIF_NEED_RESCHED before calling __trace_set_need_resched() Sechang Lim
2026-06-29 4:11 ` K Prateek Nayak
2026-06-29 12:40 ` Gabriele Monaco
2026-06-29 17:35 ` K Prateek Nayak
2026-06-30 8:58 ` Gabriele Monaco
2026-06-30 16:16 ` K Prateek Nayak
2026-06-30 20:34 ` Peter Zijlstra
2026-07-01 6:51 ` K Prateek Nayak
2026-07-01 6:54 ` Peter Zijlstra
2026-07-01 8:09 ` K Prateek Nayak [this message]
2026-07-01 8:49 ` Peter Zijlstra
2026-06-30 7:58 ` Sechang Lim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=14abaec8-05ca-4034-b153-b993ed60a1fb@amd.com \
--to=kprateek.nayak@amd.com \
--cc=bsegall@google.com \
--cc=dietmar.eggemann@arm.com \
--cc=gmonaco@redhat.com \
--cc=juri.lelli@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rhkrqnwk98@gmail.com \
--cc=rostedt@goodmis.org \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox