git: 5fdd2bfef42c - stable/13 - smp_topo: dynamically allocate group array
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 16 May 2023 04:11:01 UTC
The branch stable/13 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=5fdd2bfef42c4bae197c56051c2066e499c43e4d commit 5fdd2bfef42c4bae197c56051c2066e499c43e4d Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2023-05-05 20:24:22 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2023-05-16 04:03:37 +0000 smp_topo: dynamically allocate group array (cherry picked from commit 9801e7c275f6ec42a44b98a2e2e1a8ac4674a096) --- sys/kern/subr_smp.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sys/kern/subr_smp.c b/sys/kern/subr_smp.c index 401d54277669..0ecc13251632 100644 --- a/sys/kern/subr_smp.c +++ b/sys/kern/subr_smp.c @@ -630,8 +630,6 @@ smp_rendezvous(void (* setup_func)(void *), smp_rendezvous_cpus(all_cpus, setup_func, action_func, teardown_func, arg); } -static struct cpu_group group[MAXCPU * MAX_CACHE_LEVELS + 1]; - static void smp_topo_fill(struct cpu_group *cg) { @@ -713,9 +711,14 @@ smp_topo(void) struct cpu_group * smp_topo_alloc(u_int count) { + static struct cpu_group *group = NULL; static u_int index; u_int curr; + if (group == NULL) { + group = mallocarray((mp_maxid + 1) * MAX_CACHE_LEVELS + 1, + sizeof(*group), M_DEVBUF, M_WAITOK | M_ZERO); + } curr = index; index += count; return (&group[curr]); @@ -726,7 +729,7 @@ smp_topo_none(void) { struct cpu_group *top; - top = &group[0]; + top = smp_topo_alloc(1); top->cg_parent = NULL; top->cg_child = NULL; top->cg_mask = all_cpus; @@ -780,9 +783,9 @@ smp_topo_1level(int share, int count, int flags) int i; cpu = 0; - top = &group[0]; + top = smp_topo_alloc(1); packages = mp_ncpus / count; - top->cg_child = child = &group[1]; + top->cg_child = child = top + 1; top->cg_level = CG_SHARE_NONE; for (i = 0; i < packages; i++, child++) cpu = smp_topo_addleaf(top, child, share, count, flags, cpu); @@ -801,8 +804,8 @@ smp_topo_2level(int l2share, int l2count, int l1share, int l1count, int j; cpu = 0; - top = &group[0]; - l2g = &group[1]; + top = smp_topo_alloc(1); + l2g = top + 1; top->cg_child = l2g; top->cg_level = CG_SHARE_NONE; top->cg_children = mp_ncpus / (l2count * l1count);