summaryrefslogtreecommitdiffstats
path: root/arch/riscv/include/asm/vdso/processor.h
diff options
context:
space:
mode:
authorVincent Chen <vincent.chen@sifive.com>2020-06-09 22:14:48 +0800
committerPalmer Dabbelt <palmerdabbelt@google.com>2020-06-10 19:47:16 -0700
commitad5d1122b82fbd6a816d1b9d26ee01a6dbc2d757 (patch)
tree5e78643855b7be7a1bcffc4c7ee2769323ab181f /arch/riscv/include/asm/vdso/processor.h
parent05589dde649cd954a122b0ebb2cbe4ade8a80e98 (diff)
downloadlinux-ad5d1122b82fbd6a816d1b9d26ee01a6dbc2d757.tar.gz
linux-ad5d1122b82fbd6a816d1b9d26ee01a6dbc2d757.tar.bz2
linux-ad5d1122b82fbd6a816d1b9d26ee01a6dbc2d757.zip
riscv: use vDSO common flow to reduce the latency of the time-related functions
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>
Diffstat (limited to 'arch/riscv/include/asm/vdso/processor.h')
-rw-r--r--arch/riscv/include/asm/vdso/processor.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/riscv/include/asm/vdso/processor.h b/arch/riscv/include/asm/vdso/processor.h
new file mode 100644
index 000000000000..82a5693b1861
--- /dev/null
+++ b/arch/riscv/include/asm/vdso/processor.h
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_VDSO_PROCESSOR_H
+#define __ASM_VDSO_PROCESSOR_H
+
+#ifndef __ASSEMBLY__
+
+static inline void cpu_relax(void)
+{
+#ifdef __riscv_muldiv
+ int dummy;
+ /* In lieu of a halt instruction, induce a long-latency stall. */
+ __asm__ __volatile__ ("div %0, %0, zero" : "=r" (dummy));
+#endif
+ barrier();
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_VDSO_PROCESSOR_H */