Loading...
Note: File does not exist in v4.6.
1// SPDX-License-Identifier: GPL-2.0
2
3// Copyright (C) 2024 Google LLC.
4
5//! Logic for tracepoints.
6
7/// Declare the Rust entry point for a tracepoint.
8///
9/// This macro generates an unsafe function that calls into C, and its safety requirements will be
10/// whatever the relevant C code requires. To document these safety requirements, you may add
11/// doc-comments when invoking the macro.
12#[macro_export]
13macro_rules! declare_trace {
14 ($($(#[$attr:meta])* $pub:vis unsafe fn $name:ident($($argname:ident : $argtyp:ty),* $(,)?);)*) => {$(
15 $( #[$attr] )*
16 #[inline(always)]
17 $pub unsafe fn $name($($argname : $argtyp),*) {
18 #[cfg(CONFIG_TRACEPOINTS)]
19 {
20 // SAFETY: It's always okay to query the static key for a tracepoint.
21 let should_trace = unsafe {
22 $crate::macros::paste! {
23 $crate::jump_label::static_branch_unlikely!(
24 $crate::bindings::[< __tracepoint_ $name >],
25 $crate::bindings::tracepoint,
26 key
27 )
28 }
29 };
30
31 if should_trace {
32 $crate::macros::paste! {
33 // SAFETY: The caller guarantees that it is okay to call this tracepoint.
34 unsafe { $crate::bindings::[< rust_do_trace_ $name >]($($argname),*) };
35 }
36 }
37 }
38
39 #[cfg(not(CONFIG_TRACEPOINTS))]
40 {
41 // If tracepoints are disabled, insert a trivial use of each argument
42 // to avoid unused argument warnings.
43 $( let _unused = $argname; )*
44 }
45 }
46 )*}
47}
48
49pub use declare_trace;