[PATCH v2 10/11] arm64: vdso: Support multiple pages of vDSO data

Mark Brown broonie at kernel.org
Wed Jul 1 16:28:45 EDT 2020


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 at 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




More information about the linux-arm-kernel mailing list