mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 09:06:34 +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>
77 lines
1.7 KiB
C
77 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2012 Regents of the University of California
|
|
*/
|
|
|
|
#ifndef _ASM_RISCV_PROCESSOR_H
|
|
#define _ASM_RISCV_PROCESSOR_H
|
|
|
|
#include <linux/const.h>
|
|
|
|
#include <vdso/processor.h>
|
|
|
|
#include <asm/ptrace.h>
|
|
|
|
/*
|
|
* This decides where the kernel will search for a free chunk of vm
|
|
* space during mmap's.
|
|
*/
|
|
#define TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE / 3)
|
|
|
|
#define STACK_TOP TASK_SIZE
|
|
#define STACK_TOP_MAX STACK_TOP
|
|
#define STACK_ALIGN 16
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
struct task_struct;
|
|
struct pt_regs;
|
|
|
|
/* CPU-specific state of a task */
|
|
struct thread_struct {
|
|
/* Callee-saved registers */
|
|
unsigned long ra;
|
|
unsigned long sp; /* Kernel mode stack */
|
|
unsigned long s[12]; /* s[0]: frame pointer */
|
|
struct __riscv_d_ext_state fstate;
|
|
};
|
|
|
|
#define INIT_THREAD { \
|
|
.sp = sizeof(init_stack) + (long)&init_stack, \
|
|
}
|
|
|
|
#define task_pt_regs(tsk) \
|
|
((struct pt_regs *)(task_stack_page(tsk) + THREAD_SIZE \
|
|
- ALIGN(sizeof(struct pt_regs), STACK_ALIGN)))
|
|
|
|
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->epc)
|
|
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->sp)
|
|
|
|
|
|
/* Do necessary setup to start up a newly executed thread. */
|
|
extern void start_thread(struct pt_regs *regs,
|
|
unsigned long pc, unsigned long sp);
|
|
|
|
/* Free all resources held by a thread. */
|
|
static inline void release_thread(struct task_struct *dead_task)
|
|
{
|
|
}
|
|
|
|
extern unsigned long get_wchan(struct task_struct *p);
|
|
|
|
|
|
static inline void wait_for_interrupt(void)
|
|
{
|
|
__asm__ __volatile__ ("wfi");
|
|
}
|
|
|
|
struct device_node;
|
|
int riscv_of_processor_hartid(struct device_node *node);
|
|
int riscv_of_parent_hartid(struct device_node *node);
|
|
|
|
extern void riscv_fill_hwcap(void);
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* _ASM_RISCV_PROCESSOR_H */
|