From nobody Thu Oct 2 12:04:39 2025 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 701792E92D0; Wed, 17 Sep 2025 14:02:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758117735; cv=none; b=ce/V7Ye5bSPky1xVcGTtQFrmDJgwF80lUB1AsdVGeOwLQVArvJpba4GQlwjxg2RAgOzNDrjrmSd/WTCFVHo/VTZRpCmG/4nCegCmrLlussCngIqzsRMmQ4E3eIfr9rY8OHeUo248DP7JcVGFW3SJyDMbq6LgL69OabwCmqv2y/s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758117735; c=relaxed/simple; bh=QgZWh2CTRuRkVkUn1WW0CJWymakhf5V9YWE5DyFtGgI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BYMEcjx30lLSOUUhP3VziXnvT/wsP4vZeNrzSdTLlIfb+QpSlCUEdCi3Lu6w+AIVPE1elOs6qggR0skAyiJrUDzzg6Gz6P1vrIQ2xyjfsQz0d4bwNiEHTsVvBLogKG7YYv7HwIR9TBgUVzv3upl3rnYzVXXLxtWa28APSfr51Z0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=zzcQj+H+; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=GTuw+m+w; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="zzcQj+H+"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="GTuw+m+w" From: =?utf-8?q?Thomas_Wei=C3=9Fschuh?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1758117728; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Gpmb9cDwEzk02Y+DfJzHKrCKqKqd+Vk47vVVsRIqy1A=; b=zzcQj+H+wV5XHh7JlmQgfczb/SrRXVkOy25S1jepBvRY1OvCDzb0SJCkznPomBX9mcgfqF /ZYOkCYJis4p6VSLvvhey+9FR+llhxD/ioegVLEy6q2nsdjOJRDj4L92e+gfwsHHc7aLBT WAxmW2WVLQrlrl+9xqJ0YeplQxUmBwwooT1LSX0mDpGzhqX0Lg5TzIYdtLFydRxNHAyZjR 9wlheU8BHYcKkSSJZ18mF61aXUDCQ1AIhdN3YbwX7YvjwoTE5S4BQeWZuh7g4M9/Rb1I43 HyEVJiFPQMWc0/bsduhYPPqU5u6dFf0GXivewKKUYVBT8UeBOecHV2X5jKUB8g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1758117728; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Gpmb9cDwEzk02Y+DfJzHKrCKqKqd+Vk47vVVsRIqy1A=; b=GTuw+m+wQOSdJ2yMAXigPYcPa71hWYh+ILRSyBQvDKyMeYS8Wfje/LSrijnvlSXpaQR3m/ wxvLNd6jekFY0BDQ== Date: Wed, 17 Sep 2025 16:00:26 +0200 Subject: [PATCH v3 24/36] vdso/datastore: Allocate data pages dynamically Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250917-vdso-sparc64-generic-2-v3-24-3679b1bc8ee8@linutronix.de> References: <20250917-vdso-sparc64-generic-2-v3-0-3679b1bc8ee8@linutronix.de> In-Reply-To: <20250917-vdso-sparc64-generic-2-v3-0-3679b1bc8ee8@linutronix.de> To: Andy Lutomirski , Thomas Gleixner , Vincenzo Frascino , Arnd Bergmann , "David S. Miller" , Andreas Larsson , Nick Alcock , John Stultz , Stephen Boyd , John Paul Adrian Glaubitz , Shuah Khan , Catalin Marinas , Will Deacon , Theodore Ts'o , "Jason A. Donenfeld" , Russell King , Madhavan Srinivasan , Michael Ellerman , Nicholas Piggin , Christophe Leroy , Huacai Chen , WANG Xuerui , Thomas Bogendoerfer , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Christian Borntraeger , Sven Schnelle , Nagarathnam Muthusamy , Shannon Nelson 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, =?utf-8?q?Thomas_Wei=C3=9Fschuh?= X-Developer-Signature: v=1; a=ed25519-sha256; t=1758117712; l=4686; i=thomas.weissschuh@linutronix.de; s=20240209; h=from:subject:message-id; bh=QgZWh2CTRuRkVkUn1WW0CJWymakhf5V9YWE5DyFtGgI=; b=pOWKEqrLPj1SLyPcTKi14JdVomBv9bCCXIehSogW2jrTVnFtKz2E7s3mSIq15X4wwIsu4UKkw rJVX1dAWNHLA5UUNnHFOZ/ONopbJqhLqNpaKXm/JddK/gB3KKSSLbi2 X-Developer-Key: i=thomas.weissschuh@linutronix.de; a=ed25519; pk=pfvxvpFUDJV2h2nY0FidLUml22uGLSjByFbM6aqQQws= 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=C3=9Fschuh --- 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..0b530428db711e58660e797d9d3= cf5dce60217fe 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 =20 +#ifdef CONFIG_HAVE_GENERIC_VDSO #include =20 extern const struct vm_special_mapping vdso_vvar_mapping; struct vm_area_struct *vdso_install_vvar_mapping(struct mm_struct *mm, uns= igned long addr); =20 +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..0d4510a7a5c21a47a040c05da1d= b919211706a7e 100644 --- a/init/main.c +++ b/init/main.c @@ -103,6 +103,7 @@ #include #include #include +#include #include =20 #include @@ -1007,6 +1008,7 @@ void start_kernel(void) srcu_init(); hrtimers_init(); softirq_init(); + vdso_setup_data_pages(); timekeeping_init(); time_init(); =20 diff --git a/lib/vdso/datastore.c b/lib/vdso/datastore.c index 6e5feb4a95b85f5a1cbdced7cdeddc593fcbad40..67799e8919c202e0800cb78ff70= 919f9604ac492 100644 --- a/lib/vdso/datastore.c +++ b/lib/vdso/datastore.c @@ -1,41 +1,43 @@ // SPDX-License-Identifier: GPL-2.0-only =20 -#include #include #include #include #include #include =20 -/* - * 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 =3D &vdso_time_data_store.data; -static_assert(sizeof(vdso_time_data_store) =3D=3D PAGE_SIZE); +struct vdso_time_data *vdso_k_time_data; +static_assert(sizeof(struct vdso_time_data) <=3D PAGE_SIZE); #endif /* CONFIG_GENERIC_GETTIMEOFDAY */ =20 #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 =3D &vdso_rng_data_store.data; -static_assert(sizeof(vdso_rng_data_store) =3D=3D PAGE_SIZE); +struct vdso_rng_data *vdso_k_rng_data; +static_assert(sizeof(struct vdso_rng_data) <=3D PAGE_SIZE); #endif /* CONFIG_VDSO_GETRANDOM */ =20 #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 =3D &vdso_arch_data_store.data; +struct vdso_arch_data *vdso_k_arch_data; #endif /* CONFIG_ARCH_HAS_VDSO_ARCH_DATA */ =20 +void __init vdso_setup_data_pages(void) +{ + unsigned int order =3D get_order(VDSO_NR_PAGES * PAGE_SIZE); + struct folio *folio =3D folio_alloc(GFP_KERNEL, order); + + if (!folio) + panic("Unable to allocate VDSO storage pages"); + + if (IS_ENABLED(CONFIG_GENERIC_GETTIMEOFDAY)) + vdso_k_time_data =3D page_address(folio_page(folio, VDSO_TIME_PAGE_OFFSE= T)); + + if (IS_ENABLED(CONFIG_VDSO_GETRANDOM)) + vdso_k_rng_data =3D page_address(folio_page(folio, VDSO_RNG_PAGE_OFFSET)= ); + + if (IS_ENABLED(CONFIG_ARCH_HAS_VDSO_ARCH_DATA)) + vdso_k_arch_data =3D page_address(folio_page(folio, VDSO_ARCH_PAGES_STAR= T)); +} + static vm_fault_t vvar_fault(const struct vm_special_mapping *sm, struct vm_area_struct *vma, struct vm_fault *vmf) { --=20 2.51.0