mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
ad5d1122b8
Even if RISC-V has supported the vDSO feature, the latency of the functions for obtaining the system time is still expensive. It is because these functions still trigger a corresponding system call in the process, which slows down the response time. If we want to remove the system call to reduce the latency, the kernel should have the ability to output the system clock information to userspace. This patch introduces the vDSO common flow to enable the kernel to achieve the above feature and uses "rdtime" instruction to obtain the current time in the user space. Under this condition, the latency cost by the ecall from U-mode to S-mode can be eliminated. After applying this patch, the latency of gettimeofday() measured on the HiFive unleashed board can be reduced by %61. Signed-off-by: Vincent Chen <vincent.chen@sifive.com> Reviewed-by: Atish Patra <atish.patra@wdc.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
35 lines
996 B
C
35 lines
996 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2012 ARM Limited
|
|
* Copyright (C) 2014 Regents of the University of California
|
|
* Copyright (C) 2017 SiFive
|
|
*/
|
|
|
|
#ifndef _ASM_RISCV_VDSO_H
|
|
#define _ASM_RISCV_VDSO_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
#ifndef GENERIC_TIME_VSYSCALL
|
|
struct vdso_data {
|
|
};
|
|
#endif
|
|
|
|
/*
|
|
* The VDSO symbols are mapped into Linux so we can just use regular symbol
|
|
* addressing to get their offsets in userspace. The symbols are mapped at an
|
|
* offset of 0, but since the linker must support setting weak undefined
|
|
* symbols to the absolute address 0 it also happens to support other low
|
|
* addresses even when the code model suggests those low addresses would not
|
|
* otherwise be availiable.
|
|
*/
|
|
#define VDSO_SYMBOL(base, name) \
|
|
({ \
|
|
extern const char __vdso_##name[]; \
|
|
(void __user *)((unsigned long)(base) + __vdso_##name); \
|
|
})
|
|
|
|
asmlinkage long sys_riscv_flush_icache(uintptr_t, uintptr_t, uintptr_t);
|
|
|
|
#endif /* _ASM_RISCV_VDSO_H */
|