Re: [PATCH 03/15] sched_ext: Factor out pnode allocation and deallocation into helpers
From: Emil Tsalapatis
Date: Fri Mar 06 2026 - 15:54:48 EST
On Fri Mar 6, 2026 at 2:06 PM EST, Tejun Heo wrote:
> Extract pnode allocation and deallocation logic into alloc_pnode() and
> free_pnode() helpers. This simplifies scx_alloc_and_add_sched() and prepares
> for adding more per-node initialization and cleanup in subsequent patches.
>
> No functional changes.
>
> Signed-off-by: Tejun Heo <tj@xxxxxxxxxx>
Reviewed-by: Emil Tsalapatis <emil@xxxxxxxxxxxxxxx>
> ---
> kernel/sched/ext.c | 32 +++++++++++++++++++++++---------
> 1 file changed, 23 insertions(+), 9 deletions(-)
>
> diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
> index 9232abea4f22..c36d399bca3e 100644
> --- a/kernel/sched/ext.c
> +++ b/kernel/sched/ext.c
> @@ -4114,6 +4114,7 @@ static const struct attribute_group scx_global_attr_group = {
> .attrs = scx_global_attrs,
> };
>
> +static void free_pnode(struct scx_sched_pnode *pnode);
> static void free_exit_info(struct scx_exit_info *ei);
>
> static void scx_sched_free_rcu_work(struct work_struct *work)
> @@ -4148,7 +4149,7 @@ static void scx_sched_free_rcu_work(struct work_struct *work)
> free_percpu(sch->pcpu);
>
> for_each_node_state(node, N_POSSIBLE)
> - kfree(sch->pnode[node]);
> + free_pnode(sch->pnode[node]);
> kfree(sch->pnode);
>
> rhashtable_walk_enter(&sch->dsq_hash, &rht_iter);
> @@ -5685,6 +5686,24 @@ static int alloc_kick_syncs(void)
> return 0;
> }
>
> +static void free_pnode(struct scx_sched_pnode *pnode)
> +{
> + kfree(pnode);
> +}
> +
> +static struct scx_sched_pnode *alloc_pnode(struct scx_sched *sch, int node)
> +{
> + struct scx_sched_pnode *pnode;
> +
> + pnode = kzalloc_node(sizeof(*pnode), GFP_KERNEL, node);
> + if (!pnode)
> + return NULL;
> +
> + init_dsq(&pnode->global_dsq, SCX_DSQ_GLOBAL, sch);
> +
> + return pnode;
> +}
> +
> static struct scx_sched *scx_alloc_and_add_sched(struct sched_ext_ops *ops,
> struct cgroup *cgrp,
> struct scx_sched *parent)
> @@ -5714,16 +5733,11 @@ static struct scx_sched *scx_alloc_and_add_sched(struct sched_ext_ops *ops,
> }
>
> for_each_node_state(node, N_POSSIBLE) {
> - struct scx_sched_pnode *pnode;
> -
> - pnode = kzalloc_node(sizeof(*pnode), GFP_KERNEL, node);
> - if (!pnode) {
> + sch->pnode[node] = alloc_pnode(sch, node);
> + if (!sch->pnode[node]) {
> ret = -ENOMEM;
> goto err_free_pnode;
> }
> -
> - init_dsq(&pnode->global_dsq, SCX_DSQ_GLOBAL, sch);
> - sch->pnode[node] = pnode;
> }
>
> sch->dsp_max_batch = ops->dispatch_max_batch ?: SCX_DSP_DFL_MAX_BATCH;
> @@ -5821,7 +5835,7 @@ static struct scx_sched *scx_alloc_and_add_sched(struct sched_ext_ops *ops,
> free_percpu(sch->pcpu);
> err_free_pnode:
> for_each_node_state(node, N_POSSIBLE)
> - kfree(sch->pnode[node]);
> + free_pnode(sch->pnode[node]);
> kfree(sch->pnode);
> err_free_hash:
> rhashtable_free_and_destroy(&sch->dsq_hash, NULL, NULL);