When switching between fair and sched_ext, we need to initialize the bandwidth contribution of the DL server independently for each class. Add support for on-demand initialization to handle such transitions. Signed-off-by: Andrea Righi <arighi@xxxxxxxxxx> --- kernel/sched/deadline.c | 36 +++++++++++++++++++++++++++++------- kernel/sched/sched.h | 1 + 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 165b12553e10d..b744187ec6372 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c @@ -1583,6 +1583,32 @@ void dl_server_update(struct sched_dl_entity *dl_se, s64 delta_exec) } } +/** + * dl_server_init_params - Initialize bandwidth reservation for a DL server + * @dl_se: The DL server entity to remove bandwidth for + * + * This function initializes the bandwidth reservation for a DL server + * entity, its bandwidth accounting and server state. + * + * Returns: 0 on success, negative error code on failure + */ +int dl_server_init_params(struct sched_dl_entity *dl_se) +{ + u64 runtime = 50 * NSEC_PER_MSEC; + u64 period = 1000 * NSEC_PER_MSEC; + int err; + + err = dl_server_apply_params(dl_se, runtime, period, 1); + if (err) + return err; + + dl_se->dl_server = 1; + dl_se->dl_defer = 1; + setup_new_dl_entity(dl_se); + + return err; +} + void dl_server_start(struct sched_dl_entity *dl_se) { struct rq *rq = dl_se->rq; @@ -1638,8 +1664,7 @@ void sched_init_dl_servers(void) struct sched_dl_entity *dl_se; for_each_online_cpu(cpu) { - u64 runtime = 50 * NSEC_PER_MSEC; - u64 period = 1000 * NSEC_PER_MSEC; + int err; rq = cpu_rq(cpu); @@ -1649,11 +1674,8 @@ void sched_init_dl_servers(void) WARN_ON(dl_server(dl_se)); - dl_server_apply_params(dl_se, runtime, period, 1); - - dl_se->dl_server = 1; - dl_se->dl_defer = 1; - setup_new_dl_entity(dl_se); + err = dl_server_init_params(dl_se); + WARN_ON_ONCE(err); } } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 928874ab9b2db..1fbf4ffbcb208 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -395,6 +395,7 @@ extern void ext_server_init(struct rq *rq); extern void __dl_server_attach_root(struct sched_dl_entity *dl_se, struct rq *rq); extern int dl_server_apply_params(struct sched_dl_entity *dl_se, u64 runtime, u64 period, bool init); +extern int dl_server_init_params(struct sched_dl_entity *dl_se); extern int dl_server_remove_params(struct sched_dl_entity *dl_se); static inline bool dl_server_active(struct sched_dl_entity *dl_se) -- 2.51.0