Page MenuHomeFreeBSD

D32338.diff
No OneTemporary

D32338.diff

diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -102,7 +102,12 @@
enum arm64_bus arm64_bus_method = ARM64_BUS_NONE;
-struct pcpu __pcpu[MAXCPU];
+/*
+ * XXX: The .bss is assumed to be in the boot CPU NUMA domain. If not we
+ * could relocate this, but will need to keep the same virtual address as
+ * it's reverenced by the EARLY_COUNTER macro.
+ */
+struct pcpu pcpu0;
static struct trapframe proc0_tf;
@@ -334,7 +339,10 @@
static void
init_proc0(vm_offset_t kstack)
{
- struct pcpu *pcpup = &__pcpu[0];
+ struct pcpu *pcpup;
+
+ pcpup = cpuid_to_pcpu[0];
+ MPASS(pcpup != NULL);
proc_linkup0(&proc0, &thread0);
thread0.td_kstack = kstack;
@@ -762,7 +770,7 @@
EXFLAG_NOALLOC);
/* Set the pcpu data, this is needed by pmap_bootstrap */
- pcpup = &__pcpu[0];
+ pcpup = &pcpu0;
pcpu_init(pcpup, 0, sizeof(struct pcpu));
/*
diff --git a/sys/arm64/arm64/mp_machdep.c b/sys/arm64/arm64/mp_machdep.c
--- a/sys/arm64/arm64/mp_machdep.c
+++ b/sys/arm64/arm64/mp_machdep.c
@@ -40,6 +40,7 @@
#include <sys/bus.h>
#include <sys/cpu.h>
#include <sys/csan.h>
+#include <sys/domainset.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/malloc.h>
@@ -151,7 +152,7 @@
is_boot_cpu(uint64_t target_cpu)
{
- return (__pcpu[0].pc_mpidr == (target_cpu & CPU_AFF_MASK));
+ return (cpuid_to_pcpu[0]->pc_mpidr == (target_cpu & CPU_AFF_MASK));
}
static void
@@ -213,15 +214,17 @@
* they can pass random value in it.
*/
mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK;
- if (cpu >= MAXCPU || __pcpu[cpu].pc_mpidr != mpidr) {
+ if (cpu >= MAXCPU || cpuid_to_pcpu[cpu] == NULL ||
+ cpuid_to_pcpu[cpu]->pc_mpidr != mpidr) {
for (cpu = 0; cpu < mp_maxid; cpu++)
- if (__pcpu[cpu].pc_mpidr == mpidr)
+ if (cpuid_to_pcpu[cpu] != NULL &&
+ cpuid_to_pcpu[cpu]->pc_mpidr == mpidr)
break;
if ( cpu >= MAXCPU)
panic("MPIDR for this CPU is not in pcpu table");
}
- pcpup = &__pcpu[cpu];
+ pcpup = cpuid_to_pcpu[cpu];
/*
* Set the pcpu pointer with a backup in tpidr_el1 to be
* loaded when entering the kernel from userland.
@@ -482,7 +485,7 @@
* do nothing. Returns true if the CPU is present and running.
*/
static bool
-start_cpu(u_int cpuid, uint64_t target_cpu)
+start_cpu(u_int cpuid, uint64_t target_cpu, int domain)
{
struct pcpu *pcpup;
vm_paddr_t pa;
@@ -498,14 +501,17 @@
KASSERT(cpuid < MAXCPU, ("Too many CPUs"));
- pcpup = &__pcpu[cpuid];
+ pcpup = (void *)kmem_malloc_domainset(DOMAINSET_PREF(domain),
+ sizeof(*pcpup), M_WAITOK | M_ZERO);
pcpu_init(pcpup, cpuid, sizeof(struct pcpu));
pcpup->pc_mpidr = target_cpu & CPU_AFF_MASK;
- dpcpu[cpuid - 1] = (void *)kmem_malloc(DPCPU_SIZE, M_WAITOK | M_ZERO);
+ dpcpu[cpuid - 1] = (void *)kmem_malloc_domainset(
+ DOMAINSET_PREF(domain), DPCPU_SIZE, M_WAITOK | M_ZERO);
dpcpu_init(dpcpu[cpuid - 1], cpuid);
- bootstacks[cpuid] = (void *)kmem_malloc(PAGE_SIZE, M_WAITOK | M_ZERO);
+ bootstacks[cpuid] = (void *)kmem_malloc_domainset(
+ DOMAINSET_PREF(domain), PAGE_SIZE, M_WAITOK | M_ZERO);
naps = atomic_load_int(&aps_started);
bootstack = (char *)bootstacks[cpuid] + PAGE_SIZE;
@@ -548,6 +554,7 @@
ACPI_MADT_GENERIC_INTERRUPT *intr;
u_int *cpuid;
u_int id;
+ int domain;
switch(entry->Type) {
case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
@@ -559,8 +566,14 @@
else
id = *cpuid;
- if (start_cpu(id, intr->ArmMpidr)) {
- __pcpu[id].pc_acpi_id = intr->Uid;
+#ifdef NUMA
+ domain = acpi_pxm_get_cpu_locality(*cpuid);
+#else
+ domain = 0;
+#endif
+ if (start_cpu(id, intr->ArmMpidr, domain)) {
+ MPASS(cpuid_to_pcpu[id] != NULL);
+ cpuid_to_pcpu[id]->pc_acpi_id = intr->Uid;
/*
* Don't increment for the boot CPU, its CPU ID is
* reserved.
@@ -623,7 +636,7 @@
else
cpuid = fdt_cpuid;
- if (!start_cpu(cpuid, target_cpu))
+ if (!start_cpu(cpuid, target_cpu, 0))
return (FALSE);
/*
@@ -636,7 +649,7 @@
if (vm_ndomains == 1 ||
OF_getencprop(node, "numa-node-id", &domain, sizeof(domain)) <= 0)
domain = 0;
- __pcpu[cpuid].pc_domain = domain;
+ cpuid_to_pcpu[cpuid]->pc_domain = domain;
if (domain < MAXMEMDOM)
CPU_SET(cpuid, &cpuset_domain[domain]);
return (TRUE);
@@ -667,7 +680,7 @@
/* CPU 0 is always boot CPU. */
CPU_SET(0, &all_cpus);
- __pcpu[0].pc_mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK;
+ cpuid_to_pcpu[0]->pc_mpidr = READ_SPECIALREG(mpidr_el1) & CPU_AFF_MASK;
switch(arm64_bus_method) {
#ifdef DEV_ACPI
diff --git a/sys/arm64/include/counter.h b/sys/arm64/include/counter.h
--- a/sys/arm64/include/counter.h
+++ b/sys/arm64/include/counter.h
@@ -32,7 +32,7 @@
#include <sys/pcpu.h>
#include <machine/atomic.h>
-#define EARLY_COUNTER &__pcpu[0].pc_early_dummy_counter
+#define EARLY_COUNTER &pcpu0.pc_early_dummy_counter
#define counter_enter() do {} while (0)
#define counter_exit() do {} while (0)
diff --git a/sys/arm64/include/pcpu_aux.h b/sys/arm64/include/pcpu_aux.h
--- a/sys/arm64/include/pcpu_aux.h
+++ b/sys/arm64/include/pcpu_aux.h
@@ -47,6 +47,6 @@
*/
_Static_assert(PAGE_SIZE % sizeof(struct pcpu) == 0, "fix pcpu size");
-extern struct pcpu __pcpu[];
+extern struct pcpu pcpu0;
#endif /* _MACHINE_PCPU_AUX_H_ */

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 10, 7:57 AM (12 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15740878
Default Alt Text
D32338.diff (5 KB)

Event Timeline