stack_trace.rs 871 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. use core::mem;
  2. use crate::{
  3. bindings::{bpf_map_def, bpf_map_type::BPF_MAP_TYPE_STACK_TRACE},
  4. helpers::{bpf_get_stackid},
  5. BpfContext,
  6. };
  7. #[repr(transparent)]
  8. pub struct StackTrace {
  9. def: bpf_map_def,
  10. }
  11. const PERF_MAX_STACK_DEPTH: u32 = 127;
  12. impl StackTrace {
  13. pub const fn with_max_entries(max_entries: u32, flags: u32) -> StackTrace {
  14. StackTrace {
  15. def: bpf_map_def {
  16. type_: BPF_MAP_TYPE_STACK_TRACE,
  17. key_size: mem::size_of::<u32>() as u32,
  18. value_size: mem::size_of::<u64>() as u32 * PERF_MAX_STACK_DEPTH,
  19. max_entries,
  20. map_flags: flags,
  21. id: 0,
  22. pinning: 0,
  23. },
  24. }
  25. }
  26. pub unsafe fn get_stackid<C: BpfContext>(&mut self, ctx: &C, flags: u64) -> Result<i64, i64> {
  27. let ret = bpf_get_stackid(
  28. ctx.as_ptr(),
  29. &mut self.def as *mut _ as *mut _,
  30. flags,
  31. );
  32. if ret < 0 {
  33. Err(ret)
  34. } else {
  35. Ok(ret)
  36. }
  37. }
  38. }