From 3a7cc676fac0cea829f1664ef4a0cb9e0c9131c3 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 20 Jul 2023 15:53:58 +0200 Subject: [PATCH] MINOR: cpu-topo: add NUMA node identification to CPUs on FreeBSD With this patch we're also NUMA node IDs to each CPU when the info is found. The code is highly inspired from the one in commit f5d48f8b3 ("MEDIUM: cfgparse: numa detect topology on FreeBSD."), the difference being that we're just setting the value in ha_cpu_topo[]. --- src/cpu_topo.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/cpu_topo.c b/src/cpu_topo.c index 185f53505..90ae35d4d 100644 --- a/src/cpu_topo.c +++ b/src/cpu_topo.c @@ -417,7 +417,37 @@ int cpu_detect_topology(void) return 1; } -#else // __linux__ +#elif defined(__FreeBSD__) + +int cpu_detect_topology(void) +{ + struct hap_cpuset node_cpu_set; + int ndomains, domain, cpu; + size_t len = sizeof(ndomains); + + /* Try to detect NUMA nodes */ + if (sysctlbyname("vm.ndomains", &ndomains, &len, NULL, 0) == 0) { + BUG_ON(ndomains > MAXMEMDOM); + + /* For each domain we'll reference the domain ID in the belonging + * CPUs. + */ + for (domain = 0; domain < ndomains; domain++) { + ha_cpuset_zero(&node_cpu_set); + + if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_DOMAIN, domain, + sizeof(node_cpu_set.cpuset), &node_cpu_set.cpuset) == -1) + continue; + + for (cpu = 0; cpu < cpu_topo_maxcpus; cpu++) + if (ha_cpuset_isset(&node_cpu_set, cpu)) + ha_cpu_topo[cpu].no_id = domain; + } + } + return 1; +} + +#else // !__linux__, !__FreeBSD__ int cpu_detect_topology(void) {