mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
sched_ext: Pass the initial cpu.idle state in scx_cgroup_init_args
scx_cgroup_init_args carries the initial weight and bandwidth control
parameters of a cgroup to ops.cgroup_init(), but not its cpu.idle
state. A cgroup that was already configured idle before the scheduler
was loaded (or before it was onlined under it) is presented as
non-idle, and the BPF scheduler only learns about it if cpu.idle is
written again later.
Add the sched_idle state to scx_cgroup_init_args and fill it in all
four places that build the args: scx_tg_online() for cgroups onlined
under the scheduler, scx_cgroup_init() for cgroups that already exist
when the scheduler is loaded, and the sub-scheduler handover paths
scx_cgroup_claim_subtree() and scx_cgroup_return_subtree().
Verified in a VM with a probe scheduler printing the init args: a
cgroup configured cpu.idle=1 before loading shows sched_idle=1 in
ops.cgroup_init(), the default shows 0, and later cpu.idle writes
still come through ops.cgroup_set_idle(). The sub-scheduler paths
are compile-tested only.
Fixes: 347ed2d566 ("sched/ext: Implement cgroup_set_idle() callback")
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
Reviewed-by: Andrea Righi <arighi@nvidia.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
068e5a0bc5
commit
93d88ac4a4
|
|
@ -4766,7 +4766,8 @@ int scx_tg_online(struct task_group *tg)
|
|||
{ .weight = tg->scx.weight,
|
||||
.bw_period_us = tg->scx.bw_period_us,
|
||||
.bw_quota_us = tg->scx.bw_quota_us,
|
||||
.bw_burst_us = tg->scx.bw_burst_us };
|
||||
.bw_burst_us = tg->scx.bw_burst_us,
|
||||
.sched_idle = tg->scx.idle };
|
||||
|
||||
ret = SCX_CALL_OP_RET(sch, cgroup_init,
|
||||
NULL, tg->css.cgroup, &args);
|
||||
|
|
@ -5187,6 +5188,7 @@ static int scx_cgroup_init(struct scx_sched *sch)
|
|||
.bw_period_us = tg->scx.bw_period_us,
|
||||
.bw_quota_us = tg->scx.bw_quota_us,
|
||||
.bw_burst_us = tg->scx.bw_burst_us,
|
||||
.sched_idle = tg->scx.idle,
|
||||
};
|
||||
|
||||
ret = SCX_CALL_OP_RET(sch, cgroup_init, NULL, css->cgroup, &args);
|
||||
|
|
|
|||
|
|
@ -259,6 +259,9 @@ struct scx_cgroup_init_args {
|
|||
u64 bw_period_us;
|
||||
u64 bw_quota_us;
|
||||
u64 bw_burst_us;
|
||||
|
||||
/* whether the cgroup is configured SCHED_IDLE via cpu.idle */
|
||||
bool sched_idle;
|
||||
};
|
||||
|
||||
enum scx_cpu_preempt_reason {
|
||||
|
|
|
|||
|
|
@ -1361,6 +1361,7 @@ static s32 scx_cgroup_claim_subtree(struct scx_sched *sch)
|
|||
.bw_period_us = tg->scx.bw_period_us,
|
||||
.bw_quota_us = tg->scx.bw_quota_us,
|
||||
.bw_burst_us = tg->scx.bw_burst_us,
|
||||
.sched_idle = tg->scx.idle,
|
||||
};
|
||||
|
||||
if (tg->scx.sched != parent ||
|
||||
|
|
@ -1464,6 +1465,7 @@ static void scx_cgroup_return_subtree(struct scx_sched *sch)
|
|||
.bw_period_us = tg->scx.bw_period_us,
|
||||
.bw_quota_us = tg->scx.bw_quota_us,
|
||||
.bw_burst_us = tg->scx.bw_burst_us,
|
||||
.sched_idle = tg->scx.idle,
|
||||
};
|
||||
|
||||
/* the first pass must have transferred everything */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user