|  | @@ -324,6 +324,40 @@ impl Program {
 | 
	
		
			
				|  |  |              Program::SkLookup(p) => p.data.pin(path),
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /// Unload the program
 | 
	
		
			
				|  |  | +    fn unload(&mut self) -> Result<(), ProgramError> {
 | 
	
		
			
				|  |  | +        match self {
 | 
	
		
			
				|  |  | +            Program::KProbe(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::UProbe(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::TracePoint(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::SocketFilter(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::Xdp(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::SkMsg(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::SkSkb(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::SockOps(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::SchedClassifier(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::CgroupSkb(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::CgroupSysctl(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::CgroupSockopt(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::LircMode2(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::PerfEvent(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::RawTracePoint(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::Lsm(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::BtfTracePoint(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::FEntry(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::FExit(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::Extension(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::CgroupSockAddr(p) => p.unload(),
 | 
	
		
			
				|  |  | +            Program::SkLookup(p) => p.unload(),
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +impl Drop for Program {
 | 
	
		
			
				|  |  | +    fn drop(&mut self) {
 | 
	
		
			
				|  |  | +        let _ = self.unload();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #[derive(Debug)]
 | 
	
	
		
			
				|  | @@ -591,41 +625,6 @@ impl_program_unload!(
 | 
	
		
			
				|  |  |      SockOps
 | 
	
		
			
				|  |  |  );
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#[cfg(test)]
 | 
	
		
			
				|  |  | -mod tests {
 | 
	
		
			
				|  |  | -    use super::Program;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    #[allow(dead_code)]
 | 
	
		
			
				|  |  | -    // When a new program is added, this fn will break as a reminder: consider adding unload()
 | 
	
		
			
				|  |  | -    // See [impl_program_unload!()]
 | 
	
		
			
				|  |  | -    fn program_implements_unload(a: Program) {
 | 
	
		
			
				|  |  | -        let _ = match a {
 | 
	
		
			
				|  |  | -            Program::KProbe(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::UProbe(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::TracePoint(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::SocketFilter(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::Xdp(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::SkMsg(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::SkSkb(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::SockOps(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::SchedClassifier(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::CgroupSkb(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::CgroupSysctl(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::CgroupSockopt(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::LircMode2(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::PerfEvent(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::RawTracePoint(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::Lsm(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::BtfTracePoint(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::FEntry(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::FExit(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::Extension(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::CgroupSockAddr(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -            Program::SkLookup(mut p) => p.unload(),
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  macro_rules! impl_program_fd {
 | 
	
		
			
				|  |  |      ($($struct_name:ident),+ $(,)?) => {
 | 
	
		
			
				|  |  |          $(
 |