Skip to content

Commit c38b01a

Browse files
d-e-s-odanielocfb
authored andcommitted
libbpf-cargo: Recreate loaded maps from ObjectSkeletonConfig
Instead of converting the maps (and associated mapped data) from the OpenMap type as part of the "load", recreate them from the ObjectSkeletonConfig. This way, we have more flexibility what to expose at what state of the skeleton moving forward. Signed-off-by: Daniel Müller <[email protected]>
1 parent 6246195 commit c38b01a

File tree

1 file changed

+31
-93
lines changed

1 file changed

+31
-93
lines changed

libbpf-cargo/src/gen/mod.rs

Lines changed: 31 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -374,29 +374,39 @@ fn gen_skel_c_skel_constructor(skel: &mut String, object: &Object, name: &str) -
374374
Ok(())
375375
}
376376

377-
fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str) -> Result<()> {
377+
fn gen_skel_map_defs(
378+
skel: &mut String,
379+
maps: &MapsData,
380+
raw_obj_name: &str,
381+
open: bool,
382+
) -> Result<()> {
383+
let prefix = if open { "Open" } else { "" };
384+
378385
let obj_name = capitalize_first_letter(raw_obj_name);
379386
write!(
380387
skel,
381388
"\
382-
pub struct Open{obj_name}Maps<'obj> {{
389+
pub struct {prefix}{obj_name}Maps<'obj> {{
383390
",
384391
)?;
385392

386393
for map in maps.iter() {
387394
write!(
388395
skel,
389396
"\
390-
pub {name}: libbpf_rs::OpenMapMut<'obj>,
397+
pub {name}: libbpf_rs::{prefix}MapMut<'obj>,
391398
",
392399
name = map.name
393400
)?;
394401

395-
if let MapMeta::Datasec { .. } = map.meta {
402+
if let MapMeta::Datasec { read_only, .. } = map.meta {
403+
// After "open" all maps are writable. That's the point,
404+
// they can be modified.
405+
let ref_mut = if open || !read_only { " mut" } else { "" };
396406
write!(
397407
skel,
398408
"\
399-
pub {name}_data: &'obj mut types::{name},
409+
pub {name}_data: &'obj{ref_mut} types::{name},
400410
",
401411
name = map.name,
402412
)?;
@@ -409,11 +419,11 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
409419
_phantom: std::marker::PhantomData<&'obj ()>,
410420
}}
411421
412-
impl<'obj> Open{obj_name}Maps<'obj> {{
422+
impl<'obj> {prefix}{obj_name}Maps<'obj> {{
413423
#[allow(unused_variables)]
414424
unsafe fn new(
415425
config: &libbpf_rs::__internal_skel::ObjectSkeletonConfig<'_>,
416-
object: &mut libbpf_rs::OpenObject,
426+
object: &mut libbpf_rs::{prefix}Object,
417427
) -> libbpf_rs::Result<Self> {{
418428
",
419429
)?;
@@ -426,7 +436,7 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
426436
skel,
427437
"\
428438
let object = unsafe {{
429-
std::mem::transmute::<&mut libbpf_rs::OpenObject, &'obj mut libbpf_rs::OpenObject>(object)
439+
std::mem::transmute::<&mut libbpf_rs::{prefix}Object, &'obj mut libbpf_rs::{prefix}Object>(object)
430440
}};
431441
for map in object.maps_mut() {{
432442
let name = map
@@ -473,7 +483,12 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
473483
name = map.name
474484
)?;
475485

476-
if let MapMeta::Datasec { mmap_idx, .. } = map.meta {
486+
if let MapMeta::Datasec {
487+
mmap_idx,
488+
read_only,
489+
} = map.meta
490+
{
491+
let ref_conv = if open || !read_only { "mut" } else { "ref" };
477492
write!(
478493
skel,
479494
"\
@@ -482,7 +497,7 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
482497
.map_mmap_ptr({mmap_idx})
483498
.expect(\"BPF map `{name}` does not have mmap pointer\")
484499
.cast::<types::{name}>()
485-
.as_mut()
500+
.as_{ref_conv}()
486501
.expect(\"BPF map `{name}` mmap pointer is NULL\")
487502
}},
488503
",
@@ -504,84 +519,6 @@ fn gen_skel_open_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str
504519
Ok(())
505520
}
506521

507-
fn gen_skel_map_defs(skel: &mut String, maps: &MapsData, raw_obj_name: &str) -> Result<()> {
508-
let obj_name = capitalize_first_letter(raw_obj_name);
509-
write!(
510-
skel,
511-
"\
512-
pub struct {obj_name}Maps<'obj> {{
513-
",
514-
)?;
515-
516-
for map in maps.iter() {
517-
write!(
518-
skel,
519-
"\
520-
pub {name}: libbpf_rs::MapMut<'obj>,
521-
",
522-
name = map.name
523-
)?;
524-
525-
if let MapMeta::Datasec { read_only, .. } = map.meta {
526-
let ref_mut = if read_only { "" } else { " mut" };
527-
528-
write!(
529-
skel,
530-
"\
531-
pub {name}_data: &'obj{ref_mut} types::{name},
532-
",
533-
name = map.name,
534-
)?;
535-
}
536-
}
537-
538-
write!(
539-
skel,
540-
"\
541-
_phantom: std::marker::PhantomData<&'obj ()>,
542-
}}
543-
544-
impl<'obj> {obj_name}Maps<'obj> {{
545-
#[allow(unused_variables)]
546-
fn new(open_maps: Open{obj_name}Maps<'obj>) -> Self {{
547-
Self {{
548-
",
549-
)?;
550-
551-
for map in maps.iter() {
552-
write!(
553-
skel,
554-
"\
555-
{name}: unsafe {{
556-
libbpf_rs::MapMut::new_mut(libbpf_rs::AsRawLibbpf::as_libbpf_object(&open_maps.{name}).as_mut())
557-
}},
558-
",
559-
name = map.name
560-
)?;
561-
562-
if let MapMeta::Datasec { .. } = map.meta {
563-
write!(
564-
skel,
565-
"\
566-
{name}_data: open_maps.{name}_data,
567-
",
568-
name = map.name,
569-
)?;
570-
}
571-
}
572-
573-
write!(
574-
skel,
575-
"\
576-
_phantom: std::marker::PhantomData,
577-
}}
578-
}}
579-
}}
580-
",
581-
)?;
582-
Ok(())
583-
}
584-
585522
fn gen_skel_open_prog_defs(skel: &mut String, progs: &ProgsData, raw_obj_name: &str) -> Result<()> {
586523
let obj_name = capitalize_first_letter(raw_obj_name);
587524
write!(
@@ -917,6 +854,7 @@ fn gen_skel_contents(_debug: bool, raw_obj_name: &str, obj_file_path: &Path) ->
917854
#[allow(unused_imports)]
918855
use super::*;
919856
use libbpf_rs::libbpf_sys;
857+
use libbpf_rs::MapCore as _;
920858
use libbpf_rs::skel::OpenSkel;
921859
use libbpf_rs::skel::Skel;
922860
use libbpf_rs::skel::SkelBuilder;
@@ -941,8 +879,8 @@ fn gen_skel_contents(_debug: bool, raw_obj_name: &str, obj_file_path: &Path) ->
941879
let progs = ProgsData::new(&object)?;
942880

943881
gen_skel_c_skel_constructor(&mut skel, &object, &libbpf_obj_name)?;
944-
gen_skel_open_map_defs(&mut skel, &maps, raw_obj_name)?;
945-
gen_skel_map_defs(&mut skel, &maps, raw_obj_name)?;
882+
gen_skel_map_defs(&mut skel, &maps, raw_obj_name, true)?;
883+
gen_skel_map_defs(&mut skel, &maps, raw_obj_name, false)?;
946884
gen_skel_open_prog_defs(&mut skel, &progs, raw_obj_name)?;
947885
gen_skel_prog_defs(&mut skel, &progs, raw_obj_name)?;
948886

@@ -1135,12 +1073,12 @@ pub struct StructOps {{}}
11351073
}};
11361074
let _obj = obj_ref.write(obj);
11371075
// SAFETY: We just wrote initialized data to `obj_ref`.
1138-
let obj_ref = unsafe {{ OwnedRef::new(obj_ref) }};
1076+
let mut obj_ref = unsafe {{ OwnedRef::new(obj_ref) }};
11391077
11401078
Ok({name}Skel {{
1141-
obj: obj_ref,
1142-
maps: {name}Maps::new(self.maps),
1079+
maps: unsafe {{ {name}Maps::new(&self.skel_config, obj_ref.as_mut())? }},
11431080
progs: {name}Progs::new(self.progs),
1081+
obj: obj_ref,
11441082
struct_ops: self.struct_ops,
11451083
skel_config: self.skel_config,
11461084
{links}

0 commit comments

Comments
 (0)