Skip to content

Commit

Permalink
smp_topo: dynamically allocate group array
Browse files Browse the repository at this point in the history
Limit its size to mp_maxid + 1 times MAX_CACHE_LEVELS instead MAXCPU.
Allocate the array on a first call into smp_topo(9) functions, where
the mp_maxid is already known.

Make the array private to smp_topo_alloc(), assuming that the callers
that allocate top-level group do it once.

Reviewed by:	markj
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D39981
  • Loading branch information
kostikbel committed May 9, 2023
1 parent ccc6b87 commit 9801e7c
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions sys/kern/subr_smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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]);
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit 9801e7c

Please sign in to comment.