mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 12:15:35 +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>
38 lines
855 B
C
38 lines
855 B
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright (C) 2012 Regents of the University of California
|
|
* Copyright (C) 2017 SiFive
|
|
*/
|
|
|
|
#include <linux/clocksource.h>
|
|
#include <linux/delay.h>
|
|
#include <asm/sbi.h>
|
|
#include <asm/processor.h>
|
|
|
|
unsigned long riscv_timebase;
|
|
EXPORT_SYMBOL_GPL(riscv_timebase);
|
|
|
|
void __init time_init(void)
|
|
{
|
|
struct device_node *cpu;
|
|
u32 prop;
|
|
|
|
cpu = of_find_node_by_path("/cpus");
|
|
if (!cpu || of_property_read_u32(cpu, "timebase-frequency", &prop))
|
|
panic(KERN_WARNING "RISC-V system with no 'timebase-frequency' in DTS\n");
|
|
of_node_put(cpu);
|
|
riscv_timebase = prop;
|
|
|
|
lpj_fine = riscv_timebase / HZ;
|
|
timer_probe();
|
|
}
|
|
|
|
void clocksource_arch_init(struct clocksource *cs)
|
|
{
|
|
#ifdef CONFIG_GENERIC_GETTIMEOFDAY
|
|
cs->vdso_clock_mode = VDSO_CLOCKMODE_ARCHTIMER;
|
|
#else
|
|
cs->vdso_clock_mode = VDSO_CLOCKMODE_NONE;
|
|
#endif
|
|
}
|