@ -191,6 +191,7 @@ pub struct BpfLoader<'a> {
btf : Option < Cow < ' a , Btf > > ,
btf : Option < Cow < ' a , Btf > > ,
map_pin_path : Option < PathBuf > ,
map_pin_path : Option < PathBuf > ,
globals : HashMap < & ' a str , & ' a [ u8 ] > ,
globals : HashMap < & ' a str , & ' a [ u8 ] > ,
max_entries : HashMap < & ' a str , u32 > ,
features : Features ,
features : Features ,
extensions : HashSet < & ' a str > ,
extensions : HashSet < & ' a str > ,
verifier_log_level : VerifierLogLevel ,
verifier_log_level : VerifierLogLevel ,
@ -227,6 +228,7 @@ impl<'a> BpfLoader<'a> {
btf : Btf ::from_sys_fs ( ) . ok ( ) . map ( Cow ::Owned ) ,
btf : Btf ::from_sys_fs ( ) . ok ( ) . map ( Cow ::Owned ) ,
map_pin_path : None ,
map_pin_path : None ,
globals : HashMap ::new ( ) ,
globals : HashMap ::new ( ) ,
max_entries : HashMap ::new ( ) ,
features ,
features ,
extensions : HashSet ::new ( ) ,
extensions : HashSet ::new ( ) ,
verifier_log_level : VerifierLogLevel ::default ( ) ,
verifier_log_level : VerifierLogLevel ::default ( ) ,
@ -315,6 +317,27 @@ impl<'a> BpfLoader<'a> {
self
self
}
}
/// Set the max_entries for specified map.
///
/// Overwrite the value of max_entries of the map that matches
/// the provided name before the map is created.
///
/// # Example
///
/// ```no_run
/// use aya::BpfLoader;
///
/// let bpf = BpfLoader::new()
/// .set_max_entries("map", 64)
/// .load_file("file.o")?;
/// # Ok::<(), aya::BpfError>(())
/// ```
///
pub fn set_max_entries ( & mut self , name : & ' a str , size : u32 ) -> & mut BpfLoader < ' a > {
self . max_entries . insert ( name , size ) ;
self
}
/// Treat the provided program as an [`Extension`]
/// Treat the provided program as an [`Extension`]
///
///
/// When attempting to load the program with the provided `name`
/// When attempting to load the program with the provided `name`
@ -409,18 +432,24 @@ impl<'a> BpfLoader<'a> {
if let Some ( btf ) = & self . btf {
if let Some ( btf ) = & self . btf {
obj . relocate_btf ( btf ) ? ;
obj . relocate_btf ( btf ) ? ;
}
}
let mut maps = HashMap ::new ( ) ;
let mut maps = HashMap ::new ( ) ;
for ( name , mut obj ) in obj . maps . drain ( ) {
for ( name , mut obj ) in obj . maps . drain ( ) {
if obj . map_type ( ) = = BPF_MAP_TYPE_PERF_EVENT_ARRAY as u32 & & obj . max_entries ( ) = = 0 {
match self . max_entries . get ( name . as_str ( ) ) {
obj . set_max_entries (
Some ( size ) = > obj . set_max_entries ( * size ) ,
possible_cpus ( )
None = > {
. map_err ( | error | BpfError ::FileError {
if obj . map_type ( ) = = BPF_MAP_TYPE_PERF_EVENT_ARRAY as u32
path : PathBuf ::from ( POSSIBLE_CPUS ) ,
& & obj . max_entries ( ) = = 0
error ,
{
} ) ?
obj . set_max_entries (
. len ( ) as u32 ,
possible_cpus ( )
) ;
. map_err ( | error | BpfError ::FileError {
path : PathBuf ::from ( POSSIBLE_CPUS ) ,
error ,
} ) ?
. len ( ) as u32 ,
) ;
}
}
}
}
let mut map = Map {
let mut map = Map {
obj ,
obj ,