@ -1,6 +1,6 @@
 
			
		
	
		
		
			
				
					
					use   std ::{ use   std ::{  
			
		
	
		
		
			
				
					
					     convert ::TryInto   as   _ ,      convert ::TryInto   as   _ ,  
			
		
	
		
		
			
				
					
					     fs ::remove_file ,      fs ::{ create_dir ,   remove_dir_all ,   remove_file } ,  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					     path ::Path ,      path ::Path ,  
			
		
	
		
		
			
				
					
					     thread ,      thread ,  
			
		
	
		
		
			
				
					
					     time ::{ Duration ,   SystemTime } ,      time ::{ Duration ,   SystemTime } ,  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -13,7 +13,7 @@ use aya::{
 
			
		
	
		
		
			
				
					
					         loaded_links ,   loaded_programs ,   KProbe ,   TracePoint ,   UProbe ,   Xdp ,   XdpFlags ,          loaded_links ,   loaded_programs ,   KProbe ,   TracePoint ,   UProbe ,   Xdp ,   XdpFlags ,  
			
		
	
		
		
			
				
					
					     } ,      } ,  
			
		
	
		
		
			
				
					
					     util ::KernelVersion ,      util ::KernelVersion ,  
			
		
	
		
		
			
				
					
					     Bpf ,      Bpf ,   BpfLoader ,  
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					} ; } ;  
			
		
	
		
		
			
				
					
					use   aya_obj ::programs ::XdpAttachType ; use   aya_obj ::programs ::XdpAttachType ;  
			
		
	
		
		
			
				
					
					use   test_log ::test ; use   test_log ::test ;  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -79,7 +79,7 @@ fn pin_lifecycle_multiple_btf_maps() {
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     // pin and unpin all maps before casting to explicit types
      // pin and unpin all maps before casting to explicit types
  
			
		
	
		
		
			
				
					
					     for   ( i ,   ( name ,   map ) )   in   bpf . maps_mut ( ) . enumerate ( )   {      for   ( i ,   ( name ,   map ) )   in   bpf . maps_mut ( ) . enumerate ( )   {  
			
		
	
		
		
			
				
					
					         // Don't pin system maps  or the map that's already pinned by name .
         // Don't pin system maps .
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					         if   name . contains ( ".rodata" )   | |   name . contains ( ".bss" )   {          if   name . contains ( ".rodata" )   | |   name . contains ( ".bss" )   {  
			
		
	
		
		
			
				
					
					             continue ;              continue ;  
			
		
	
		
		
			
				
					
					         }          }  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -127,6 +127,83 @@ fn pin_lifecycle_multiple_btf_maps() {
 
			
		
	
		
		
			
				
					
					     remove_file ( map_pin_by_name_path ) . unwrap ( ) ;      remove_file ( map_pin_by_name_path ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					#[ test ]  
			
		
	
		
		
			
				
					
					fn  pin_lifecycle_sharing_btf_maps ( )   {  
			
		
	
		
		
			
				
					
					     let   map_pin_path   =   Path ::new ( "/sys/fs/bpf/map-sharing-test" ) ;  
			
		
	
		
		
			
				
					
					     if   map_pin_path . exists ( )   {  
			
		
	
		
		
			
				
					
					         remove_dir_all ( map_pin_path ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     }  
			
		
	
		
		
			
				
					
					     create_dir ( map_pin_path ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     let   mut   loader   =   BpfLoader ::new ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     let   mut   bpf   =   loader . load ( crate ::MULTIMAP_BTF ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     // "map_pin_by_name" should already be pinned at the default bpffs.
  
			
		
	
		
		
			
				
					
					     let   map_pin_by_name_path   =   Path ::new ( "/sys/fs/bpf/map_pin_by_name" ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     assert! ( map_pin_by_name_path . exists ( ) ) ;  
			
		
	
		
		
			
				
					
					     remove_file ( map_pin_by_name_path ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     for   ( _ ,   ( name ,   map ) )   in   bpf . maps_mut ( ) . enumerate ( )   {  
			
		
	
		
		
			
				
					
					         // Don't pin system maps.
  
			
		
	
		
		
			
				
					
					         if   name . contains ( ".rodata" )   | |   name . contains ( ".bss" )   {  
			
		
	
		
		
			
				
					
					             continue ;  
			
		
	
		
		
			
				
					
					         }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					         // Pin the map by it's name.
  
			
		
	
		
		
			
				
					
					         map . pin ( map_pin_path . join ( name ) ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					         assert! ( map_pin_path . exists ( ) ) ;  
			
		
	
		
		
			
				
					
					     }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     // Load the same program using the existing maps at map_pin_path.
  
			
		
	
		
		
			
				
					
					     let   mut   bpf1   =   loader  
			
		
	
		
		
			
				
					
					         . map_pin_path ( map_pin_path )  
			
		
	
		
		
			
				
					
					         . load ( crate ::MULTIMAP_BTF )  
			
		
	
		
		
			
				
					
					         . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     // Get the maps from the first program.
  
			
		
	
		
		
			
				
					
					     let   map_1 : Array < _ ,   u64 >   =   bpf . take_map ( "map_1" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     let   map_2 : Array < _ ,   u64 >   =   bpf . take_map ( "map_2" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     let   map_pin_by_name : Array < _ ,   u64 >   =  
			
		
	
		
		
			
				
					
					         bpf . take_map ( "map_pin_by_name" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     // Attach both programs so they can be triggered.
  
			
		
	
		
		
			
				
					
					     let   prog : & mut   UProbe   =   bpf . program_mut ( "bpf_prog" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     prog . load ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     prog . attach ( Some ( "trigger_bpf_program" ) ,   0 ,   "/proc/self/exe" ,   None )  
			
		
	
		
		
			
				
					
					         . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     let   prog1 : & mut   UProbe   =   bpf1 . program_mut ( "bpf_prog1" ) . unwrap ( ) . try_into ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     prog1 . load ( ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     prog1  
			
		
	
		
		
			
				
					
					         . attach ( Some ( "trigger_bpf_program" ) ,   0 ,   "/proc/self/exe" ,   None )  
			
		
	
		
		
			
				
					
					         . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     trigger_bpf_program ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     // Ensure both program's updated the same maps.
  
			
		
	
		
		
			
				
					
					     let   key   =   0 ;  
			
		
	
		
		
			
				
					
					     let   val_1   =   map_1 . get ( & key ,   0 ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     let   val_2   =   map_2 . get ( & key ,   0 ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     let   val_3   =   map_pin_by_name . get ( & key ,   0 ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     assert_eq! ( val_1 ,   24 ) ;  
			
		
	
		
		
			
				
					
					     assert_eq! ( val_2 ,   42 ) ;  
			
		
	
		
		
			
				
					
					     assert_eq! ( val_3 ,   44 ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     let   key   =   1 ;  
			
		
	
		
		
			
				
					
					     let   val_1   =   map_1 . get ( & key ,   0 ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     let   val_2   =   map_2 . get ( & key ,   0 ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					     let   val_3   =   map_pin_by_name . get ( & key ,   0 ) . unwrap ( ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     assert_eq! ( val_1 ,   35 ) ;  
			
		
	
		
		
			
				
					
					     assert_eq! ( val_2 ,   53 ) ;  
			
		
	
		
		
			
				
					
					     assert_eq! ( val_3 ,   55 ) ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					     remove_dir_all ( map_pin_path ) . unwrap ( )  
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					#[ no_mangle ] #[ no_mangle ]  
			
		
	
		
		
			
				
					
					#[ inline(never) ] #[ inline(never) ]  
			
		
	
		
		
			
				
					
					pub   extern   "C"   fn  trigger_bpf_program ( )   { pub   extern   "C"   fn  trigger_bpf_program ( )   {