回复: [PATCH] sched/topology: Free NUMA mas ks on topology allocation failure

Fengyu Wang <[email protected]>
Newsgroups gmane.linux.kernel
Message-ID <[email protected]>
Agreed, that's simpler.  V2 will move the rcu_assign_pointer() below the tl check.

Thanks.
Fengyu Wang 
 
-----邮件原件-----
发件人: Tim Chen <[email protected]> 
发送时间: 2026年8月4日 9:15
收件人: Fengyu Wang <[email protected]>; Ingo Molnar <[email protected]>; Peter Zijlstra <[email protected]>; Juri Lelli <[email protected]>; Vincent Guittot <[email protected]>
抄送: Dietmar Eggemann <[email protected]>; Steven Rostedt <[email protected]>; Ben Segall <[email protected]>; Mel Gorman <[email protected]>; Valentin Schneider <[email protected]>; K Prateek Nayak <[email protected]>; Chen Yu <[email protected]>; Shrikanth Hegde <[email protected]>; [email protected]; Jianyong Wu <[email protected]>; Yuan Zhong <[email protected]>; Huangsj <[email protected]>
主题: Re: [PATCH] sched/topology: Free NUMA masks on topology allocation failure

On Fri, 2026-07-31 at 16:14 +0800, Fengyu Wang wrote:
> sched_init_numa() publishes sched_domains_numa_masks before it 
> allocates the topology array.  When that allocation fails, the early 
> return leaves the masks published while sched_domains_numa_levels is 
> still zero: nothing dereferences them, but nothing can free them 
> either, and the topology they were built for is never installed.
> Unpublish and free them instead.
> 
> Fixes: cb83b629bae0 ("sched/numa: Rewrite the CONFIG_NUMA sched domain 
> support")
> Signed-off-by: Fengyu Wang <[email protected]>
> ---
> Tested by hardcoding tl to NULL right after the kzalloc() to force the 
> failure path; the masks are released and the machine boots normally.
> 
>  kernel/sched/topology.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index 
> 622e2e01974c..208fdc52f52d 100644
> --- a/kernel/sched/topology.c
> +++ b/kernel/sched/topology.c
> @@ -2403,8 +2403,17 @@ void sched_init_numa(int offline_node)
>  
>  	tl = kzalloc((i + nr_levels + 1) *
>  			sizeof(struct sched_domain_topology_level), GFP_KERNEL);
> -	if (!tl)
> +	if (!tl) {
> +		rcu_assign_pointer(sched_domains_numa_masks, NULL);
> +		synchronize_rcu();
> +		for (i = 0; i < nr_levels; i++) {
> +			for_each_node(j)
> +				kfree(masks[i][j]);
> +			kfree(masks[i]);
> +		}
> +		kfree(masks);
>  		return;
> +	}

The code is cleaner without the synchronize_rcu() and set to null dance if we do rcu_assign_pointer(sched_domains_numa_masks, masks); after the tl check.

Thanks.

Tim

>  
>  	/*
>  	 * Copy the default topology bits..
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.