]> www.infradead.org Git - users/willy/xarray.git/commitdiff
sched_ext: Remove scx_ops_allow_queued_wakeup static_key
authorTejun Heo <tj@kernel.org>
Wed, 9 Apr 2025 19:06:00 +0000 (09:06 -1000)
committerTejun Heo <tj@kernel.org>
Wed, 9 Apr 2025 19:06:00 +0000 (09:06 -1000)
scx_ops_allow_queued_wakeup is used to encode SCX_OPS_ALLOW_QUEUED_WAKEUP
into a static_key. The test is gated behind scx_enabled(), and, even when
sched_ext is enabled, is unlikely for the static_key usage to make any
meaningful difference. It is made to use a static_key mostly because there
was no reason not to. However, global static_keys can't work with the
planned hierarchical multiple scheduler support. Remove the static_key and
instead test SCX_OPS_ALLOW_QUEUED_WAKEUP directly.

In repeated hackbench runs before and after static_keys removal on an AMD
Ryzen 3900X, I couldn't tell any measurable performance difference.

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

index 1adf5c299ccee6c1dececc9332df7a402d498513..f0ed0cec4c98c3900928a9d00a57574399bb26e1 100644 (file)
@@ -928,8 +928,6 @@ DEFINE_STATIC_KEY_FALSE(__scx_switched_all);
 static struct sched_ext_ops scx_ops;
 static bool scx_warned_zero_slice;
 
-DEFINE_STATIC_KEY_FALSE(scx_ops_allow_queued_wakeup);
-
 static struct static_key_false scx_has_op[SCX_OPI_END] =
        { [0 ... SCX_OPI_END-1] = STATIC_KEY_FALSE_INIT };
 
@@ -4414,6 +4412,13 @@ bool task_should_scx(int policy)
        return policy == SCHED_EXT;
 }
 
+bool scx_allow_ttwu_queue(const struct task_struct *p)
+{
+       return !scx_enabled() ||
+               (scx_ops.flags & SCX_OPS_ALLOW_QUEUED_WAKEUP) ||
+               p->sched_class != &ext_sched_class;
+}
+
 /**
  * scx_softlockup - sched_ext softlockup handler
  * @dur_s: number of seconds of CPU stuck due to soft lockup
@@ -4728,7 +4733,6 @@ static void scx_disable_workfn(struct kthread_work *work)
        static_branch_disable(&__scx_enabled);
        for (i = SCX_OPI_BEGIN; i < SCX_OPI_END; i++)
                static_branch_disable(&scx_has_op[i]);
-       static_branch_disable(&scx_ops_allow_queued_wakeup);
        scx_idle_disable();
        synchronize_rcu();
 
@@ -5367,8 +5371,6 @@ static int scx_enable(struct sched_ext_ops *ops, struct bpf_link *link)
                if (((void (**)(void))ops)[i])
                        static_branch_enable(&scx_has_op[i]);
 
-       if (ops->flags & SCX_OPS_ALLOW_QUEUED_WAKEUP)
-               static_branch_enable(&scx_ops_allow_queued_wakeup);
        if (scx_ops.cpu_acquire || scx_ops.cpu_release)
                scx_ops.flags |= SCX_OPS_HAS_CPU_PREEMPT;
 
index 1bda96b19a1bf6015db4cf099b0846d8fcd1c85a..3053cdd61eb9c22befb3d6c42eefb91bf4670743 100644 (file)
@@ -21,6 +21,7 @@ void scx_rq_activate(struct rq *rq);
 void scx_rq_deactivate(struct rq *rq);
 int scx_check_setscheduler(struct task_struct *p, int policy);
 bool task_should_scx(int policy);
+bool scx_allow_ttwu_queue(const struct task_struct *p);
 void init_sched_ext_class(void);
 
 static inline u32 scx_cpuperf_target(s32 cpu)
@@ -36,13 +37,6 @@ static inline bool task_on_scx(const struct task_struct *p)
        return scx_enabled() && p->sched_class == &ext_sched_class;
 }
 
-static inline bool scx_allow_ttwu_queue(const struct task_struct *p)
-{
-       return !scx_enabled() ||
-               static_branch_likely(&scx_ops_allow_queued_wakeup) ||
-               p->sched_class != &ext_sched_class;
-}
-
 #ifdef CONFIG_SCHED_CORE
 bool scx_prio_less(const struct task_struct *a, const struct task_struct *b,
                   bool in_fi);