From 8d97fe0ceb34367714aa5c11110b5f0264eff130 Mon Sep 17 00:00:00 2001 From: Valentin Schneider Date: Wed, 9 Apr 2025 20:07:40 +0800 Subject: [PATCH 1/7] sched/fair: Add related data structure for task based throttle From: Valentin Schneider Add related data structures for this new throttle functionality. Signed-off-by: Valentin Schneider Signed-off-by: Aaron Lu Signed-off-by: Florian Bezdeka --- include/linux/sched.h | 4 ++++ kernel/sched/core.c | 3 +++ kernel/sched/fair.c | 12 ++++++++++++ kernel/sched/sched.h | 2 ++ 4 files changed, 21 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index 6e5c38718ff56..35a7b61300979 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -864,6 +864,10 @@ struct task_struct { #ifdef CONFIG_CGROUP_SCHED struct task_group *sched_task_group; +#ifdef CONFIG_CFS_BANDWIDTH + struct callback_head sched_throttle_work; + struct list_head throttle_node; +#endif #endif diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 3c7c942c7c429..c4bb3ad52ce3a 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4494,6 +4494,9 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) #ifdef CONFIG_FAIR_GROUP_SCHED p->se.cfs_rq = NULL; +#ifdef CONFIG_CFS_BANDWIDTH + init_cfs_throttle_work(p); +#endif #endif #ifdef CONFIG_SCHEDSTATS diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 89c7260103e18..d27dd55b65dc2 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5832,6 +5832,18 @@ static inline int throttled_lb_pair(struct task_group *tg, throttled_hierarchy(dest_cfs_rq); } +static void throttle_cfs_rq_work(struct callback_head *work) +{ +} + +void init_cfs_throttle_work(struct task_struct *p) +{ + init_task_work(&p->sched_throttle_work, throttle_cfs_rq_work); + /* Protect against double add, see throttle_cfs_rq() and throttle_cfs_rq_work() */ + p->sched_throttle_work.next = &p->sched_throttle_work; + INIT_LIST_HEAD(&p->throttle_node); +} + static int tg_unthrottle_up(struct task_group *tg, void *data) { struct rq *rq = data; diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 1aa65a0ac5864..81196d6888b66 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -2724,6 +2724,8 @@ extern bool sched_rt_bandwidth_account(struct rt_rq *rt_rq); extern void init_dl_entity(struct sched_dl_entity *dl_se); +extern void init_cfs_throttle_work(struct task_struct *p); + #define BW_SHIFT 20 #define BW_UNIT (1 << BW_SHIFT) #define RATIO_SHIFT 8 -- 2.39.5