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>,
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 v5 23/34] vdso/datastore: Allocate data pages dynamically
Date: Thu, 06 Nov 2025 11:02:16 +0100 [thread overview]
Message-ID: <20251106-vdso-sparc64-generic-2-v5-23-97ff2b6542f7@linutronix.de> (raw)
In-Reply-To: <20251106-vdso-sparc64-generic-2-v5-0-97ff2b6542f7@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.
Switch the mapping from PFNs to 'struct page' as that is required
for dynamically allocated pages.
VM_MIXEDMAP is necessary for the call to vmf_insert_page() in the timens
prefault path to work.
These pages are also used by 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>
Tested-by: Andreas Larsson <andreas@gaisler.com>
Reviewed-by: Andreas Larsson <andreas@gaisler.com>
---
include/linux/vdso_datastore.h | 6 ++++
init/main.c | 2 ++
lib/vdso/datastore.c | 69 ++++++++++++++++++++++--------------------
3 files changed, 45 insertions(+), 32 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 07a3116811c5d72cbab48410493b3d0f89d1f1b2..01fa389eb33d58e13388bfaf6a821fe8523f2c76 100644
--- a/init/main.c
+++ b/init/main.c
@@ -104,6 +104,7 @@
#include <linux/pidfs.h>
#include <linux/ptdump.h>
#include <linux/time_namespace.h>
+#include <linux/vdso_datastore.h>
#include <net/net_namespace.h>
#include <asm/io.h>
@@ -1020,6 +1021,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 7377fcb6e1dfe31d02ffcae371fdf9da069ae4c1..222ae268715d0413f54a477c65d456bd8d58981e 100644
--- a/lib/vdso/datastore.c
+++ b/lib/vdso/datastore.c
@@ -1,52 +1,56 @@
// SPDX-License-Identifier: GPL-2.0-only
-#include <linux/linkage.h>
+#include <linux/gfp.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 | __GFP_ZERO, 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)
{
- struct page *timens_page = find_timens_vvar_page(vma);
- unsigned long pfn;
+ struct page *page, *timens_page;
+
+ timens_page = find_timens_vvar_page(vma);
switch (vmf->pgoff) {
case VDSO_TIME_PAGE_OFFSET:
if (!IS_ENABLED(CONFIG_GENERIC_GETTIMEOFDAY))
return VM_FAULT_SIGBUS;
- pfn = __phys_to_pfn(__pa_symbol(vdso_k_time_data));
+ page = virt_to_page(vdso_k_time_data);
if (timens_page) {
/*
* Fault in VVAR page too, since it will be accessed
@@ -56,10 +60,10 @@ static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
vm_fault_t err;
addr = vmf->address + VDSO_TIMENS_PAGE_OFFSET * PAGE_SIZE;
- err = vmf_insert_pfn(vma, addr, pfn);
+ err = vmf_insert_page(vma, addr, page);
if (unlikely(err & VM_FAULT_ERROR))
return err;
- pfn = page_to_pfn(timens_page);
+ page = timens_page;
}
break;
case VDSO_TIMENS_PAGE_OFFSET:
@@ -72,24 +76,25 @@ static vm_fault_t vvar_fault(const struct vm_special_mapping *sm,
*/
if (!IS_ENABLED(CONFIG_TIME_NS) || !timens_page)
return VM_FAULT_SIGBUS;
- pfn = __phys_to_pfn(__pa_symbol(vdso_k_time_data));
+ page = virt_to_page(vdso_k_time_data);
break;
case VDSO_RNG_PAGE_OFFSET:
if (!IS_ENABLED(CONFIG_VDSO_GETRANDOM))
return VM_FAULT_SIGBUS;
- pfn = __phys_to_pfn(__pa_symbol(vdso_k_rng_data));
+ page = virt_to_page(vdso_k_rng_data);
break;
case VDSO_ARCH_PAGES_START ... VDSO_ARCH_PAGES_END:
if (!IS_ENABLED(CONFIG_ARCH_HAS_VDSO_ARCH_DATA))
return VM_FAULT_SIGBUS;
- pfn = __phys_to_pfn(__pa_symbol(vdso_k_arch_data)) +
- vmf->pgoff - VDSO_ARCH_PAGES_START;
+ page = virt_to_page(vdso_k_arch_data) + vmf->pgoff - VDSO_ARCH_PAGES_START;
break;
default:
return VM_FAULT_SIGBUS;
}
- return vmf_insert_pfn(vma, vmf->address, pfn);
+ get_page(page);
+ vmf->page = page;
+ return 0;
}
const struct vm_special_mapping vdso_vvar_mapping = {
@@ -101,7 +106,7 @@ struct vm_area_struct *vdso_install_vvar_mapping(struct mm_struct *mm, unsigned
{
return _install_special_mapping(mm, addr, VDSO_NR_PAGES * PAGE_SIZE,
VM_READ | VM_MAYREAD | VM_IO | VM_DONTDUMP |
- VM_PFNMAP | VM_SEALED_SYSMAP,
+ VM_MIXEDMAP | VM_SEALED_SYSMAP,
&vdso_vvar_mapping);
}
--
2.51.0
next prev parent reply other threads:[~2025-11-06 10:02 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-06 10:01 [PATCH v5 00/34] sparc64: vdso: Switch to the generic vDSO library Thomas Weißschuh
2025-11-06 10:01 ` [PATCH v5 01/34] selftests: vDSO: vdso_test_correctness: Handle different tv_usec types Thomas Weißschuh
2025-11-06 10:01 ` [PATCH v5 02/34] arm64: vDSO: getrandom: Explicitly include asm/alternative.h Thomas Weißschuh
2025-11-06 10:01 ` [PATCH v5 03/34] arm64: vDSO: gettimeofday: Explicitly include vdso/clocksource.h Thomas Weißschuh
2025-11-06 10:01 ` [PATCH v5 04/34] arm64: vDSO: compat_gettimeofday: Add explicit includes Thomas Weißschuh
2025-11-06 10:01 ` [PATCH v5 05/34] ARM: vdso: gettimeofday: " Thomas Weißschuh
2025-11-06 10:01 ` [PATCH v5 06/34] powerpc/vdso/gettimeofday: Explicitly include vdso/time32.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 07/34] powerpc/vdso: Explicitly include asm/cputable.h and asm/feature-fixups.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 08/34] LoongArch: vDSO: Explicitly include asm/vdso/vdso.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 09/34] MIPS: vdso: Add include guard to asm/vdso/vdso.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 10/34] MIPS: vdso: Explicitly include asm/vdso/vdso.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 11/34] random: vDSO: Add explicit includes Thomas Weißschuh
2025-11-07 23:59 ` Jason A. Donenfeld
2025-11-06 10:02 ` [PATCH v5 12/34] vdso/gettimeofday: " Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 13/34] vdso/helpers: Explicitly include vdso/processor.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 14/34] vdso/datapage: Remove inclusion of gettimeofday.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 15/34] vdso/datapage: Trim down unnecessary includes Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 16/34] random: vDSO: trim vDSO includes Thomas Weißschuh
2025-11-07 23:49 ` Jason A. Donenfeld
2025-11-08 0:00 ` Jason A. Donenfeld
2025-11-06 10:02 ` [PATCH v5 17/34] random: vDSO: remove ifdeffery Thomas Weißschuh
2025-11-07 23:37 ` Jason A. Donenfeld
2025-11-10 8:45 ` Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 18/34] random: vDSO: split out datapage update into helper functions Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 19/34] random: vDSO: only access vDSO datapage after random_init() Thomas Weißschuh
2025-11-07 23:46 ` Jason A. Donenfeld
2025-11-10 9:04 ` Thomas Weißschuh
2025-11-10 10:37 ` Jason A. Donenfeld
2025-11-10 11:24 ` Thomas Weißschuh
2025-11-10 11:40 ` Jason A. Donenfeld
2025-11-06 10:02 ` [PATCH v5 20/34] s390/time: Set up vDSO datapage later Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 21/34] vdso/datastore: Reduce scope of some variables in vvar_fault() Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 22/34] vdso/datastore: Drop inclusion of linux/mmap_lock.h Thomas Weißschuh
2025-11-06 10:02 ` Thomas Weißschuh [this message]
2025-11-06 10:02 ` [PATCH v5 24/34] sparc64: vdso: Link with -z noexecstack Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 25/34] sparc64: vdso: Remove obsolete "fake section table" reservation Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 26/34] sparc64: vdso: Replace code patching with runtime conditional Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 27/34] sparc64: vdso: Move hardware counter read into header Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 28/34] sparc64: vdso: Move syscall fallbacks " Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 29/34] sparc64: vdso: Introduce vdso/processor.h Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 30/34] sparc64: vdso: Switch to the generic vDSO library Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 31/34] sparc64: vdso2c: Drop sym_vvar_start handling Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 32/34] sparc64: vdso2c: Remove symbol handling Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 33/34] sparc64: vdso: Implement clock_gettime64() Thomas Weißschuh
2025-11-06 10:02 ` [PATCH v5 34/34] clocksource: remove ARCH_CLOCKSOURCE_DATA Thomas Weißschuh
2025-11-06 12:55 ` [PATCH v5 00/34] sparc64: vdso: Switch to the generic vDSO library Aithal, Srikanth
2025-11-06 14:02 ` Mark Brown
2025-11-06 17:20 ` Arnd Bergmann
2025-11-08 0:17 ` Andy Lutomirski
2025-11-08 10:17 ` Arnd Bergmann
2025-11-09 3:23 ` Maciej W. Rozycki
2025-11-09 16:08 ` Arnd Bergmann
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=20251106-vdso-sparc64-generic-2-v5-23-97ff2b6542f7@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=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 NNTP newsgroup(s).