mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-26 22:23:08 +00:00
smp_topo: dynamically allocate group array
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
This commit is contained in:
parent
ccc6b87b38
commit
9801e7c275
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user