Introduce PERCPU_SECTION macro which manages:
* Alignment of the section start
* Insertion of per-CPU data sections
* Alignment and start/end markers for per-CPU data
This change simplifies the linker script maintenance and ensures a unified
approach for per-CPU sections across different architectures.
Refactor the linker scripts for Arm, PPC, and x86 architectures by using
the common macro PERCPU_SECTION defined in xen/xen.lds.h to handle
per-CPU data sections.
No functional changes.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
---
xen/arch/arm/xen.lds.S | 9 +--------
xen/arch/ppc/xen.lds.S | 9 +--------
xen/arch/x86/xen.lds.S | 9 +--------
xen/include/xen/xen.lds.h | 10 ++++++++++
4 files changed, 13 insertions(+), 24 deletions(-)
diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S
index bd884664ad..669a882455 100644
--- a/xen/arch/arm/xen.lds.S
+++ b/xen/arch/arm/xen.lds.S
@@ -198,14 +198,7 @@ SECTIONS
__bss_start = .;
*(.bss.stack_aligned)
*(.bss.page_aligned)
- . = ALIGN(PAGE_SIZE);
- __per_cpu_start = .;
- *(.bss.percpu.page_aligned)
- *(.bss.percpu)
- . = ALIGN(SMP_CACHE_BYTES);
- *(.bss.percpu.read_mostly)
- . = ALIGN(SMP_CACHE_BYTES);
- __per_cpu_data_end = .;
+ PERCPU_SECTION
*(.bss .bss.*)
. = ALIGN(POINTER_ALIGN);
__bss_end = .;
diff --git a/xen/arch/ppc/xen.lds.S b/xen/arch/ppc/xen.lds.S
index 38cd857187..0833d80479 100644
--- a/xen/arch/ppc/xen.lds.S
+++ b/xen/arch/ppc/xen.lds.S
@@ -148,14 +148,7 @@ SECTIONS
__bss_start = .;
*(.bss.stack_aligned)
*(.bss.page_aligned)
- . = ALIGN(PAGE_SIZE);
- __per_cpu_start = .;
- *(.bss.percpu.page_aligned)
- *(.bss.percpu)
- . = ALIGN(SMP_CACHE_BYTES);
- *(.bss.percpu.read_mostly)
- . = ALIGN(SMP_CACHE_BYTES);
- __per_cpu_data_end = .;
+ PERCPU_SECTION
*(.bss .bss.*)
. = ALIGN(POINTER_ALIGN);
__bss_end = .;
diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S
index d48de67cfd..eea8edc02b 100644
--- a/xen/arch/x86/xen.lds.S
+++ b/xen/arch/x86/xen.lds.S
@@ -321,14 +321,7 @@ SECTIONS
DECL_SECTION(.bss) {
__bss_start = .;
*(.bss.page_aligned*)
- . = ALIGN(PAGE_SIZE);
- __per_cpu_start = .;
- *(.bss.percpu.page_aligned)
- *(.bss.percpu)
- . = ALIGN(SMP_CACHE_BYTES);
- *(.bss.percpu.read_mostly)
- . = ALIGN(SMP_CACHE_BYTES);
- __per_cpu_data_end = .;
+ PERCPU_SECTION
*(.bss .bss.*)
. = ALIGN(POINTER_ALIGN);
__bss_end = .;
diff --git a/xen/include/xen/xen.lds.h b/xen/include/xen/xen.lds.h
index a17810bb28..f043c7b6c0 100644
--- a/xen/include/xen/xen.lds.h
+++ b/xen/include/xen/xen.lds.h
@@ -151,6 +151,16 @@
#define LOCK_PROFILE_DATA
#endif
+#define PERCPU_SECTION \
+ . = ALIGN(PAGE_SIZE); \
+ __per_cpu_start = .; \
+ *(.bss.percpu.page_aligned) \
+ *(.bss.percpu) \
+ . = ALIGN(SMP_CACHE_BYTES); \
+ *(.bss.percpu.read_mostly) \
+ . = ALIGN(SMP_CACHE_BYTES); \
+ __per_cpu_data_end = .; \
+
#ifdef CONFIG_HAS_VPCI
#define VPCI_ARRAY \
. = ALIGN(POINTER_ALIGN); \
--
2.46.0
On 19.09.2024 17:59, Oleksii Kurochko wrote:
> --- a/xen/arch/x86/xen.lds.S
> +++ b/xen/arch/x86/xen.lds.S
> @@ -321,14 +321,7 @@ SECTIONS
> DECL_SECTION(.bss) {
> __bss_start = .;
> *(.bss.page_aligned*)
> - . = ALIGN(PAGE_SIZE);
> - __per_cpu_start = .;
> - *(.bss.percpu.page_aligned)
> - *(.bss.percpu)
> - . = ALIGN(SMP_CACHE_BYTES);
> - *(.bss.percpu.read_mostly)
> - . = ALIGN(SMP_CACHE_BYTES);
> - __per_cpu_data_end = .;
> + PERCPU_SECTION
> *(.bss .bss.*)
> . = ALIGN(POINTER_ALIGN);
> __bss_end = .;
Like the _SEC in the other patch I question _SECTION here, albeit for a different
reason: This is no separate output section, and it's more than one kind of input
ones. Perhaps PERCPU_DATA? With that
Acked-by: Jan Beulich <jbeulich@suse.com>
Jan
On Mon, 2024-09-23 at 12:56 +0200, Jan Beulich wrote:
> On 19.09.2024 17:59, Oleksii Kurochko wrote:
> > --- a/xen/arch/x86/xen.lds.S
> > +++ b/xen/arch/x86/xen.lds.S
> > @@ -321,14 +321,7 @@ SECTIONS
> > DECL_SECTION(.bss) {
> > __bss_start = .;
> > *(.bss.page_aligned*)
> > - . = ALIGN(PAGE_SIZE);
> > - __per_cpu_start = .;
> > - *(.bss.percpu.page_aligned)
> > - *(.bss.percpu)
> > - . = ALIGN(SMP_CACHE_BYTES);
> > - *(.bss.percpu.read_mostly)
> > - . = ALIGN(SMP_CACHE_BYTES);
> > - __per_cpu_data_end = .;
> > + PERCPU_SECTION
> > *(.bss .bss.*)
> > . = ALIGN(POINTER_ALIGN);
> > __bss_end = .;
>
> Like the _SEC in the other patch I question _SECTION here, albeit for
> a different
> reason: This is no separate output section, and it's more than one
> kind of input
> ones. Perhaps PERCPU_DATA? With that
> Acked-by: Jan Beulich <jbeulich@suse.com>
Sure, I will drop _SECTION here too. Thanks.
~ Oleksii
On 23/09/2024 12:48 pm, oleksii.kurochko@gmail.com wrote:
> On Mon, 2024-09-23 at 12:56 +0200, Jan Beulich wrote:
>> On 19.09.2024 17:59, Oleksii Kurochko wrote:
>>> --- a/xen/arch/x86/xen.lds.S
>>> +++ b/xen/arch/x86/xen.lds.S
>>> @@ -321,14 +321,7 @@ SECTIONS
>>> DECL_SECTION(.bss) {
>>> __bss_start = .;
>>> *(.bss.page_aligned*)
>>> - . = ALIGN(PAGE_SIZE);
>>> - __per_cpu_start = .;
>>> - *(.bss.percpu.page_aligned)
>>> - *(.bss.percpu)
>>> - . = ALIGN(SMP_CACHE_BYTES);
>>> - *(.bss.percpu.read_mostly)
>>> - . = ALIGN(SMP_CACHE_BYTES);
>>> - __per_cpu_data_end = .;
>>> + PERCPU_SECTION
>>> *(.bss .bss.*)
>>> . = ALIGN(POINTER_ALIGN);
>>> __bss_end = .;
>> Like the _SEC in the other patch I question _SECTION here, albeit for
>> a different
>> reason: This is no separate output section, and it's more than one
>> kind of input
>> ones. Perhaps PERCPU_DATA? With that
>> Acked-by: Jan Beulich <jbeulich@suse.com>
> Sure, I will drop _SECTION here too. Thanks.
Can we call it PERCPU_BSS? Just to highlight the fact that it really is
BSS, and not initialised DATA.
~Andrew
On 23.09.2024 13:53, Andrew Cooper wrote:
> On 23/09/2024 12:48 pm, oleksii.kurochko@gmail.com wrote:
>> On Mon, 2024-09-23 at 12:56 +0200, Jan Beulich wrote:
>>> On 19.09.2024 17:59, Oleksii Kurochko wrote:
>>>> --- a/xen/arch/x86/xen.lds.S
>>>> +++ b/xen/arch/x86/xen.lds.S
>>>> @@ -321,14 +321,7 @@ SECTIONS
>>>> DECL_SECTION(.bss) {
>>>> __bss_start = .;
>>>> *(.bss.page_aligned*)
>>>> - . = ALIGN(PAGE_SIZE);
>>>> - __per_cpu_start = .;
>>>> - *(.bss.percpu.page_aligned)
>>>> - *(.bss.percpu)
>>>> - . = ALIGN(SMP_CACHE_BYTES);
>>>> - *(.bss.percpu.read_mostly)
>>>> - . = ALIGN(SMP_CACHE_BYTES);
>>>> - __per_cpu_data_end = .;
>>>> + PERCPU_SECTION
>>>> *(.bss .bss.*)
>>>> . = ALIGN(POINTER_ALIGN);
>>>> __bss_end = .;
>>> Like the _SEC in the other patch I question _SECTION here, albeit for
>>> a different
>>> reason: This is no separate output section, and it's more than one
>>> kind of input
>>> ones. Perhaps PERCPU_DATA? With that
>>> Acked-by: Jan Beulich <jbeulich@suse.com>
>> Sure, I will drop _SECTION here too. Thanks.
>
> Can we call it PERCPU_BSS? Just to highlight the fact that it really is
> BSS, and not initialised DATA.
Fine with me.
Jan
Hi,
On 19/09/2024 17:59, Oleksii Kurochko wrote:
> Introduce PERCPU_SECTION macro which manages:
> * Alignment of the section start
> * Insertion of per-CPU data sections
> * Alignment and start/end markers for per-CPU data
> This change simplifies the linker script maintenance and ensures a unified
> approach for per-CPU sections across different architectures.
>
> Refactor the linker scripts for Arm, PPC, and x86 architectures by using
> the common macro PERCPU_SECTION defined in xen/xen.lds.h to handle
> per-CPU data sections.
>
> No functional changes.
>
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
Acked-by: Julien Grall <jgrall@amazon.com>
Cheers,
> ---
> xen/arch/arm/xen.lds.S | 9 +--------
> xen/arch/ppc/xen.lds.S | 9 +--------
> xen/arch/x86/xen.lds.S | 9 +--------
> xen/include/xen/xen.lds.h | 10 ++++++++++
> 4 files changed, 13 insertions(+), 24 deletions(-)
>
> diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S
> index bd884664ad..669a882455 100644
> --- a/xen/arch/arm/xen.lds.S
> +++ b/xen/arch/arm/xen.lds.S
> @@ -198,14 +198,7 @@ SECTIONS
> __bss_start = .;
> *(.bss.stack_aligned)
> *(.bss.page_aligned)
> - . = ALIGN(PAGE_SIZE);
> - __per_cpu_start = .;
> - *(.bss.percpu.page_aligned)
> - *(.bss.percpu)
> - . = ALIGN(SMP_CACHE_BYTES);
> - *(.bss.percpu.read_mostly)
> - . = ALIGN(SMP_CACHE_BYTES);
> - __per_cpu_data_end = .;
> + PERCPU_SECTION
> *(.bss .bss.*)
> . = ALIGN(POINTER_ALIGN);
> __bss_end = .;
> diff --git a/xen/arch/ppc/xen.lds.S b/xen/arch/ppc/xen.lds.S
> index 38cd857187..0833d80479 100644
> --- a/xen/arch/ppc/xen.lds.S
> +++ b/xen/arch/ppc/xen.lds.S
> @@ -148,14 +148,7 @@ SECTIONS
> __bss_start = .;
> *(.bss.stack_aligned)
> *(.bss.page_aligned)
> - . = ALIGN(PAGE_SIZE);
> - __per_cpu_start = .;
> - *(.bss.percpu.page_aligned)
> - *(.bss.percpu)
> - . = ALIGN(SMP_CACHE_BYTES);
> - *(.bss.percpu.read_mostly)
> - . = ALIGN(SMP_CACHE_BYTES);
> - __per_cpu_data_end = .;
> + PERCPU_SECTION
> *(.bss .bss.*)
> . = ALIGN(POINTER_ALIGN);
> __bss_end = .;
> diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S
> index d48de67cfd..eea8edc02b 100644
> --- a/xen/arch/x86/xen.lds.S
> +++ b/xen/arch/x86/xen.lds.S
> @@ -321,14 +321,7 @@ SECTIONS
> DECL_SECTION(.bss) {
> __bss_start = .;
> *(.bss.page_aligned*)
> - . = ALIGN(PAGE_SIZE);
> - __per_cpu_start = .;
> - *(.bss.percpu.page_aligned)
> - *(.bss.percpu)
> - . = ALIGN(SMP_CACHE_BYTES);
> - *(.bss.percpu.read_mostly)
> - . = ALIGN(SMP_CACHE_BYTES);
> - __per_cpu_data_end = .;
> + PERCPU_SECTION
> *(.bss .bss.*)
> . = ALIGN(POINTER_ALIGN);
> __bss_end = .;
> diff --git a/xen/include/xen/xen.lds.h b/xen/include/xen/xen.lds.h
> index a17810bb28..f043c7b6c0 100644
> --- a/xen/include/xen/xen.lds.h
> +++ b/xen/include/xen/xen.lds.h
> @@ -151,6 +151,16 @@
> #define LOCK_PROFILE_DATA
> #endif
>
> +#define PERCPU_SECTION \
> + . = ALIGN(PAGE_SIZE); \
> + __per_cpu_start = .; \
> + *(.bss.percpu.page_aligned) \
> + *(.bss.percpu) \
> + . = ALIGN(SMP_CACHE_BYTES); \
> + *(.bss.percpu.read_mostly) \
> + . = ALIGN(SMP_CACHE_BYTES); \
> + __per_cpu_data_end = .; \
> +
> #ifdef CONFIG_HAS_VPCI
> #define VPCI_ARRAY \
> . = ALIGN(POINTER_ALIGN); \
--
Julien Grall
© 2016 - 2026 Red Hat, Inc.