From 67e055ee9c1a5a28d5fbc3c54bcab920bb9b7215 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Tue, 3 Feb 2026 15:11:16 +0100 Subject: [PATCH] CPU: abstract read-mostly-ness for per-CPU cpumask_var_t variables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cpumask_var_t can resolve to a pointer or to an array. While the pointer typically is allocated once for a CPU and then only read (i.e. wants to be marked read-mostly), the same isn't necessarily true for the array case. There things depend on how the variable is actually used. cpu_core_mask and cpu_sibling_mask (which all architectures have inherited from x86, which in turn is possibly wrong) are altered only as CPUs are brought up or down, so may remain uniformly read-mostly. Other (x86-only) instances want to change, to avoid disturbing adjacent read-mostly data. While doing the x86 adjustment, also do one in the opposite direction, i.e. where there was no read-mostly annotation when it is applicable in the "pointer" case. Signed-off-by: Jan Beulich Acked-by: Roger Pau Monné --- xen/arch/x86/genapic/x2apic.c | 2 +- xen/arch/x86/smpboot.c | 6 +++--- xen/include/xen/cpumask.h | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/genapic/x2apic.c b/xen/arch/x86/genapic/x2apic.c index 89d66bc627..5f2765cf14 100644 --- a/xen/arch/x86/genapic/x2apic.c +++ b/xen/arch/x86/genapic/x2apic.c @@ -20,7 +20,7 @@ static DEFINE_PER_CPU_READ_MOSTLY(u32, cpu_2_logical_apicid); static DEFINE_PER_CPU_READ_MOSTLY(cpumask_t *, cluster_cpus); static cpumask_t *cluster_cpus_spare; -static DEFINE_PER_CPU(cpumask_var_t, scratch_mask); +static DEFINE_PER_CPU_CPUMASK_VAR(scratch_mask); static inline u32 x2apic_cluster(unsigned int cpu) { diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 69cc9bbc6e..961bdf5333 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -52,13 +52,13 @@ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_mask); /* representing HT and core siblings of each logical CPU */ DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_mask); -DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, scratch_cpumask); +DEFINE_PER_CPU_CPUMASK_VAR(scratch_cpumask); static cpumask_t scratch_cpu0mask; -DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, hpet_scratch_cpumask); +DEFINE_PER_CPU_CPUMASK_VAR(hpet_scratch_cpumask); static cpumask_t hpet_scratch_cpu0mask; -DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, send_ipi_cpumask); +DEFINE_PER_CPU_CPUMASK_VAR(send_ipi_cpumask); static cpumask_t send_ipi_cpu0mask; DEFINE_PER_CPU_READ_MOSTLY(struct stubs, stubs); diff --git a/xen/include/xen/cpumask.h b/xen/include/xen/cpumask.h index b713bb69a9..f3a53d90e0 100644 --- a/xen/include/xen/cpumask.h +++ b/xen/include/xen/cpumask.h @@ -311,6 +311,9 @@ extern const cpumask_t cpumask_all; typedef cpumask_t *cpumask_var_t; +#define DEFINE_PER_CPU_CPUMASK_VAR(sym) \ + DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, sym) + static inline bool alloc_cpumask_var(cpumask_var_t *mask) { *mask = _xmalloc(nr_cpumask_bits / 8, sizeof(long)); @@ -349,6 +352,9 @@ static inline void free_cpumask_var(cpumask_var_t mask) #else typedef cpumask_t cpumask_var_t[1]; +#define DEFINE_PER_CPU_CPUMASK_VAR(sym) \ + DEFINE_PER_CPU(cpumask_var_t, sym) + static inline bool alloc_cpumask_var(cpumask_var_t *mask) { return true;