瀏覽代碼

aya: Remove MapData::pinned

BPF objects can be pinned multiple 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<PathBuf>, but there is really no reason
to track it at all.

Signed-off-by: Dave Tucker <[email protected]>
Dave Tucker 1 年之前
父節點
當前提交
0f4021ec89
共有 3 個文件被更改,包括 12 次插入42 次删除
  1. 12 33
      aya/src/maps/mod.rs
  2. 0 6
      aya/src/pin.rs
  3. 0 3
      xtask/public-api/aya.txt

+ 12 - 33
aya/src/maps/mod.rs

@@ -409,8 +409,6 @@ pub(crate) fn check_v_size<V>(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<P: AsRef<Path>>(
@@ -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,35 @@ impl MapData {
         Ok(Self {
             obj: parse_map_info(info, PinningType::None),
             fd,
-            pinned: false,
         })
     }
 
     pub(crate) fn pin<P: AsRef<Path>>(&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 +805,6 @@ mod tests {
             Ok(MapData {
                 obj: _,
                 fd,
-                pinned: false
             }) => assert_eq!(fd.as_fd().as_raw_fd(), 42)
         );
     }

+ 0 - 6
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 {

+ 0 - 3
xtask/public-api/aya.txt

@@ -1218,7 +1218,6 @@ pub fn aya::maps::lpm_trie::LpmTrie<T, K, V>::borrow_mut(&mut self) -> &mut T
 impl<T> core::convert::From<T> for aya::maps::lpm_trie::LpmTrie<T, K, V>
 pub fn aya::maps::lpm_trie::LpmTrie<T, K, V>::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<std::os::fd::owned::BorrowedFd<'_>>) -> core::result::Result<Self, aya::maps::MapError>
 pub fn aya::maps::MapData::fd(&self) -> &aya::maps::MapFd
@@ -1738,8 +1737,6 @@ pub fn aya::maps::stack_trace::StackTraceMap<T>::get(&self, index: &u32) -> core
 pub fn aya::maps::stack_trace::StackTraceMap<T>::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