From c665e1f1ba4d6bd0f7718cf600f80878e6a5920e Mon Sep 17 00:00:00 2001 From: Dave Tucker Date: Mon, 18 Sep 2023 17:32:37 +0100 Subject: [PATCH] aya: Remove MapData::pinned BPF objects can be pinned mutliple times, to multiple different places. Tracking whether or not a map is pinned in a bool is therefore not sufficient. We could track this in a HashSet, but there is really no reason to track it at all. Signed-off-by: Dave Tucker --- aya/src/maps/mod.rs | 46 +++++++++++----------------------------- aya/src/pin.rs | 6 ------ xtask/public-api/aya.txt | 3 --- 3 files changed, 12 insertions(+), 43 deletions(-) diff --git a/aya/src/maps/mod.rs b/aya/src/maps/mod.rs index 163ce127..5ff2a563 100644 --- a/aya/src/maps/mod.rs +++ b/aya/src/maps/mod.rs @@ -409,8 +409,6 @@ pub(crate) fn check_v_size(map: &MapData) -> Result<(), MapError> { pub struct MapData { obj: obj::Map, fd: MapFd, - /// Indicates if this map has been pinned to bpffs - pub pinned: bool, } impl MapData { @@ -439,11 +437,7 @@ impl MapData { } })?; let fd = MapFd(fd); - Ok(Self { - obj, - fd, - pinned: false, - }) + Ok(Self { obj, fd }) } pub(crate) fn create_pinned>( @@ -471,11 +465,7 @@ impl MapData { }) { Ok(fd) => { let fd = MapFd(fd); - Ok(Self { - obj, - fd, - pinned: false, - }) + Ok(Self { obj, fd }) } Err(_) => { let mut map = Self::create(obj, name, btf_fd)?; @@ -489,7 +479,7 @@ impl MapData { } pub(crate) fn finalize(&mut self) -> Result<(), MapError> { - let Self { obj, fd, pinned: _ } = self; + let Self { obj, fd } = self; if !obj.data().is_empty() && obj.section_kind() != BpfSectionKind::Bss { bpf_map_update_elem_ptr(fd.as_fd(), &0 as *const _, obj.data_mut().as_mut_ptr(), 0) .map_err(|(_, io_error)| SyscallError { @@ -534,7 +524,6 @@ impl MapData { Ok(Self { obj: parse_map_info(info, PinningType::ByName), fd, - pinned: true, }) } @@ -550,44 +539,34 @@ impl MapData { Ok(Self { obj: parse_map_info(info, PinningType::None), fd, - pinned: false, }) } pub(crate) fn pin>(&mut self, name: &str, path: P) -> Result<(), PinError> { use std::os::unix::ffi::OsStrExt as _; - - let Self { fd, pinned, obj: _ } = self; - if *pinned { - return Err(PinError::AlreadyPinned { name: name.into() }); - } + let Self { fd, obj: _ } = self; let path = path.as_ref().join(name); - let path_string = CString::new(path.as_os_str().as_bytes()) - .map_err(|error| PinError::InvalidPinPath { path, error })?; + let path_string = CString::new(path.as_os_str().as_bytes()).map_err(|error| { + PinError::InvalidPinPath { + path: path.clone(), + error, + } + })?; bpf_pin_object(fd.as_fd(), &path_string).map_err(|(_, io_error)| SyscallError { call: "BPF_OBJ_PIN", io_error, })?; - *pinned = true; Ok(()) } /// Returns the file descriptor of the map. pub fn fd(&self) -> &MapFd { - let Self { - obj: _, - fd, - pinned: _, - } = self; + let Self { obj: _, fd } = self; fd } pub(crate) fn obj(&self) -> &obj::Map { - let Self { - obj, - fd: _, - pinned: _, - } = self; + let Self { obj, fd: _ } = self; obj } } @@ -825,7 +804,6 @@ mod tests { Ok(MapData { obj: _, fd, - pinned: false }) => assert_eq!(fd.as_fd().as_raw_fd(), 42) ); } diff --git a/aya/src/pin.rs b/aya/src/pin.rs index 743df95f..43e197ff 100644 --- a/aya/src/pin.rs +++ b/aya/src/pin.rs @@ -6,12 +6,6 @@ use thiserror::Error; /// An error ocurred working with a pinned BPF object. #[derive(Error, Debug)] pub enum PinError { - /// The object has already been pinned. - #[error("the BPF object `{name}` has already been pinned")] - AlreadyPinned { - /// Object name. - name: String, - }, /// The object FD is not known by Aya. #[error("the BPF object `{name}`'s FD is not known")] NoFd { diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index 3f6dfad6..59711f67 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -1218,7 +1218,6 @@ pub fn aya::maps::lpm_trie::LpmTrie::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya::maps::lpm_trie::LpmTrie pub fn aya::maps::lpm_trie::LpmTrie::from(t: T) -> T pub struct aya::maps::MapData -pub aya::maps::MapData::pinned: bool impl aya::maps::MapData pub fn aya::maps::MapData::create(obj: aya_obj::maps::Map, name: &str, btf_fd: core::option::Option>) -> core::result::Result pub fn aya::maps::MapData::fd(&self) -> &aya::maps::MapFd @@ -1738,8 +1737,6 @@ pub fn aya::maps::stack_trace::StackTraceMap::get(&self, index: &u32) -> core pub fn aya::maps::stack_trace::StackTraceMap::map(&self) -> &aya::maps::MapData pub mod aya::pin pub enum aya::pin::PinError -pub aya::pin::PinError::AlreadyPinned -pub aya::pin::PinError::AlreadyPinned::name: alloc::string::String pub aya::pin::PinError::InvalidPinPath pub aya::pin::PinError::InvalidPinPath::error: alloc::ffi::c_str::NulError pub aya::pin::PinError::InvalidPinPath::path: std::path::PathBuf