Skip to content

Commit 56c1c1a

Browse files
SiFiveHollandpalmer-dabbelt
authored andcommitted
riscv: Add tracepoints for SBI calls and returns
These are useful for measuring the latency of SBI calls. The SBI HSM extension is excluded because those functions are called from contexts such as cpuidle where instrumentation is not allowed. Reviewed-by: Andrew Jones <[email protected]> Signed-off-by: Samuel Holland <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent a43fe27 commit 56c1c1a

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed

arch/riscv/include/asm/trace.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
#undef TRACE_SYSTEM
3+
#define TRACE_SYSTEM riscv
4+
5+
#if !defined(_TRACE_RISCV_H) || defined(TRACE_HEADER_MULTI_READ)
6+
#define _TRACE_RISCV_H
7+
8+
#include <linux/tracepoint.h>
9+
10+
TRACE_EVENT_CONDITION(sbi_call,
11+
TP_PROTO(int ext, int fid),
12+
TP_ARGS(ext, fid),
13+
TP_CONDITION(ext != SBI_EXT_HSM),
14+
15+
TP_STRUCT__entry(
16+
__field(int, ext)
17+
__field(int, fid)
18+
),
19+
20+
TP_fast_assign(
21+
__entry->ext = ext;
22+
__entry->fid = fid;
23+
),
24+
25+
TP_printk("ext=0x%x fid=%d", __entry->ext, __entry->fid)
26+
);
27+
28+
TRACE_EVENT_CONDITION(sbi_return,
29+
TP_PROTO(int ext, long error, long value),
30+
TP_ARGS(ext, error, value),
31+
TP_CONDITION(ext != SBI_EXT_HSM),
32+
33+
TP_STRUCT__entry(
34+
__field(long, error)
35+
__field(long, value)
36+
),
37+
38+
TP_fast_assign(
39+
__entry->error = error;
40+
__entry->value = value;
41+
),
42+
43+
TP_printk("error=%ld value=0x%lx", __entry->error, __entry->value)
44+
);
45+
46+
#endif /* _TRACE_RISCV_H */
47+
48+
#undef TRACE_INCLUDE_PATH
49+
#undef TRACE_INCLUDE_FILE
50+
51+
#define TRACE_INCLUDE_PATH asm
52+
#define TRACE_INCLUDE_FILE trace
53+
54+
#include <trace/define_trace.h>

arch/riscv/kernel/sbi.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
#include <asm/smp.h>
1515
#include <asm/tlbflush.h>
1616

17+
#define CREATE_TRACE_POINTS
18+
#include <asm/trace.h>
19+
1720
/* default SBI version is 0.1 */
1821
unsigned long sbi_spec_version __ro_after_init = SBI_SPEC_VERSION_DEFAULT;
1922
EXPORT_SYMBOL(sbi_spec_version);
@@ -31,6 +34,8 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
3134
{
3235
struct sbiret ret;
3336

37+
trace_sbi_call(ext, fid);
38+
3439
register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0);
3540
register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1);
3641
register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2);
@@ -46,6 +51,8 @@ struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
4651
ret.error = a0;
4752
ret.value = a1;
4853

54+
trace_sbi_return(ext, ret.error, ret.value);
55+
4956
return ret;
5057
}
5158
EXPORT_SYMBOL(sbi_ecall);

0 commit comments

Comments
 (0)