mirror of
https://github.com/torvalds/linux.git
synced 2026-09-21 20:24:02 +02:00
riscv: hwprobe: Register unaligned probes before usermode
The hwprobe vDSO data is populated by the first riscv_hwprobe syscall.
Some values, such as MISALIGNED_VECTOR_PERF, may depend on the async
vector unaligned access speed probe registered by
check_unaligned_access_all_cpus().
That initcall currently runs at late_initcall level. However,
rootfs_initcall enables usermode helpers before late initcalls run, so an
early helper can execute userspace and call riscv_hwprobe first.
In that case complete_hwprobe_vdso_data() consumes the initial
pending_boot_probes reference, populates the vDSO cache, and marks it
ready before the later async probe is registered. The eventual probe
result then cannot update the already-ready cache.
Move check_unaligned_access_all_cpus() to fs_initcall_sync. This still
runs after clocksource_done_booting(), so the ktime_get_mono_fast_ns()
benchmark uses a stable clocksource, but it runs before rootfs_initcall
enables usermode helpers.
Any async hwprobe probe is therefore registered before userspace can
trigger the one-time vDSO cache population.
Cc: stable@vger.kernel.org
Fixes: 6455c6c118 ("riscv: Clean up & optimize unaligned scalar access probe")
Signed-off-by: Rui Qi <qirui.001@bytedance.com>
Reviewed-by: Nam Cao <namcao@linutronix.de>
Link: https://patch.msgid.link/20260721150511.1607105-1-qirui.001@bytedance.com
Signed-off-by: Paul Walmsley <pjw@kernel.org>
This commit is contained in:
parent
2820d227ad
commit
994dad686e
|
|
@ -411,4 +411,10 @@ static int __init check_unaligned_access_all_cpus(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(check_unaligned_access_all_cpus);
|
||||
/*
|
||||
* Run after clocksource_done_booting() so measure_cycles() uses a stable
|
||||
* clocksource, but before rootfs_initcall() enables usermode helpers. Those
|
||||
* helpers can reach hwprobe and populate the vDSO cache, so async hwprobe
|
||||
* probes must be registered first.
|
||||
*/
|
||||
fs_initcall_sync(check_unaligned_access_all_cpus);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user