mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
Merge tag 'timers-vdso-2026-06-13' of gitolite.kernel.org:pub/scm/linux/kernel/git/tip/tip
Pull vdso updates from Thomas Gleixner: - Remove the redundant CONFIG_GENERIC_TIME_VSYSCALL after converting the remaining users over. - Rework and sanitize the MIPS VDSO handling, so it does not handle the time related VDSO if there is no VDSO capable clocksource available. Also stop mapping VDSO data pages unconditionally even if there is no usage possible. * tag 'timers-vdso-2026-06-13' of gitolite.kernel.org:pub/scm/linux/kernel/git/tip/tip: MIPS: VDSO: Fold MIPS_CLOCK_VSYSCALL into MIPS_GENERIC_GETTIMEOFDAY MIPS: VDSO: Gate microMIPS restriction on GCC version MIPS: VDSO: Fold MIPS_DISABLE_VDSO into MIPS_GENERIC_GETTIMEOFDAY clocksource/drivers/mips-gic-timer: Only use VDSO_CLOCKMODE_GIC when it is a available MIPS: csrc-r4k: Only use VDSO_CLOCKMODE_R4K when it is a available MIPS: VDSO: Only map the data pages when the vDSO is used MIPS: Introduce Kconfig MIPS_GENERIC_GETTIMEOFDAY vdso/datastore: Always provide symbol declarations MAINTAINERS: Add include/linux/vdso_datastore.h to vDSO block vdso/gettimeofday: Rename __arch_get_vdso_u_timens_data() vdso/treewide: Drop GENERIC_TIME_VSYSCALL vdso/vsyscall: Gate update_vsyscall() behind CONFIG_GENERIC_GETTIMEOFDAY riscv: vdso: Drop CONFIG_GENERIC_TIME_VSYSCALL guard around syscall fallbacks
This commit is contained in:
@@ -10873,6 +10873,7 @@ L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/vdso
|
||||
F: include/asm-generic/vdso/vsyscall.h
|
||||
F: include/linux/vdso_datastore.h
|
||||
F: include/vdso/
|
||||
F: kernel/time/namespace_vdso.c
|
||||
F: kernel/time/vsyscall.c
|
||||
|
||||
@@ -925,7 +925,6 @@ config VDSO
|
||||
depends on AEABI && MMU && CPU_V7
|
||||
default y if ARM_ARCH_TIMER
|
||||
select HAVE_GENERIC_VDSO
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
help
|
||||
Place in the process address space an ELF shared object
|
||||
|
||||
@@ -140,7 +140,6 @@ config ARM64
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
select HARDIRQS_SW_RESEND
|
||||
select HAS_IOPORT
|
||||
|
||||
@@ -110,7 +110,6 @@ config LOONGARCH
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL if GENERIC_GETTIMEOFDAY
|
||||
select GPIOLIB
|
||||
select HAS_IOPORT
|
||||
select HAVE_ALIGNED_STRUCT_PAGE if 64BIT
|
||||
|
||||
@@ -38,7 +38,6 @@ config MIPS
|
||||
select GENERIC_BUILTIN_DTB if BUILTIN_DTB
|
||||
select GENERIC_CMOS_UPDATE
|
||||
select GENERIC_CPU_AUTOPROBE
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_ISA_DMA if EISA
|
||||
@@ -51,7 +50,6 @@ config MIPS
|
||||
select GENERIC_SCHED_CLOCK if !CAVIUM_OCTEON_SOC
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_IDLE_POLL_SETUP
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select GUP_GET_PXX_LOW_HIGH if CPU_MIPS32 && PHYS_ADDR_T_64BIT
|
||||
select HAS_IOPORT if !NO_IOPORT_MAP || ISA
|
||||
select HAVE_ARCH_COMPILER_H
|
||||
@@ -76,7 +74,6 @@ config MIPS
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select HAVE_GCC_PLUGINS
|
||||
select HAVE_GENERIC_VDSO
|
||||
select HAVE_IOREMAP_PROT
|
||||
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
||||
select HAVE_IRQ_TIME_ACCOUNTING
|
||||
@@ -1136,9 +1133,6 @@ config CSRC_R4K
|
||||
config CSRC_SB1250
|
||||
bool
|
||||
|
||||
config MIPS_CLOCK_VSYSCALL
|
||||
def_bool CSRC_R4K || CLKSRC_MIPS_GIC
|
||||
|
||||
config GPIO_TXX9
|
||||
select GPIOLIB
|
||||
bool
|
||||
@@ -3170,6 +3164,16 @@ endmenu
|
||||
config MIPS_EXTERNAL_TIMER
|
||||
bool
|
||||
|
||||
config MIPS_GENERIC_GETTIMEOFDAY
|
||||
def_bool y
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
select HAVE_GENERIC_VDSO
|
||||
depends on CSRC_R4K || CLKSRC_MIPS_GIC
|
||||
# GCC (at least up to version 9.2) appears to emit function calls that make use
|
||||
# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
|
||||
# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
|
||||
depends on !(CPU_MICROMIPS && CC_IS_GCC && GCC_VERSION < 90300)
|
||||
|
||||
menu "CPU Power Management"
|
||||
|
||||
if CPU_SUPPORTS_CPUFREQ && MIPS_EXTERNAL_TIMER
|
||||
@@ -3181,5 +3185,3 @@ source "drivers/cpuidle/Kconfig"
|
||||
endmenu
|
||||
|
||||
source "arch/mips/kvm/Kconfig"
|
||||
|
||||
source "arch/mips/vdso/Kconfig"
|
||||
|
||||
@@ -126,12 +126,14 @@ int __init init_r4k_clocksource(void)
|
||||
clocksource_mips.rating = 200;
|
||||
clocksource_mips.rating += clamp(mips_hpt_frequency / 10000000, 0, 99);
|
||||
|
||||
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
|
||||
/*
|
||||
* R2 onwards makes the count accessible to user mode so it can be used
|
||||
* by the VDSO (HWREna is configured by configure_hwrena()).
|
||||
*/
|
||||
if (cpu_has_mips_r2_r6 && rdhwr_count_usable())
|
||||
clocksource_mips.vdso_clock_mode = VDSO_CLOCKMODE_R4K;
|
||||
#endif
|
||||
|
||||
clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
||||
* This ensures that when the kernel updates the VDSO data userland
|
||||
* will observe it without requiring cache invalidations.
|
||||
*/
|
||||
if (cpu_has_dc_aliases) {
|
||||
if (cpu_has_dc_aliases && IS_ENABLED(CONFIG_HAVE_GENERIC_VDSO)) {
|
||||
base = __ALIGN_MASK(base, shm_align_mask);
|
||||
base += ((unsigned long)vdso_k_time_data - gic_size) & shm_align_mask;
|
||||
}
|
||||
@@ -137,10 +137,12 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
||||
data_addr = base + gic_size;
|
||||
vdso_addr = data_addr + VDSO_NR_PAGES * PAGE_SIZE;
|
||||
|
||||
vma = vdso_install_vvar_mapping(mm, data_addr);
|
||||
if (IS_ERR(vma)) {
|
||||
ret = PTR_ERR(vma);
|
||||
goto out;
|
||||
if (IS_ENABLED(CONFIG_HAVE_GENERIC_VDSO)) {
|
||||
vma = vdso_install_vvar_mapping(mm, data_addr);
|
||||
if (IS_ERR(vma)) {
|
||||
ret = PTR_ERR(vma);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* Map GIC user page. */
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
# GCC (at least up to version 9.2) appears to emit function calls that make use
|
||||
# of the GOT when targeting microMIPS, which we can't use in the VDSO due to
|
||||
# the lack of relocations. As such, we disable the VDSO for microMIPS builds.
|
||||
|
||||
config MIPS_DISABLE_VDSO
|
||||
def_bool CPU_MICROMIPS
|
||||
@@ -4,7 +4,7 @@
|
||||
# Include the generic Makefile to check the built vdso.
|
||||
include $(srctree)/lib/vdso/Makefile.include
|
||||
|
||||
obj-vdso-y := elf.o vgettimeofday.o sigreturn.o
|
||||
obj-vdso-y := elf.o sigreturn.o
|
||||
|
||||
# Common compiler flags between ABIs.
|
||||
ccflags-vdso := \
|
||||
@@ -36,6 +36,7 @@ aflags-vdso := $(ccflags-vdso) \
|
||||
-D__ASSEMBLY__ -Wa,-gdwarf-2
|
||||
|
||||
ifneq ($(c-gettimeofday-y),)
|
||||
obj-vdso-y += vgettimeofday.o
|
||||
CFLAGS_vgettimeofday.o = -include $(c-gettimeofday-y)
|
||||
|
||||
# config-n32-o32-env.c prepares the environment to build a 32bit vDSO
|
||||
@@ -47,10 +48,6 @@ endif
|
||||
|
||||
CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE)
|
||||
|
||||
ifdef CONFIG_MIPS_DISABLE_VDSO
|
||||
obj-vdso-y := $(filter-out vgettimeofday.o, $(obj-vdso-y))
|
||||
endif
|
||||
|
||||
# VDSO linker flags.
|
||||
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
||||
$(filter -E%,$(KBUILD_CFLAGS)) -shared \
|
||||
|
||||
@@ -94,12 +94,10 @@ PHDRS
|
||||
VERSION
|
||||
{
|
||||
LINUX_2.6 {
|
||||
#ifndef CONFIG_MIPS_DISABLE_VDSO
|
||||
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
|
||||
global:
|
||||
__vdso_clock_gettime;
|
||||
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
||||
__vdso_gettimeofday;
|
||||
#endif
|
||||
__vdso_clock_getres;
|
||||
#if _MIPS_SIM != _MIPS_SIM_ABI64
|
||||
__vdso_clock_gettime64;
|
||||
|
||||
@@ -18,22 +18,12 @@ int __vdso_clock_gettime(clockid_t clock,
|
||||
return __cvdso_clock_gettime32(clock, ts);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
||||
|
||||
/*
|
||||
* This is behind the ifdef so that we don't provide the symbol when there's no
|
||||
* possibility of there being a usable clocksource, because there's nothing we
|
||||
* can do without it. When libc fails the symbol lookup it should fall back on
|
||||
* the standard syscall path.
|
||||
*/
|
||||
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
||||
struct timezone *tz)
|
||||
{
|
||||
return __cvdso_gettimeofday(tv, tz);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
|
||||
|
||||
int __vdso_clock_getres(clockid_t clock_id,
|
||||
struct old_timespec32 *res)
|
||||
{
|
||||
@@ -59,22 +49,12 @@ int __vdso_clock_gettime(clockid_t clock,
|
||||
return __cvdso_clock_gettime(clock, ts);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MIPS_CLOCK_VSYSCALL
|
||||
|
||||
/*
|
||||
* This is behind the ifdef so that we don't provide the symbol when there's no
|
||||
* possibility of there being a usable clocksource, because there's nothing we
|
||||
* can do without it. When libc fails the symbol lookup it should fall back on
|
||||
* the standard syscall path.
|
||||
*/
|
||||
int __vdso_gettimeofday(struct __kernel_old_timeval *tv,
|
||||
struct timezone *tz)
|
||||
{
|
||||
return __cvdso_gettimeofday(tv, tz);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MIPS_CLOCK_VSYSCALL */
|
||||
|
||||
int __vdso_clock_getres(clockid_t clock_id,
|
||||
struct __kernel_timespec *res)
|
||||
{
|
||||
|
||||
@@ -213,7 +213,6 @@ config PPC
|
||||
select GENERIC_IRQ_SHOW_LEVEL
|
||||
select GENERIC_PCI_IOMAP if PCI
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select HAS_IOPORT if PCI
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
select HAVE_ARCH_HUGE_VMALLOC if HAVE_ARCH_HUGE_VMAP
|
||||
|
||||
@@ -122,7 +122,6 @@ config RISCV
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL if GENERIC_GETTIMEOFDAY
|
||||
select HARDIRQS_SW_RESEND
|
||||
select HAS_IOPORT if MMU
|
||||
select HAVE_ALIGNED_STRUCT_PAGE
|
||||
|
||||
@@ -9,12 +9,6 @@
|
||||
#include <asm/csr.h>
|
||||
#include <uapi/linux/time.h>
|
||||
|
||||
/*
|
||||
* 32-bit land is lacking generic time vsyscalls as well as the legacy 32-bit
|
||||
* time syscalls like gettimeofday. Skip these definitions since on 32-bit.
|
||||
*/
|
||||
#ifdef CONFIG_GENERIC_TIME_VSYSCALL
|
||||
|
||||
#define VDSO_HAS_CLOCK_GETRES 1
|
||||
|
||||
static __always_inline
|
||||
@@ -66,8 +60,6 @@ int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_GENERIC_TIME_VSYSCALL */
|
||||
|
||||
static __always_inline u64 __arch_get_hw_counter(s32 clock_mode,
|
||||
const struct vdso_time_data *vd)
|
||||
{
|
||||
|
||||
@@ -174,7 +174,6 @@ config S390
|
||||
select GENERIC_ENTRY
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select GENERIC_IOREMAP if PCI
|
||||
select HAVE_ALIGNED_STRUCT_PAGE
|
||||
select HAVE_ARCH_AUDITSYSCALL
|
||||
|
||||
@@ -103,7 +103,6 @@ config SPARC64
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select ARCH_USE_QUEUED_RWLOCKS
|
||||
select ARCH_USE_QUEUED_SPINLOCKS
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select ARCH_HAS_PTE_SPECIAL
|
||||
select PCI_DOMAINS if PCI
|
||||
select ARCH_HAS_GIGANTIC_PAGE
|
||||
|
||||
@@ -178,7 +178,6 @@ config X86
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_PENDING_IRQ if SMP
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select GENERIC_GETTIMEOFDAY
|
||||
select GENERIC_VDSO_OVERFLOW_PROTECT
|
||||
select GUP_GET_PXX_LOW_HIGH if X86_PAE
|
||||
|
||||
@@ -198,7 +198,9 @@ static struct clocksource gic_clocksource = {
|
||||
.name = "GIC",
|
||||
.read = gic_hpt_read,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
|
||||
.vdso_clock_mode = VDSO_CLOCKMODE_GIC,
|
||||
#endif
|
||||
};
|
||||
|
||||
static void gic_clocksource_unstable(char *reason)
|
||||
|
||||
@@ -190,7 +190,7 @@ struct timekeeper {
|
||||
s32 tai_offset;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_GENERIC_TIME_VSYSCALL
|
||||
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
|
||||
|
||||
extern void update_vsyscall(struct timekeeper *tk);
|
||||
extern void update_vsyscall_tz(void);
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
#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);
|
||||
|
||||
#ifdef CONFIG_HAVE_GENERIC_VDSO
|
||||
void __init vdso_setup_data_pages(void);
|
||||
#else /* !CONFIG_HAVE_GENERIC_VDSO */
|
||||
static inline void vdso_setup_data_pages(void) { }
|
||||
|
||||
@@ -16,10 +16,6 @@ config ARCH_CLOCKSOURCE_INIT
|
||||
config ARCH_WANTS_CLOCKSOURCE_READ_INLINE
|
||||
bool
|
||||
|
||||
# Timekeeping vsyscall support
|
||||
config GENERIC_TIME_VSYSCALL
|
||||
bool
|
||||
|
||||
# The generic clock events infrastructure
|
||||
config GENERIC_CLOCKEVENTS
|
||||
def_bool !LEGACY_TIMER_TICK
|
||||
|
||||
@@ -126,7 +126,7 @@ bool vdso_get_timestamp(const struct vdso_time_data *vd, const struct vdso_clock
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
const struct vdso_time_data *__arch_get_vdso_u_timens_data(const struct vdso_time_data *vd)
|
||||
const struct vdso_time_data *vdso_timens_data(const struct vdso_time_data *vd)
|
||||
{
|
||||
return (void *)vd + PAGE_SIZE;
|
||||
}
|
||||
@@ -135,7 +135,7 @@ static __always_inline
|
||||
bool do_hres_timens(const struct vdso_time_data *vdns, const struct vdso_clock *vcns,
|
||||
clockid_t clk, struct __kernel_timespec *ts)
|
||||
{
|
||||
const struct vdso_time_data *vd = __arch_get_vdso_u_timens_data(vdns);
|
||||
const struct vdso_time_data *vd = vdso_timens_data(vdns);
|
||||
const struct timens_offset *offs = &vcns->offset[clk];
|
||||
const struct vdso_clock *vc = vd->clock_data;
|
||||
u32 seq;
|
||||
@@ -191,7 +191,7 @@ static __always_inline
|
||||
bool do_coarse_timens(const struct vdso_time_data *vdns, const struct vdso_clock *vcns,
|
||||
clockid_t clk, struct __kernel_timespec *ts)
|
||||
{
|
||||
const struct vdso_time_data *vd = __arch_get_vdso_u_timens_data(vdns);
|
||||
const struct vdso_time_data *vd = vdso_timens_data(vdns);
|
||||
const struct timens_offset *offs = &vcns->offset[clk];
|
||||
const struct vdso_clock *vc = vd->clock_data;
|
||||
const struct vdso_timestamp *vdso_ts;
|
||||
@@ -250,7 +250,7 @@ bool do_aux(const struct vdso_time_data *vd, clockid_t clock, struct __kernel_ti
|
||||
do {
|
||||
while (vdso_read_begin_timens(vc, &seq)) {
|
||||
/* Re-read from the real time data page, reload seq by looping */
|
||||
vd = __arch_get_vdso_u_timens_data(vd);
|
||||
vd = vdso_timens_data(vd);
|
||||
vc = &vd->aux_clock_data[idx];
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ __cvdso_gettimeofday_data(const struct vdso_time_data *vd,
|
||||
|
||||
if (unlikely(tz != NULL)) {
|
||||
if (vdso_is_timens_clock(vc))
|
||||
vd = __arch_get_vdso_u_timens_data(vd);
|
||||
vd = vdso_timens_data(vd);
|
||||
|
||||
tz->tz_minuteswest = vd[CS_HRES_COARSE].tz_minuteswest;
|
||||
tz->tz_dsttime = vd[CS_HRES_COARSE].tz_dsttime;
|
||||
@@ -383,7 +383,7 @@ __cvdso_time_data(const struct vdso_time_data *vd, __kernel_old_time_t *time)
|
||||
__kernel_old_time_t t;
|
||||
|
||||
if (vdso_is_timens_clock(vc)) {
|
||||
vd = __arch_get_vdso_u_timens_data(vd);
|
||||
vd = vdso_timens_data(vd);
|
||||
vc = vd->clock_data;
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ bool __cvdso_clock_getres_common(const struct vdso_time_data *vd, clockid_t cloc
|
||||
return false;
|
||||
|
||||
if (vdso_is_timens_clock(vc))
|
||||
vd = __arch_get_vdso_u_timens_data(vd);
|
||||
vd = vdso_timens_data(vd);
|
||||
|
||||
/*
|
||||
* Convert the clockid to a bitmask and use it to check which
|
||||
|
||||
Reference in New Issue
Block a user