[PATCH v2 10/11] arm64: vdso: Support multiple pages of vDSO data
From: Mark Brown <broonie@kernel.org>
Date: 2020-07-01 20:31:02
Subsystem:
arm64 port (aarch64 architecture), the rest · Maintainers:
Catalin Marinas, Will Deacon, Linus Torvalds
In order to provide per-CPU data for systems with larger numbers of CPUs we need multiple data pages for the vDSO, exactly how many will depend on the page size and the maximum number of CPUs the kernel is configured to support. Since the vDSO references the data via a symbol defined in the linker script we need to be able to reference the sizes of structures defined in C which appears not to be something we have sensible support for. Handle this by defining magic numbers and using BUILD_BUG_ON() which checks that the numbers are accurate, this is rather distasteful but works. Currently the patch duplicates CS_BASES, with the hard coding of struct sizes it felt like more trouble than it was worth to move it into an assembler clean header. Signed-off-by: Mark Brown <broonie@kernel.org> --- arch/arm64/include/asm/vdso.h | 4 ++++ arch/arm64/kernel/vdso.c | 2 ++ arch/arm64/kernel/vdso/vdso.lds.S | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h
index c7edf7a7491f..21e35d79022a 100644
--- a/arch/arm64/include/asm/vdso.h
+++ b/arch/arm64/include/asm/vdso.h@@ -18,6 +18,10 @@ */ #define VDSO_BASE_DATA_SIZE 240 #define VDSO_CS_BASES 2 +#define VDSO_PER_CPU_SIZE 8 +#define VDSO_DATA_SIZE ((VDSO_PER_CPU_SIZE * CONFIG_NR_CPUS) \ + + (VDSO_BASE_DATA_SIZE * VDSO_CS_BASES)) +#define VDSO_DATA_PAGES ((VDSO_DATA_SIZE / PAGE_SIZE) + 1) #ifndef __ASSEMBLY__
diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c
index e1146f424e6f..b0899591d91e 100644
--- a/arch/arm64/kernel/vdso.c
+++ b/arch/arm64/kernel/vdso.c@@ -112,6 +112,8 @@ static int __vdso_init(enum vdso_abi abi) } BUILD_BUG_ON(sizeof(struct vdso_data) != VDSO_BASE_DATA_SIZE); + BUILD_BUG_ON(CS_BASES != VDSO_CS_BASES); + BUILD_BUG_ON(sizeof(struct vdso_cpu_data) != VDSO_PER_CPU_SIZE); /* * We ensure that the vDSO text is page aligned and an exact
diff --git a/arch/arm64/kernel/vdso/vdso.lds.S b/arch/arm64/kernel/vdso/vdso.lds.S
index c2fd94f14b94..7ee43b149bf9 100644
--- a/arch/arm64/kernel/vdso/vdso.lds.S
+++ b/arch/arm64/kernel/vdso/vdso.lds.S@@ -17,7 +17,7 @@ OUTPUT_ARCH(aarch64) SECTIONS { - PROVIDE(_vdso_data = . - PAGE_SIZE); + PROVIDE(_vdso_data = . - (VDSO_DATA_PAGES * PAGE_SIZE)); . = VDSO_LBASE + SIZEOF_HEADERS; .hash : { *(.hash) } :text
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel