The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH v2] sched/topology: Free NUMA masks on topology allocation failure
@ 2026-08-12  6:22 Fengyu Wang
  2026-08-12 19:51 ` Tim Chen
  0 siblings, 1 reply; 2+ messages in thread
From: Fengyu Wang @ 2026-08-12  6:22 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra, Juri Lelli, Vincent Guittot
  Cc: Dietmar Eggemann, Steven Rostedt, Ben Segall, Mel Gorman,
	Valentin Schneider, K Prateek Nayak, Chen Yu, Tim Chen,
	Shrikanth Hegde, linux-kernel, wujianyong, zhongyuan, huangshijie,
	wangfengyu

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.

Free the masks on that path, and publish them only once the topology
array they were built for has been allocated.

Fixes: cb83b629bae0 ("sched/numa: Rewrite the CONFIG_NUMA sched domain support")
Signed-off-by: Fengyu Wang <wangfengyu@hygon.cn>
---
v2:
 - Publish sched_domains_numa_masks only after the topology array has
   been allocated, instead of publishing it early and unpublishing it
   on the failure path.  This drops the rcu_assign_pointer(NULL) and
   the synchronize_rcu() from the error path (Tim Chen).

v1: https://lore.kernel.org/lkml/20260731081413.5505-1-wangfengyu@hygon.cn/

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 | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 21e816ad23ee..50457f720808 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -2392,15 +2392,23 @@ void sched_init_numa(int offline_node)
 			}
 		}
 	}
-	rcu_assign_pointer(sched_domains_numa_masks, masks);
 
 	/* Compute default topology size */
 	for (i = 0; sched_domain_topology[i].mask; i++);
 
 	tl = kzalloc((i + nr_levels + 1) *
 			sizeof(struct sched_domain_topology_level), GFP_KERNEL);
-	if (!tl)
+	if (!tl) {
+		for (i = 0; i < nr_levels; i++) {
+			for_each_node(j)
+				kfree(masks[i][j]);
+			kfree(masks[i]);
+		}
+		kfree(masks);
 		return;
+	}
+
+	rcu_assign_pointer(sched_domains_numa_masks, masks);
 
 	/*
 	 * Copy the default topology bits..
-- 
2.34.1



^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-08-12 19:51 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-12  6:22 [PATCH v2] sched/topology: Free NUMA masks on topology allocation failure Fengyu Wang
2026-08-12 19:51 ` Tim Chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox