]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
sched_ext: Add SCX_EV_ENQ_SKIP_MIGRATION_DISABLED
authorTejun Heo <tj@kernel.org>
Sun, 9 Feb 2025 06:39:11 +0000 (20:39 -1000)
committerTejun Heo <tj@kernel.org>
Sun, 9 Feb 2025 06:39:11 +0000 (20:39 -1000)
Count the number of times a migration disabled task is automatically
dispatched to its local DSQ.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Changwoo Min <changwoo@igalia.com>
kernel/sched/ext.c

index 310db8484b7768918242c60efddfa26af6dd6acc..b2378e29f45aa47614ba477481ee87aa77cd53cc 100644 (file)
@@ -1483,6 +1483,13 @@ struct scx_event_stats {
         */
        u64             SCX_EV_ENQ_SKIP_EXITING;
 
+       /*
+        * If SCX_OPS_ENQ_MIGRATION_DISABLED is not set, the number of times a
+        * migration disabled task skips ops.enqueue() and is dispatched to its
+        * local DSQ.
+        */
+       u64             SCX_EV_ENQ_SKIP_MIGRATION_DISABLED;
+
        /*
         * The total number of tasks enqueued (or pick_task-ed) with a
         * default time slice (SCX_SLICE_DFL).
@@ -2119,8 +2126,10 @@ static void do_enqueue_task(struct rq *rq, struct task_struct *p, u64 enq_flags,
 
        /* see %SCX_OPS_ENQ_MIGRATION_DISABLED */
        if (!static_branch_unlikely(&scx_ops_enq_migration_disabled) &&
-           is_migration_disabled(p))
+           is_migration_disabled(p)) {
+               __scx_add_event(SCX_EV_ENQ_SKIP_MIGRATION_DISABLED, 1);
                goto local;
+       }
 
        if (!SCX_HAS_OP(enqueue))
                goto global;
@@ -5067,6 +5076,7 @@ static void scx_dump_state(struct scx_exit_info *ei, size_t dump_len)
        scx_dump_event(s, &events, SCX_EV_DISPATCH_LOCAL_DSQ_OFFLINE);
        scx_dump_event(s, &events, SCX_EV_DISPATCH_KEEP_LAST);
        scx_dump_event(s, &events, SCX_EV_ENQ_SKIP_EXITING);
+       scx_dump_event(s, &events, SCX_EV_ENQ_SKIP_MIGRATION_DISABLED);
        scx_dump_event(s, &events, SCX_EV_ENQ_SLICE_DFL);
        scx_dump_event(s, &events, SCX_EV_BYPASS_DURATION);
        scx_dump_event(s, &events, SCX_EV_BYPASS_DISPATCH);
@@ -7210,6 +7220,7 @@ __bpf_kfunc void scx_bpf_events(struct scx_event_stats *events,
                scx_agg_event(&e_sys, e_cpu, SCX_EV_DISPATCH_LOCAL_DSQ_OFFLINE);
                scx_agg_event(&e_sys, e_cpu, SCX_EV_DISPATCH_KEEP_LAST);
                scx_agg_event(&e_sys, e_cpu, SCX_EV_ENQ_SKIP_EXITING);
+               scx_agg_event(&e_sys, e_cpu, SCX_EV_ENQ_SKIP_MIGRATION_DISABLED);
                scx_agg_event(&e_sys, e_cpu, SCX_EV_ENQ_SLICE_DFL);
                scx_agg_event(&e_sys, e_cpu, SCX_EV_BYPASS_DURATION);
                scx_agg_event(&e_sys, e_cpu, SCX_EV_BYPASS_DISPATCH);