mirror of https://github.com/aya-rs/aya
ebpf: add peak() method to Queue and Stack
Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com>reviewable/pr1319/r11
parent
9261554e3c
commit
b8191195af
@ -0,0 +1,49 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use aya_ebpf::{
|
||||
cty::c_long,
|
||||
macros::{map, uprobe},
|
||||
maps::{Array, Queue},
|
||||
programs::ProbeContext,
|
||||
};
|
||||
#[cfg(not(test))]
|
||||
extern crate ebpf_panic;
|
||||
|
||||
const PEEK_INDEX: u32 = 0;
|
||||
const POP_INDEX: u32 = 1;
|
||||
|
||||
#[map]
|
||||
static RESULT: Array<u64> = Array::<u64>::with_max_entries(2, 0);
|
||||
|
||||
#[map]
|
||||
static TEST_QUEUE: Queue<u64> = Queue::with_max_entries(10, 0);
|
||||
|
||||
#[uprobe]
|
||||
pub fn test_queue_push(ctx: ProbeContext) -> Result<(), c_long> {
|
||||
let value = ctx.arg(0).ok_or(-1)?;
|
||||
TEST_QUEUE.push(&value, 0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[uprobe]
|
||||
pub fn test_queue_pop(_: ProbeContext) -> Result<(), c_long> {
|
||||
let value = TEST_QUEUE.pop().ok_or(-1)?;
|
||||
result_set(POP_INDEX, value)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[uprobe]
|
||||
pub fn test_queue_peek(_: ProbeContext) -> Result<(), c_long> {
|
||||
let value = TEST_QUEUE.peek().ok_or(-1)?;
|
||||
result_set(PEEK_INDEX, value)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn result_set(index: u32, value: u64) -> Result<(), c_long> {
|
||||
let ptr = RESULT.get_ptr_mut(index).ok_or(-1)?;
|
||||
let dst = unsafe { ptr.as_mut() };
|
||||
let dst_res = dst.ok_or(-1)?;
|
||||
*dst_res = value;
|
||||
Ok(())
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use aya_ebpf::{
|
||||
cty::c_long,
|
||||
macros::{map, uprobe},
|
||||
maps::{Array, Stack},
|
||||
programs::ProbeContext,
|
||||
};
|
||||
#[cfg(not(test))]
|
||||
extern crate ebpf_panic;
|
||||
|
||||
const PEEK_INDEX: u32 = 0;
|
||||
const POP_INDEX: u32 = 1;
|
||||
|
||||
#[map]
|
||||
static RESULT: Array<u64> = Array::<u64>::with_max_entries(2, 0);
|
||||
|
||||
#[map]
|
||||
static TEST_STACK: Stack<u64> = Stack::with_max_entries(10, 0);
|
||||
|
||||
#[uprobe]
|
||||
pub fn test_stack_push(ctx: ProbeContext) -> Result<(), c_long> {
|
||||
let value = ctx.arg(0).ok_or(-1)?;
|
||||
TEST_STACK.push(&value, 0)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[uprobe]
|
||||
pub fn test_stack_pop(_: ProbeContext) -> Result<(), c_long> {
|
||||
let value = TEST_STACK.pop().ok_or(-1)?;
|
||||
result_set(POP_INDEX, value)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[uprobe]
|
||||
pub fn test_stack_peek(_: ProbeContext) -> Result<(), c_long> {
|
||||
let value = TEST_STACK.peek().ok_or(-1)?;
|
||||
result_set(PEEK_INDEX, value)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn result_set(index: u32, value: u64) -> Result<(), c_long> {
|
||||
let ptr = RESULT.get_ptr_mut(index).ok_or(-1)?;
|
||||
let dst = unsafe { ptr.as_mut() };
|
||||
let dst_res = dst.ok_or(-1)?;
|
||||
*dst_res = value;
|
||||
Ok(())
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
use aya::{EbpfLoader, maps::Array, programs::UProbe};
|
||||
|
||||
const PEEK_INDEX: u32 = 0;
|
||||
const POP_INDEX: u32 = 1;
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn trigger_queue_push(arg: u64) {
|
||||
core::hint::black_box(arg);
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn trigger_queue_peek(marker: u64) -> u64 {
|
||||
core::hint::black_box(trigger_queue_peek);
|
||||
marker + 1
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn trigger_queue_pop(marker: u64) -> u64 {
|
||||
core::hint::black_box(trigger_queue_pop);
|
||||
marker + 2
|
||||
}
|
||||
|
||||
#[test_log::test]
|
||||
fn queue_basic() {
|
||||
let mut bpf = EbpfLoader::new().load(crate::QUEUE_TEST).unwrap();
|
||||
|
||||
let prog: &mut UProbe = bpf
|
||||
.program_mut("test_queue_push")
|
||||
.unwrap()
|
||||
.try_into()
|
||||
.unwrap();
|
||||
prog.load().unwrap();
|
||||
prog.attach("trigger_queue_push", "/proc/self/exe", None, None)
|
||||
.unwrap();
|
||||
|
||||
let prog: &mut UProbe = bpf
|
||||
.program_mut("test_queue_pop")
|
||||
.unwrap()
|
||||
.try_into()
|
||||
.unwrap();
|
||||
prog.load().unwrap();
|
||||
prog.attach("trigger_queue_pop", "/proc/self/exe", None, None)
|
||||
.unwrap();
|
||||
|
||||
let prog: &mut UProbe = bpf
|
||||
.program_mut("test_queue_peek")
|
||||
.unwrap()
|
||||
.try_into()
|
||||
.unwrap();
|
||||
prog.load().unwrap();
|
||||
prog.attach("trigger_queue_peek", "/proc/self/exe", None, None)
|
||||
.unwrap();
|
||||
|
||||
let array_map = bpf.map("RESULT").unwrap();
|
||||
let array = Array::<_, u64>::try_from(array_map).unwrap();
|
||||
|
||||
for i in 0..9 {
|
||||
trigger_queue_push(i);
|
||||
}
|
||||
|
||||
for i in 0..9 {
|
||||
trigger_queue_peek(i);
|
||||
let peek_value = array.get(&PEEK_INDEX, 0).unwrap();
|
||||
|
||||
trigger_queue_pop(i);
|
||||
let pop_value = array.get(&POP_INDEX, 0).unwrap();
|
||||
|
||||
assert_eq!(peek_value, pop_value);
|
||||
assert_eq!(pop_value, i);
|
||||
}
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
use aya::{EbpfLoader, maps::Array, programs::UProbe};
|
||||
|
||||
const PEEK_INDEX: u32 = 0;
|
||||
const POP_INDEX: u32 = 1;
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn trigger_stack_push(arg: u64) {
|
||||
core::hint::black_box(arg);
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn trigger_stack_peek(marker: u64) -> u64 {
|
||||
core::hint::black_box(trigger_stack_peek);
|
||||
marker + 1
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline(never)]
|
||||
pub extern "C" fn trigger_stack_pop(marker: u64) -> u64 {
|
||||
core::hint::black_box(trigger_stack_pop);
|
||||
marker + 2
|
||||
}
|
||||
|
||||
#[test_log::test]
|
||||
fn stack_basic() {
|
||||
let mut bpf = EbpfLoader::new().load(crate::STACK_TEST).unwrap();
|
||||
|
||||
let prog: &mut UProbe = bpf
|
||||
.program_mut("test_stack_push")
|
||||
.unwrap()
|
||||
.try_into()
|
||||
.unwrap();
|
||||
prog.load().unwrap();
|
||||
prog.attach("trigger_stack_push", "/proc/self/exe", None, None)
|
||||
.unwrap();
|
||||
|
||||
let prog: &mut UProbe = bpf
|
||||
.program_mut("test_stack_pop")
|
||||
.unwrap()
|
||||
.try_into()
|
||||
.unwrap();
|
||||
prog.load().unwrap();
|
||||
prog.attach("trigger_stack_pop", "/proc/self/exe", None, None)
|
||||
.unwrap();
|
||||
|
||||
let prog: &mut UProbe = bpf
|
||||
.program_mut("test_stack_peek")
|
||||
.unwrap()
|
||||
.try_into()
|
||||
.unwrap();
|
||||
prog.load().unwrap();
|
||||
prog.attach("trigger_stack_peek", "/proc/self/exe", None, None)
|
||||
.unwrap();
|
||||
|
||||
let array_map = bpf.map("RESULT").unwrap();
|
||||
let array = Array::<_, u64>::try_from(array_map).unwrap();
|
||||
|
||||
for i in 0..9 {
|
||||
trigger_stack_push(i);
|
||||
}
|
||||
|
||||
for i in (0..9).rev() {
|
||||
trigger_stack_peek(i);
|
||||
assert_eq!(array.get(&PEEK_INDEX, 0).unwrap(), i);
|
||||
|
||||
trigger_stack_pop(i);
|
||||
assert_eq!(array.get(&POP_INDEX, 0).unwrap(), i);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue