From: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
To: Andy Lutomirski <luto@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Vincenzo Frascino <vincenzo.frascino@arm.com>,
Arnd Bergmann <arnd@arndb.de>,
"David S. Miller" <davem@davemloft.net>,
Andreas Larsson <andreas@gaisler.com>,
Nick Alcock <nick.alcock@oracle.com>,
John Stultz <jstultz@google.com>,
Stephen Boyd <sboyd@kernel.org>,
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>,
Shuah Khan <shuah@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Theodore Ts'o <tytso@mit.edu>,
"Jason A. Donenfeld" <Jason@zx2c4.com>,
Russell King <linux@armlinux.org.uk>,
Madhavan Srinivasan <maddy@linux.ibm.com>,
Michael Ellerman <mpe@ellerman.id.au>,
Nicholas Piggin <npiggin@gmail.com>,
Christophe Leroy <christophe.leroy@csgroup.eu>,
Huacai Chen <chenhuacai@kernel.org>,
WANG Xuerui <kernel@xen0n.name>,
Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Nagarathnam Muthusamy <nagarathnam.muthusamy@oracle.com>,
Shannon Nelson <sln@onemain.com>
Cc: linux-kernel@vger.kernel.org, sparclinux@vger.kernel.org,
linux-kselftest@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linuxppc-dev@lists.ozlabs.org, loongarch@lists.linux.dev,
linux-mips@vger.kernel.org, linux-s390@vger.kernel.org,
"Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
Subject: [PATCH v3 24/36] vdso/datastore: Allocate data pages dynamically
Date: Wed, 17 Sep 2025 16:00:26 +0200 [thread overview]
Message-ID: <20250917-vdso-sparc64-generic-2-v3-24-3679b1bc8ee8@linutronix.de> (raw)
In-Reply-To: <20250917-vdso-sparc64-generic-2-v3-0-3679b1bc8ee8@linutronix.de>
Allocating the datapages as part of the kernel image does not work on
SPARC. It is also problematic with regards to dcache aliasing as there is
no guarantee that the virtual addresses used by the kernel are compatible
with those used by userspace.
Allocate the data pages through the page allocator instead.
Unused pages in the vDSO VMA are still allocated to keep the virtual
addresses aligned.
These pages are used by both the timekeeping, random pool and architecture
initialization code. Introduce a new early initialization step, to make
sure they are available when needed.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
include/linux/vdso_datastore.h | 6 ++++++
init/main.c | 2 ++
lib/vdso/datastore.c | 44 ++++++++++++++++++++++--------------------
3 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/include/linux/vdso_datastore.h b/include/linux/vdso_datastore.h
index a91fa24b06e09321fdff8c2c7bdfbc1b206db574..0b530428db711e58660e797d9d3cf5dce60217fe 100644
--- a/include/linux/vdso_datastore.h
+++ b/include/linux/vdso_datastore.h
@@ -2,9 +2,15 @@
#ifndef _LINUX_VDSO_DATASTORE_H
#define _LINUX_VDSO_DATASTORE_H
+#ifdef CONFIG_HAVE_GENERIC_VDSO
#include <linux/mm_types.h>
extern const struct vm_special_mapping vdso_vvar_mapping;
struct vm_area_struct *vdso_install_vvar_mapping(struct mm_struct *mm, unsigned long addr);
+void __init vdso_setup_data_pages(void);
+#else /* !CONFIG_HAVE_GENERIC_VDSO */
+static inline void vdso_setup_data_pages(void) { }
+#endif /* CONFIG_HAVE_GENERIC_VDSO */
+
#endif /* _LINUX_VDSO_DATASTORE_H */
diff --git a/init/main.c b/init/main.c
index 0ee0ee7b7c2c0a7aceb6f428f8ee61edeead60ec..0d4510a7a5c21a47a040c05da1db919211706a7e 100644
--- a/init/main.c
+++ b/init/main.c
@@ -103,6 +103,7 @@
#include <linux/randomize_kstack.h>
#include <linux/pidfs.h>
#include <linux/ptdump.h>
+#include <linux/vdso_datastore.h>
#include <net/net_namespace.h>
#include <asm/io.h>
@@ -1007,6 +1008,7 @@ void start_kernel(void)
srcu_init();
hrtimers_init();
softirq_init();
+ vdso_setup_data_pages();
timekeeping_init();
time_init();
diff --git a/lib/vdso/datastore.c b/lib/vdso/datastore.c
index 6e5feb4a95b85f5a1cbdced7cdeddc593fcbad40..67799e8919c202e0800cb78ff70919f9604ac492 100644
--- a/lib/vdso/datastore.c
+++ b/lib/vdso/datastore.c
@@ -1,41 +1,43 @@
// SPDX-License-Identifier: GPL-2.0-only
-#include <linux/linkage.h>
#include <linux/mm.h>
#include <linux/time_namespace.h>
#include <linux/types.h>
#include <linux/vdso_datastore.h>
#include <vdso/datapage.h>
-/*
- * The vDSO data page.
- */
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
-static union {
- struct vdso_time_data data;
- u8 page[PAGE_SIZE];
-} vdso_time_data_store __page_aligned_data;
-struct vdso_time_data *vdso_k_time_data = &vdso_time_data_store.data;
-static_assert(sizeof(vdso_time_data_store) == PAGE_SIZE);
+struct vdso_time_data *vdso_k_time_data;
+static_assert(sizeof(struct vdso_time_data) <= PAGE_SIZE);
#endif /* CONFIG_GENERIC_GETTIMEOFDAY */
#ifdef CONFIG_VDSO_GETRANDOM
-static union {
- struct vdso_rng_data data;
- u8 page[PAGE_SIZE];
-} vdso_rng_data_store __page_aligned_data;
-struct vdso_rng_data *vdso_k_rng_data = &vdso_rng_data_store.data;
-static_assert(sizeof(vdso_rng_data_store) == PAGE_SIZE);
+struct vdso_rng_data *vdso_k_rng_data;
+static_assert(sizeof(struct vdso_rng_data) <= PAGE_SIZE);
#endif /* CONFIG_VDSO_GETRANDOM */
#ifdef CONFIG_ARCH_HAS_VDSO_ARCH_DATA
-static union {
- struct vdso_arch_data data;
- u8 page[VDSO_ARCH_DATA_SIZE];
-} vdso_arch_data_store __page_aligned_data;
-struct vdso_arch_data *vdso_k_arch_data = &vdso_arch_data_store.data;
+struct vdso_arch_data *vdso_k_arch_data;
#endif /* CONFIG_ARCH_HAS_VDSO_ARCH_DATA */
+void __init vdso_setup_data_pages(void)
+{
+ unsigned int order = get_order(VDSO_NR_PAGES * PAGE_SIZE);
+ struct folio *folio = folio_alloc(GFP_KERNEL, order);
+
+ if (!folio)
+ panic("Unable to allocate VDSO storage pages");
+
+ if (IS_ENABLED(CONFIG_GENERIC_GETTIMEOFDAY))
+ vdso_k_time_data = page_address(folio_page(folio, VDSO_TIME_PAGE_OFFSET));
+
+ if (IS_ENABLED(CONFIG_VDSO_GETRANDOM))
+ vdso_k_rng_data = page_address(folio_page(folio, VDSO_RNG_PAGE_OFFSET));
+
+ if (IS_ENABLED(CONFIG_ARCH_HAS_VDSO_ARCH_DATA))
+ vdso_k_arch_data = page_address(folio_page(folio, VDSO_ARCH_PAGES_START));
+}
+
static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
struct vm_area_struct *vma, struct vm_fault *vmf)
{
--
2.51.0
next prev parent reply other threads:[~2025-09-17 14:04 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-17 14:00 [PATCH v3 00/36] sparc64: vdso: Switch to the generic vDSO library Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 01/36] selftests: vDSO: vdso_test_correctness: Handle different tv_usec types Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 02/36] arm64: vDSO: getrandom: Explicitly include asm/alternative.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 03/36] arm64: vDSO: gettimeofday: Explicitly include vdso/clocksource.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 04/36] arm64: vDSO: compat_gettimeofday: Add explicit includes Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 05/36] ARM: vdso: gettimeofday: " Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 06/36] powerpc/vdso/gettimeofday: Explicitly include vdso/time32.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 07/36] powerpc/vdso: Explicitly include asm/cputable.h and asm/feature-fixups.h Thomas Weißschuh
2025-09-17 14:41 ` Christophe Leroy
2025-09-17 15:21 ` Thomas Weißschuh
2025-09-17 15:23 ` Christophe Leroy
2025-09-22 2:44 ` Michael Ellerman
2025-09-17 14:00 ` [PATCH v3 08/36] LoongArch: vDSO: Explicitly include asm/vdso/vdso.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 09/36] MIPS: vdso: Add include guard to asm/vdso/vdso.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 10/36] MIPS: vdso: Explicitly include asm/vdso/vdso.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 11/36] random: vDSO: Add explicit includes Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 12/36] vdso/gettimeofday: " Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 13/36] vdso/helpers: Explicitly include vdso/processor.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 14/36] vdso/datapage: Remove inclusion of gettimeofday.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 15/36] vdso/datapage: Trim down unnecessary includes Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 16/36] random: vDSO: trim vDSO includes Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 17/36] random: vDSO: remove ifdeffery Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 18/36] random: vDSO: split out datapage update into helper functions Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 19/36] random: vDSO: only access vDSO datapage after random_init() Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 20/36] s390/time: Set up vDSO datapage later Thomas Weißschuh
2025-09-17 15:12 ` Heiko Carstens
2025-09-17 14:00 ` [PATCH v3 21/36] vdso/datastore: Reduce scope of some variables in vvar_fault() Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 22/36] vdso/datastore: Drop inclusion of linux/mmap_lock.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 23/36] vdso/datastore: Map pages through struct page Thomas Weißschuh
2025-09-17 14:00 ` Thomas Weißschuh [this message]
2025-09-17 14:00 ` [PATCH v3 25/36] sparc64: vdso: Link with -z noexecstack Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 26/36] sparc64: vdso: Remove obsolete "fake section table" reservation Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 27/36] sparc64: vdso: Replace code patching with runtime conditional Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 28/36] sparc64: vdso: Move hardware counter read into header Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 29/36] sparc64: vdso: Move syscall fallbacks " Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 30/36] sparc64: vdso: Introduce vdso/processor.h Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 31/36] sparc64: vdso: Switch to the generic vDSO library Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 32/36] sparc64: vdso2c: Drop sym_vvar_start handling Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 33/36] sparc64: vdso2c: Remove symbol handling Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 34/36] sparc64: vdso: Implement clock_gettime64() Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 35/36] clocksource: remove ARCH_CLOCKSOURCE_DATA Thomas Weißschuh
2025-09-17 14:00 ` [PATCH v3 36/36] clocksource: drop include of asm/clocksource.h from linux/clocksource.h Thomas Weißschuh
2025-09-20 13:24 ` [PATCH v3 00/36] sparc64: vdso: Switch to the generic vDSO library John Paul Adrian Glaubitz
2025-09-20 14:37 ` Thomas Weißschuh
2025-09-21 5:05 ` John Paul Adrian Glaubitz
2025-09-24 7:40 ` John Paul Adrian Glaubitz
2025-09-24 8:07 ` Thomas Weißschuh
2025-09-24 8:28 ` John Paul Adrian Glaubitz
2025-09-24 11:35 ` Thomas Weißschuh
2025-09-26 13:53 ` Andreas Larsson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250917-vdso-sparc64-generic-2-v3-24-3679b1bc8ee8@linutronix.de \
--to=thomas.weissschuh@linutronix.de \
--cc=Jason@zx2c4.com \
--cc=agordeev@linux.ibm.com \
--cc=andreas@gaisler.com \
--cc=arnd@arndb.de \
--cc=borntraeger@linux.ibm.com \
--cc=catalin.marinas@arm.com \
--cc=chenhuacai@kernel.org \
--cc=christophe.leroy@csgroup.eu \
--cc=davem@davemloft.net \
--cc=glaubitz@physik.fu-berlin.de \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=jstultz@google.com \
--cc=kernel@xen0n.name \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=loongarch@lists.linux.dev \
--cc=luto@kernel.org \
--cc=maddy@linux.ibm.com \
--cc=mpe@ellerman.id.au \
--cc=nagarathnam.muthusamy@oracle.com \
--cc=nick.alcock@oracle.com \
--cc=npiggin@gmail.com \
--cc=sboyd@kernel.org \
--cc=shuah@kernel.org \
--cc=sln@onemain.com \
--cc=sparclinux@vger.kernel.org \
--cc=svens@linux.ibm.com \
--cc=tglx@linutronix.de \
--cc=tsbogend@alpha.franken.de \
--cc=tytso@mit.edu \
--cc=vincenzo.frascino@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).