Skip to content

Commit f207dc2

Browse files
committed
sched/core: Add ENQUEUE_RQ_SELECTED to indicate whether ->select_task_rq() was called
During ttwu, ->select_task_rq() can be skipped if only one CPU is allowed or migration is disabled. sched_ext schedulers may perform operations such as direct dispatch from ->select_task_rq() path and it is useful for them to know whether ->select_task_rq() was skipped in the ->enqueue_task() path. Currently, sched_ext schedulers are using ENQUEUE_WAKEUP for this purpose and end up assuming incorrectly that ->select_task_rq() was called for tasks that are bound to a single CPU or migration disabled. Make select_task_rq() indicate whether ->select_task_rq() was called by setting WF_RQ_SELECTED in *wake_flags and make ttwu_do_activate() map that to ENQUEUE_RQ_SELECTED for ->enqueue_task(). This will be used by sched_ext to fix ->select_task_rq() skip detection. Signed-off-by: Tejun Heo <[email protected]> Acked-by: David Vernet <[email protected]>
1 parent b62933e commit f207dc2

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

kernel/sched/core.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3522,10 +3522,12 @@ int select_task_rq(struct task_struct *p, int cpu, int *wake_flags)
35223522
{
35233523
lockdep_assert_held(&p->pi_lock);
35243524

3525-
if (p->nr_cpus_allowed > 1 && !is_migration_disabled(p))
3525+
if (p->nr_cpus_allowed > 1 && !is_migration_disabled(p)) {
35263526
cpu = p->sched_class->select_task_rq(p, cpu, *wake_flags);
3527-
else
3527+
*wake_flags |= WF_RQ_SELECTED;
3528+
} else {
35283529
cpu = cpumask_any(p->cpus_ptr);
3530+
}
35293531

35303532
/*
35313533
* In order not to call set_task_cpu() on a blocking task we need
@@ -3659,6 +3661,8 @@ ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags,
36593661
rq->nr_uninterruptible--;
36603662

36613663
#ifdef CONFIG_SMP
3664+
if (wake_flags & WF_RQ_SELECTED)
3665+
en_flags |= ENQUEUE_RQ_SELECTED;
36623666
if (wake_flags & WF_MIGRATED)
36633667
en_flags |= ENQUEUE_MIGRATED;
36643668
else

kernel/sched/sched.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,6 +2292,7 @@ static inline int task_on_rq_migrating(struct task_struct *p)
22922292
#define WF_SYNC 0x10 /* Waker goes to sleep after wakeup */
22932293
#define WF_MIGRATED 0x20 /* Internal use, task got migrated */
22942294
#define WF_CURRENT_CPU 0x40 /* Prefer to move the wakee to the current CPU. */
2295+
#define WF_RQ_SELECTED 0x80 /* ->select_task_rq() was called */
22952296

22962297
#ifdef CONFIG_SMP
22972298
static_assert(WF_EXEC == SD_BALANCE_EXEC);
@@ -2334,6 +2335,7 @@ extern const u32 sched_prio_to_wmult[40];
23342335
* ENQUEUE_HEAD - place at front of runqueue (tail if not specified)
23352336
* ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline)
23362337
* ENQUEUE_MIGRATED - the task was migrated during wakeup
2338+
* ENQUEUE_RQ_SELECTED - ->select_task_rq() was called
23372339
*
23382340
*/
23392341

@@ -2360,6 +2362,7 @@ extern const u32 sched_prio_to_wmult[40];
23602362
#define ENQUEUE_INITIAL 0x80
23612363
#define ENQUEUE_MIGRATING 0x100
23622364
#define ENQUEUE_DELAYED 0x200
2365+
#define ENQUEUE_RQ_SELECTED 0x400
23632366

23642367
#define RETRY_TASK ((void *)-1UL)
23652368

0 commit comments

Comments
 (0)