]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
sched/core: Make select_task_rq() take the pointer to wake_flags instead of value
authorTejun Heo <tj@kernel.org>
Fri, 27 Sep 2024 23:46:11 +0000 (13:46 -1000)
committerTejun Heo <tj@kernel.org>
Mon, 7 Oct 2024 20:16:18 +0000 (10:16 -1000)
This will be used to allow select_task_rq() to indicate whether
->select_task_rq() was called by modifying *wake_flags.

This makes try_to_wake_up() call all functions that take wake_flags with
WF_TTWU set. Previously, only select_task_rq() was. Using the same flags is
more consistent, and, as the flag is only tested by ->select_task_rq()
implementations, it doesn't cause any behavior differences.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: David Vernet <void@manifault.com>
kernel/sched/core.c

index 43e453ab7e20f81ea239919af19ef20c5358c93d..e70b57a5693ecfec70818269c11b7083d6b3d829 100644 (file)
@@ -3518,12 +3518,12 @@ out:
  * The caller (fork, wakeup) owns p->pi_lock, ->cpus_ptr is stable.
  */
 static inline
-int select_task_rq(struct task_struct *p, int cpu, int wake_flags)
+int select_task_rq(struct task_struct *p, int cpu, int *wake_flags)
 {
        lockdep_assert_held(&p->pi_lock);
 
        if (p->nr_cpus_allowed > 1 && !is_migration_disabled(p))
-               cpu = p->sched_class->select_task_rq(p, cpu, wake_flags);
+               cpu = p->sched_class->select_task_rq(p, cpu, *wake_flags);
        else
                cpu = cpumask_any(p->cpus_ptr);
 
@@ -4120,6 +4120,8 @@ int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
        guard(preempt)();
        int cpu, success = 0;
 
+       wake_flags |= WF_TTWU;
+
        if (p == current) {
                /*
                 * We're waking current, this means 'p->on_rq' and 'task_cpu(p)
@@ -4252,7 +4254,7 @@ int try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
                 */
                smp_cond_load_acquire(&p->on_cpu, !VAL);
 
-               cpu = select_task_rq(p, p->wake_cpu, wake_flags | WF_TTWU);
+               cpu = select_task_rq(p, p->wake_cpu, &wake_flags);
                if (task_cpu(p) != cpu) {
                        if (p->in_iowait) {
                                delayacct_blkio_end(p);
@@ -4793,6 +4795,7 @@ void wake_up_new_task(struct task_struct *p)
 {
        struct rq_flags rf;
        struct rq *rq;
+       int wake_flags = WF_FORK;
 
        raw_spin_lock_irqsave(&p->pi_lock, rf.flags);
        WRITE_ONCE(p->__state, TASK_RUNNING);
@@ -4807,7 +4810,7 @@ void wake_up_new_task(struct task_struct *p)
         */
        p->recent_used_cpu = task_cpu(p);
        rseq_migrate(p);
-       __set_task_cpu(p, select_task_rq(p, task_cpu(p), WF_FORK));
+       __set_task_cpu(p, select_task_rq(p, task_cpu(p), &wake_flags));
 #endif
        rq = __task_rq_lock(p, &rf);
        update_rq_clock(rq);
@@ -4815,7 +4818,7 @@ void wake_up_new_task(struct task_struct *p)
 
        activate_task(rq, p, ENQUEUE_NOCLOCK | ENQUEUE_INITIAL);
        trace_sched_wakeup_new(p);
-       wakeup_preempt(rq, p, WF_FORK);
+       wakeup_preempt(rq, p, wake_flags);
 #ifdef CONFIG_SMP
        if (p->sched_class->task_woken) {
                /*