Skip to content

Commit 9af9c51

Browse files
d-e-s-oanakryiko
authored andcommitted
examples/rust: Simplify profile perf event code
Simplify the perf event open code. Less leakage, less noise, same functionality (?). Signed-off-by: Daniel Müller <[email protected]>
1 parent 6c49d27 commit 9af9c51

File tree

2 files changed

+27
-20
lines changed

2 files changed

+27
-20
lines changed

examples/rust/profile/src/main.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,25 @@ struct stacktrace_event {
4646
fn init_perf_monitor(freq: u64, sw_event: bool) -> Result<Vec<i32>, libbpf_rs::Error> {
4747
let nprocs = libbpf_rs::num_possible_cpus().unwrap();
4848
let pid = -1;
49-
let buf: Vec<u8> = vec![0; mem::size_of::<syscall::perf_event_attr>()];
50-
let mut attr = unsafe {
51-
Box::<syscall::perf_event_attr>::from_raw(
52-
buf.leak().as_mut_ptr() as *mut syscall::perf_event_attr
53-
)
54-
};
55-
attr._type = if sw_event {
56-
syscall::PERF_TYPE_SOFTWARE
57-
} else {
58-
syscall::PERF_TYPE_HARDWARE
49+
let attr = syscall::perf_event_attr {
50+
_type: if sw_event {
51+
syscall::PERF_TYPE_SOFTWARE
52+
} else {
53+
syscall::PERF_TYPE_HARDWARE
54+
},
55+
size: mem::size_of::<syscall::perf_event_attr>() as u32,
56+
config: if sw_event {
57+
syscall::PERF_COUNT_SW_CPU_CLOCK
58+
} else {
59+
syscall::PERF_COUNT_HW_CPU_CYCLES
60+
},
61+
sample: syscall::sample_un { sample_freq: freq },
62+
flags: 1 << 10, // freq = 1
63+
..Default::default()
5964
};
60-
attr.size = mem::size_of::<syscall::perf_event_attr>() as u32;
61-
attr.config = if sw_event {
62-
syscall::PERF_COUNT_SW_CPU_CLOCK
63-
} else {
64-
syscall::PERF_COUNT_HW_CPU_CYCLES
65-
};
66-
attr.sample.sample_freq = freq;
67-
attr.flags = 1 << 10; // freq = 1
6865
(0..nprocs)
6966
.map(|cpu| {
70-
let fd = syscall::perf_event_open(attr.as_ref(), pid, cpu as i32, -1, 0) as i32;
67+
let fd = syscall::perf_event_open(&attr, pid, cpu as i32, -1, 0) as i32;
7168
if fd == -1 {
7269
let mut error_context = "Failed to open perf event.";
7370
let os_error = io::Error::last_os_error();
@@ -275,7 +272,9 @@ fn main() -> Result<(), libbpf_rs::Error> {
275272

276273
let mut builder = libbpf_rs::RingBufferBuilder::new();
277274
builder
278-
.add(&skel.maps.events, move |data| event_handler(&symbolizer, data))
275+
.add(&skel.maps.events, move |data| {
276+
event_handler(&symbolizer, data)
277+
})
279278
.unwrap();
280279
let ringbuf = builder.build().unwrap();
281280
while ringbuf.poll(Duration::MAX).is_ok() {}

examples/rust/profile/src/syscall.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::mem;
2+
13
extern crate libc;
24

35
#[repr(C)]
@@ -53,6 +55,12 @@ pub struct perf_event_attr {
5355
pub __reserved_3: u32,
5456
}
5557

58+
impl Default for perf_event_attr {
59+
fn default() -> Self {
60+
unsafe { mem::zeroed() }
61+
}
62+
}
63+
5664
pub const PERF_TYPE_HARDWARE: u32 = 0;
5765
pub const PERF_TYPE_SOFTWARE: u32 = 1;
5866
pub const PERF_COUNT_HW_CPU_CYCLES: u64 = 0;

0 commit comments

Comments
 (0)