mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
The hwprobe vDSO data for some keys, like MISALIGNED_VECTOR_PERF,
is determined by an asynchronous kthread. This can create a race
condition where the kthread finishes after the vDSO data has
already been populated, causing userspace to read stale values.
To fix this race, a new 'ready' flag is added to the vDSO data,
initialized to 'false' during arch_initcall_sync. This flag is
checked by both the vDSO's user-space code and the riscv_hwprobe
syscall. The syscall serves as a one-time gate, using a completion
to wait for any pending probes before populating the data and
setting the flag to 'true', thus ensuring userspace reads fresh
values on its first request.
Reported-by: Tsukasa OI <research_trasio@irq.a4lg.com>
Closes: https://lore.kernel.org/linux-riscv/760d637b-b13b-4518-b6bf-883d55d44e7f@irq.a4lg.com/
Fixes: e7c9d66e31 ("RISC-V: Report vector unaligned access speed hwprobe")
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Alexandre Ghiti <alexghiti@rivosinc.com>
Cc: Olof Johansson <olof@lixom.net>
Cc: stable@vger.kernel.org
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Co-developed-by: Palmer Dabbelt <palmer@dabbelt.com>
Signed-off-by: Palmer Dabbelt <palmer@dabbelt.com>
Signed-off-by: Jingwei Wang <wangjingwei@iscas.ac.cn>
Link: https://lore.kernel.org/r/20250811142035.105820-1-wangjingwei@iscas.ac.cn
[pjw@kernel.org: fix checkpatch issues]
Signed-off-by: Paul Walmsley <pjw@kernel.org>
24 lines
638 B
C
24 lines
638 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __RISCV_ASM_VDSO_ARCH_DATA_H
|
|
#define __RISCV_ASM_VDSO_ARCH_DATA_H
|
|
|
|
#include <linux/types.h>
|
|
#include <vdso/datapage.h>
|
|
#include <asm/hwprobe.h>
|
|
|
|
struct vdso_arch_data {
|
|
/* Stash static answers to the hwprobe queries when all CPUs are selected. */
|
|
__u64 all_cpu_hwprobe_values[RISCV_HWPROBE_MAX_KEY + 1];
|
|
|
|
/* Boolean indicating all CPUs have the same static hwprobe values. */
|
|
__u8 homogeneous_cpus;
|
|
|
|
/*
|
|
* A gate to check and see if the hwprobe data is actually ready, as
|
|
* probing is deferred to avoid boot slowdowns.
|
|
*/
|
|
__u8 ready;
|
|
};
|
|
|
|
#endif /* __RISCV_ASM_VDSO_ARCH_DATA_H */
|