mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	sched_ext, sched/core: Don't call scx_group_set_weight() prematurely from sched_create_group()
During task_group creation, sched_create_group() calls
scx_group_set_weight() with CGROUP_WEIGHT_DFL to initialize the sched_ext
portion. This is premature and ends up calling ops.cgroup_set_weight() with
an incorrect @cgrp before ops.cgroup_init() is called.
sched_create_group() should just initialize SCX related fields in the new
task_group. Fix it by factoring out scx_tg_init() from sched_init() and
making sched_create_group() call that function instead of
scx_group_set_weight().
v2: Retain CONFIG_EXT_GROUP_SCHED ifdef in sched_init() as removing it leads
    to build failures on !CONFIG_GROUP_SCHED configs.
Signed-off-by: Tejun Heo <tj@kernel.org>
Fixes: 8195136669 ("sched_ext: Add cgroup support")
Cc: stable@vger.kernel.org # v6.12+
			
			
This commit is contained in:
		
							parent
							
								
									c50784e99f
								
							
						
					
					
						commit
						33796b9187
					
				
					 3 changed files with 9 additions and 2 deletions
				
			
		|  | @ -8545,7 +8545,7 @@ void __init sched_init(void) | |||
| 		init_cfs_bandwidth(&root_task_group.cfs_bandwidth, NULL); | ||||
| #endif /* CONFIG_FAIR_GROUP_SCHED */ | ||||
| #ifdef CONFIG_EXT_GROUP_SCHED | ||||
| 		root_task_group.scx_weight = CGROUP_WEIGHT_DFL; | ||||
| 		scx_tg_init(&root_task_group); | ||||
| #endif /* CONFIG_EXT_GROUP_SCHED */ | ||||
| #ifdef CONFIG_RT_GROUP_SCHED | ||||
| 		root_task_group.rt_se = (struct sched_rt_entity **)ptr; | ||||
|  | @ -8985,7 +8985,7 @@ struct task_group *sched_create_group(struct task_group *parent) | |||
| 	if (!alloc_rt_sched_group(tg, parent)) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	scx_group_set_weight(tg, CGROUP_WEIGHT_DFL); | ||||
| 	scx_tg_init(tg); | ||||
| 	alloc_uclamp_sched_group(tg, parent); | ||||
| 
 | ||||
| 	return tg; | ||||
|  |  | |||
|  | @ -4092,6 +4092,11 @@ bool scx_can_stop_tick(struct rq *rq) | |||
| DEFINE_STATIC_PERCPU_RWSEM(scx_cgroup_rwsem); | ||||
| static bool scx_cgroup_enabled; | ||||
| 
 | ||||
| void scx_tg_init(struct task_group *tg) | ||||
| { | ||||
| 	tg->scx_weight = CGROUP_WEIGHT_DFL; | ||||
| } | ||||
| 
 | ||||
| int scx_tg_online(struct task_group *tg) | ||||
| { | ||||
| 	struct scx_sched *sch = scx_root; | ||||
|  |  | |||
|  | @ -79,6 +79,7 @@ static inline void scx_update_idle(struct rq *rq, bool idle, bool do_notify) {} | |||
| 
 | ||||
| #ifdef CONFIG_CGROUP_SCHED | ||||
| #ifdef CONFIG_EXT_GROUP_SCHED | ||||
| void scx_tg_init(struct task_group *tg); | ||||
| int scx_tg_online(struct task_group *tg); | ||||
| void scx_tg_offline(struct task_group *tg); | ||||
| int scx_cgroup_can_attach(struct cgroup_taskset *tset); | ||||
|  | @ -88,6 +89,7 @@ void scx_cgroup_cancel_attach(struct cgroup_taskset *tset); | |||
| void scx_group_set_weight(struct task_group *tg, unsigned long cgrp_weight); | ||||
| void scx_group_set_idle(struct task_group *tg, bool idle); | ||||
| #else	/* CONFIG_EXT_GROUP_SCHED */ | ||||
| static inline void scx_tg_init(struct task_group *tg) {} | ||||
| static inline int scx_tg_online(struct task_group *tg) { return 0; } | ||||
| static inline void scx_tg_offline(struct task_group *tg) {} | ||||
| static inline int scx_cgroup_can_attach(struct cgroup_taskset *tset) { return 0; } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tejun Heo
						Tejun Heo