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);