From 6a25d4ddec42e3408bd823fccc6e64c33575bc5c Mon Sep 17 00:00:00 2001 From: epompeii Date: Fri, 17 Mar 2023 12:54:52 -0400 Subject: [PATCH 1/4] obj --- aya-obj/src/obj.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/aya-obj/src/obj.rs b/aya-obj/src/obj.rs index 8491709b..5ea7a40b 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -231,6 +231,7 @@ pub enum ProgramSection { }, Lsm { name: String, + sleepable_supported: bool, }, BtfTracePoint { name: String, @@ -281,7 +282,7 @@ impl ProgramSection { ProgramSection::LircMode2 { name } => name, ProgramSection::PerfEvent { name } => name, ProgramSection::RawTracePoint { name } => name, - ProgramSection::Lsm { name } => name, + ProgramSection::Lsm { name, .. } => name, ProgramSection::BtfTracePoint { name } => name, ProgramSection::FEntry { name } => name, ProgramSection::FExit { name } => name, @@ -472,7 +473,14 @@ impl FromStr for ProgramSection { "lirc_mode2" => LircMode2 { name }, "perf_event" => PerfEvent { name }, "raw_tp" | "raw_tracepoint" => RawTracePoint { name }, - "lsm" => Lsm { name }, + "lsm" => Lsm { + name, + sleepable_supported: false, + }, + "lsm.s+" => Lsm { + name, + sleepable_supported: true, + }, "fentry" => FEntry { name }, "fexit" => FExit { name }, "freplace" => Extension { name }, @@ -1926,6 +1934,30 @@ mod tests { ); } + #[test] + fn test_parse_section_lsm_sleepable() { + let mut obj = fake_obj(); + + assert_matches!( + obj.parse_section(fake_section( + BpfSectionKind::Program, + "lsm.s+/foo", + bytes_of(&fake_ins()) + )), + Ok(()) + ); + assert_matches!( + obj.programs.get("foo"), + Some(Program { + section: ProgramSection::Lsm { + sleepable_supported: true, + .. + }, + .. + }) + ); + } + #[test] fn test_parse_section_btf_tracepoint() { let mut obj = fake_obj(); From 17f497ce4207c5c26023914d956c7c69411b25c1 Mon Sep 17 00:00:00 2001 From: epompeii Date: Fri, 17 Mar 2023 13:04:54 -0400 Subject: [PATCH 2/4] program_section --- aya/src/bpf.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index e94b2f6c..86b53719 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -9,7 +9,7 @@ use std::{ use aya_obj::{ btf::{BtfFeatures, BtfRelocationError}, - generated::BPF_F_XDP_HAS_FRAGS, + generated::{BPF_F_SLEEPABLE, BPF_F_XDP_HAS_FRAGS}, relocation::BpfRelocationError, }; use log::debug; @@ -551,9 +551,17 @@ impl<'a> BpfLoader<'a> { data: ProgramData::new(prog_name, obj, btf_fd, verifier_log_level), }) } - ProgramSection::Lsm { .. } => Program::Lsm(Lsm { - data: ProgramData::new(prog_name, obj, btf_fd, verifier_log_level), - }), + ProgramSection::Lsm { + sleepable_supported, + .. + } => { + let mut data = + ProgramData::new(prog_name, obj, btf_fd, verifier_log_level); + if *sleepable_supported { + data.flags = BPF_F_SLEEPABLE; + } + Program::Lsm(Lsm { data }) + } ProgramSection::BtfTracePoint { .. } => { Program::BtfTracePoint(BtfTracePoint { data: ProgramData::new(prog_name, obj, btf_fd, verifier_log_level), From 6dfb9d82af9c178f4effd7a0c9095442816a014c Mon Sep 17 00:00:00 2001 From: epompeii Date: Fri, 17 Mar 2023 15:40:09 -0400 Subject: [PATCH 3/4] macro --- aya-bpf-macros/src/expand.rs | 31 ++++++++++++++++++++++++++----- aya-obj/src/obj.rs | 6 +++--- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/aya-bpf-macros/src/expand.rs b/aya-bpf-macros/src/expand.rs index 506cfa89..bf60c8e5 100644 --- a/aya-bpf-macros/src/expand.rs +++ b/aya-bpf-macros/src/expand.rs @@ -613,18 +613,39 @@ impl RawTracePoint { pub struct Lsm { item: ItemFn, - name: String, + name: Option, + sleepable: bool, } impl Lsm { pub fn from_syn(mut args: Args, item: ItemFn) -> Result { - let name = name_arg(&mut args)?.unwrap_or_else(|| item.sig.ident.to_string()); - - Ok(Lsm { item, name }) + let name = pop_arg(&mut args, "name"); + let mut sleepable = false; + if let Some(s) = pop_arg(&mut args, "sleepable") { + if let Ok(m) = s.parse() { + sleepable = m + } else { + return Err(Error::new_spanned( + "mutlibuffer", + "invalid value. should be 'true' or 'false'", + )); + } + } + err_on_unknown_args(&args)?; + Ok(Lsm { + item, + name, + sleepable, + }) } pub fn expand(&self) -> Result { - let section_name = format!("lsm/{}", self.name); + let section_prefix = if self.sleepable { "lsm.s" } else { "lsm" }; + let section_name = if let Some(name) = &self.name { + format!("{section_prefix}/{name}") + } else { + section_prefix.to_string() + }; let fn_vis = &self.item.vis; let fn_name = &self.item.sig.ident; let item = &self.item; diff --git a/aya-obj/src/obj.rs b/aya-obj/src/obj.rs index 5ea7a40b..af78ac87 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -148,7 +148,7 @@ pub struct Function { /// - `uprobe.s+` or `uretprobe.s+` /// - `usdt+` /// - `kprobe.multi+` or `kretprobe.multi+`: `BPF_TRACE_KPROBE_MULTI` -/// - `lsm_cgroup+` or `lsm.s+` +/// - `lsm_cgroup+` /// - `lwt_in`, `lwt_out`, `lwt_seg6local`, `lwt_xmit` /// - `raw_tp.w+`, `raw_tracepoint.w+` /// - `action` @@ -477,7 +477,7 @@ impl FromStr for ProgramSection { name, sleepable_supported: false, }, - "lsm.s+" => Lsm { + "lsm.s" => Lsm { name, sleepable_supported: true, }, @@ -1941,7 +1941,7 @@ mod tests { assert_matches!( obj.parse_section(fake_section( BpfSectionKind::Program, - "lsm.s+/foo", + "lsm.s/foo", bytes_of(&fake_ins()) )), Ok(()) From 85714d5cf3622da49d1442c34caa63451d9efe48 Mon Sep 17 00:00:00 2001 From: epompeii Date: Tue, 21 Mar 2023 13:53:21 -0400 Subject: [PATCH 4/4] review --- aya-bpf-macros/src/expand.rs | 4 ++-- aya-obj/src/obj.rs | 32 +++++++++++++------------------- aya/src/bpf.rs | 13 ++++--------- 3 files changed, 19 insertions(+), 30 deletions(-) diff --git a/aya-bpf-macros/src/expand.rs b/aya-bpf-macros/src/expand.rs index bf60c8e5..b96db0fe 100644 --- a/aya-bpf-macros/src/expand.rs +++ b/aya-bpf-macros/src/expand.rs @@ -212,7 +212,7 @@ impl Xdp { frags = m } else { return Err(Error::new_spanned( - "mutlibuffer", + s, "invalid value. should be 'true' or 'false'", )); } @@ -626,7 +626,7 @@ impl Lsm { sleepable = m } else { return Err(Error::new_spanned( - "mutlibuffer", + s, "invalid value. should be 'true' or 'false'", )); } diff --git a/aya-obj/src/obj.rs b/aya-obj/src/obj.rs index af78ac87..54d884cb 100644 --- a/aya-obj/src/obj.rs +++ b/aya-obj/src/obj.rs @@ -183,7 +183,7 @@ pub enum ProgramSection { }, Xdp { name: String, - frags_supported: bool, + frags: bool, }, SkMsg { name: String, @@ -231,7 +231,7 @@ pub enum ProgramSection { }, Lsm { name: String, - sleepable_supported: bool, + sleepable: bool, }, BtfTracePoint { name: String, @@ -314,14 +314,8 @@ impl FromStr for ProgramSection { "kretprobe" => KRetProbe { name }, "uprobe" => UProbe { name }, "uretprobe" => URetProbe { name }, - "xdp" => Xdp { - name, - frags_supported: false, - }, - "xdp.frags" => Xdp { - name, - frags_supported: true, - }, + "xdp" => Xdp { name, frags: false }, + "xdp.frags" => Xdp { name, frags: true }, "tp_btf" => BtfTracePoint { name }, _ if kind.starts_with("tracepoint") || kind.starts_with("tp") => { // tracepoint sections are named `tracepoint/category/event_name`, @@ -475,11 +469,11 @@ impl FromStr for ProgramSection { "raw_tp" | "raw_tracepoint" => RawTracePoint { name }, "lsm" => Lsm { name, - sleepable_supported: false, + sleepable: false, }, "lsm.s" => Lsm { name, - sleepable_supported: true, + sleepable: true, }, "fentry" => FEntry { name }, "fexit" => FExit { name }, @@ -1846,7 +1840,7 @@ mod tests { assert_matches!( obj.programs.get("foo"), Some(Program { - section: ProgramSection::Xdp { .. }, + section: ProgramSection::Xdp { frags: false, .. }, .. }) ); @@ -1867,10 +1861,7 @@ mod tests { assert_matches!( obj.programs.get("foo"), Some(Program { - section: ProgramSection::Xdp { - frags_supported: true, - .. - }, + section: ProgramSection::Xdp { frags: true, .. }, .. }) ); @@ -1928,7 +1919,10 @@ mod tests { assert_matches!( obj.programs.get("foo"), Some(Program { - section: ProgramSection::Lsm { .. }, + section: ProgramSection::Lsm { + sleepable: false, + .. + }, .. }) ); @@ -1950,7 +1944,7 @@ mod tests { obj.programs.get("foo"), Some(Program { section: ProgramSection::Lsm { - sleepable_supported: true, + sleepable: true, .. }, .. diff --git a/aya/src/bpf.rs b/aya/src/bpf.rs index 86b53719..0e74d160 100644 --- a/aya/src/bpf.rs +++ b/aya/src/bpf.rs @@ -478,12 +478,10 @@ impl<'a> BpfLoader<'a> { data: ProgramData::new(prog_name, obj, btf_fd, verifier_log_level), }) } - ProgramSection::Xdp { - frags_supported, .. - } => { + ProgramSection::Xdp { frags, .. } => { let mut data = ProgramData::new(prog_name, obj, btf_fd, verifier_log_level); - if *frags_supported { + if *frags { data.flags = BPF_F_XDP_HAS_FRAGS; } Program::Xdp(Xdp { data }) @@ -551,13 +549,10 @@ impl<'a> BpfLoader<'a> { data: ProgramData::new(prog_name, obj, btf_fd, verifier_log_level), }) } - ProgramSection::Lsm { - sleepable_supported, - .. - } => { + ProgramSection::Lsm { sleepable, .. } => { let mut data = ProgramData::new(prog_name, obj, btf_fd, verifier_log_level); - if *sleepable_supported { + if *sleepable { data.flags = BPF_F_SLEEPABLE; } Program::Lsm(Lsm { data })