Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107036450
D32338.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D32338.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D32338: Allocate arm64 per-CPU data in the correct domain
Attached
Detach File
Event Timeline
Log In to Comment