1 /* SPDX-License-Identifier: GPL-2.0 */
3 * BPF extensible scheduler class: Documentation/scheduler/sched-ext.rst
5 * Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
6 * Copyright (c) 2022 Tejun Heo <tj@kernel.org>
7 * Copyright (c) 2022 David Vernet <dvernet@meta.com>
9 #ifdef CONFIG_SCHED_CLASS_EXT
11 void scx_tick(struct rq
*rq
);
12 void init_scx_entity(struct sched_ext_entity
*scx
);
13 void scx_pre_fork(struct task_struct
*p
);
14 int scx_fork(struct task_struct
*p
);
15 void scx_post_fork(struct task_struct
*p
);
16 void scx_cancel_fork(struct task_struct
*p
);
17 bool scx_can_stop_tick(struct rq
*rq
);
18 void scx_rq_activate(struct rq
*rq
);
19 void scx_rq_deactivate(struct rq
*rq
);
20 int scx_check_setscheduler(struct task_struct
*p
, int policy
);
21 bool task_should_scx(struct task_struct
*p
);
22 void init_sched_ext_class(void);
24 static inline u32
scx_cpuperf_target(s32 cpu
)
27 return cpu_rq(cpu
)->scx
.cpuperf_target
;
32 static inline bool task_on_scx(const struct task_struct
*p
)
34 return scx_enabled() && p
->sched_class
== &ext_sched_class
;
37 #ifdef CONFIG_SCHED_CORE
38 bool scx_prio_less(const struct task_struct
*a
, const struct task_struct
*b
,
42 #else /* CONFIG_SCHED_CLASS_EXT */
44 static inline void scx_tick(struct rq
*rq
) {}
45 static inline void scx_pre_fork(struct task_struct
*p
) {}
46 static inline int scx_fork(struct task_struct
*p
) { return 0; }
47 static inline void scx_post_fork(struct task_struct
*p
) {}
48 static inline void scx_cancel_fork(struct task_struct
*p
) {}
49 static inline u32
scx_cpuperf_target(s32 cpu
) { return 0; }
50 static inline bool scx_can_stop_tick(struct rq
*rq
) { return true; }
51 static inline void scx_rq_activate(struct rq
*rq
) {}
52 static inline void scx_rq_deactivate(struct rq
*rq
) {}
53 static inline int scx_check_setscheduler(struct task_struct
*p
, int policy
) { return 0; }
54 static inline bool task_on_scx(const struct task_struct
*p
) { return false; }
55 static inline void init_sched_ext_class(void) {}
57 #endif /* CONFIG_SCHED_CLASS_EXT */
59 #if defined(CONFIG_SCHED_CLASS_EXT) && defined(CONFIG_SMP)
60 void __scx_update_idle(struct rq
*rq
, bool idle
);
62 static inline void scx_update_idle(struct rq
*rq
, bool idle
)
65 __scx_update_idle(rq
, idle
);
68 static inline void scx_update_idle(struct rq
*rq
, bool idle
) {}
71 #ifdef CONFIG_CGROUP_SCHED
72 #ifdef CONFIG_EXT_GROUP_SCHED
73 int scx_tg_online(struct task_group
*tg
);
74 void scx_tg_offline(struct task_group
*tg
);
75 int scx_cgroup_can_attach(struct cgroup_taskset
*tset
);
76 void scx_move_task(struct task_struct
*p
);
77 void scx_cgroup_finish_attach(void);
78 void scx_cgroup_cancel_attach(struct cgroup_taskset
*tset
);
79 void scx_group_set_weight(struct task_group
*tg
, unsigned long cgrp_weight
);
80 void scx_group_set_idle(struct task_group
*tg
, bool idle
);
81 #else /* CONFIG_EXT_GROUP_SCHED */
82 static inline int scx_tg_online(struct task_group
*tg
) { return 0; }
83 static inline void scx_tg_offline(struct task_group
*tg
) {}
84 static inline int scx_cgroup_can_attach(struct cgroup_taskset
*tset
) { return 0; }
85 static inline void scx_move_task(struct task_struct
*p
) {}
86 static inline void scx_cgroup_finish_attach(void) {}
87 static inline void scx_cgroup_cancel_attach(struct cgroup_taskset
*tset
) {}
88 static inline void scx_group_set_weight(struct task_group
*tg
, unsigned long cgrp_weight
) {}
89 static inline void scx_group_set_idle(struct task_group
*tg
, bool idle
) {}
90 #endif /* CONFIG_EXT_GROUP_SCHED */
91 #endif /* CONFIG_CGROUP_SCHED */