Skip to content

Commit d244e61

Browse files
committed
libbpf-cargo: Make all XXX_data skeleton members optional
As discussed in #1151, libbpf may not provide direct memory map access to any of the BPF map members if the kernel does not support memory-mapped global variable maps. To that end, make them all optional. Closes: #1151 Signed-off-by: Daniel Müller <[email protected]>
1 parent bb3e8bd commit d244e61

File tree

7 files changed

+50
-33
lines changed

7 files changed

+50
-33
lines changed

examples/capable/src/main.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,16 +174,16 @@ fn main() -> Result<()> {
174174
}
175175

176176
let mut open_object = MaybeUninit::uninit();
177-
let open_skel = skel_builder.open(&mut open_object)?;
178-
//Pass configuration to BPF
179-
open_skel.maps.rodata_data.tool_config.tgid = opts.pid; //tgid in kernel is pid in userland
180-
open_skel
177+
let mut open_skel = skel_builder.open(&mut open_object)?;
178+
let rodata = open_skel
181179
.maps
182180
.rodata_data
183-
.tool_config
184-
.verbose
185-
.write(opts.verbose);
186-
open_skel.maps.rodata_data.tool_config.unique_type = opts.unique_type;
181+
.as_deref_mut()
182+
.expect("`rodata` is not memory mapped");
183+
//Pass configuration to BPF
184+
rodata.tool_config.tgid = opts.pid; //tgid in kernel is pid in userland
185+
rodata.tool_config.verbose.write(opts.verbose);
186+
rodata.tool_config.unique_type = opts.unique_type;
187187

188188
let mut skel = open_skel.load()?;
189189
skel.attach()?;

examples/ringbuf_multi/src/main.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,15 @@ fn main() -> Result<()> {
4545
let mut open_object = MaybeUninit::uninit();
4646
let open_skel = skel_builder.open(&mut open_object)?;
4747
let mut skel = open_skel.load()?;
48+
let bss = skel
49+
.maps
50+
.bss_data
51+
.as_deref_mut()
52+
.expect("`bss` is not memory mapped");
4853

4954
// Only trigger BPF program for current process.
5055
let pid = unsafe { libc::getpid() };
51-
skel.maps.bss_data.pid = pid;
56+
bss.pid = pid;
5257

5358
let mut builder = libbpf_rs::RingBufferBuilder::new();
5459
builder
@@ -60,19 +65,24 @@ fn main() -> Result<()> {
6065
let ringbuf = builder.build().unwrap();
6166

6267
let () = skel.attach()?;
68+
let bss = skel
69+
.maps
70+
.bss_data
71+
.as_deref_mut()
72+
.expect("`bss` is not memory mapped");
6373

6474
// trigger few samples, some will be skipped
65-
skel.maps.bss_data.target_ring = 0;
66-
skel.maps.bss_data.value = 333;
75+
bss.target_ring = 0;
76+
bss.value = 333;
6777
let _pgid = unsafe { libc::getpgid(pid) };
6878

6979
// skipped, no ringbuf in slot 1
70-
skel.maps.bss_data.target_ring = 1;
71-
skel.maps.bss_data.value = 555;
80+
bss.target_ring = 1;
81+
bss.value = 555;
7282
let _pgid = unsafe { libc::getpgid(pid) };
7383

74-
skel.maps.bss_data.target_ring = 2;
75-
skel.maps.bss_data.value = 777;
84+
bss.target_ring = 2;
85+
bss.value = 777;
7686
let _pgid = unsafe { libc::getpgid(pid) };
7787

7888
// poll for samples, should get 2 ringbufs back

examples/runqslower/src/main.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,13 @@ fn main() -> Result<()> {
7878
}
7979

8080
let mut open_object = MaybeUninit::uninit();
81-
let open_skel = skel_builder.open(&mut open_object)?;
81+
let mut open_skel = skel_builder.open(&mut open_object)?;
82+
let rodata = open_skel.maps.rodata_data.as_deref_mut().expect("`rodata` is not memory mapped");
8283

8384
// Write arguments into prog
84-
open_skel.maps.rodata_data.min_us = opts.latency;
85-
open_skel.maps.rodata_data.targ_pid = opts.pid;
86-
open_skel.maps.rodata_data.targ_tgid = opts.tid;
85+
rodata.min_us = opts.latency;
86+
rodata.targ_pid = opts.pid;
87+
rodata.targ_tgid = opts.tid;
8788

8889
// Begin tracing
8990
let mut skel = open_skel.load()?;

examples/tcp_ca/src/main.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,19 +163,20 @@ fn test(name_to_register: Option<&OsStr>, name_to_use: &OsStr, verbose: bool) ->
163163
// NB: At this point `/proc/sys/net/ipv4/tcp_available_congestion_control`
164164
// would list the registered congestion algorithm.
165165

166-
assert_eq!(skel.maps.bss_data.ca_cnt, 0);
167-
assert!(!skel.maps.bss_data.cong_control);
166+
let bss = skel.maps.bss_data.as_deref_mut().expect("`bss` is not memory mapped");
167+
assert_eq!(bss.ca_cnt, 0);
168+
assert!(!bss.cong_control);
168169

169170
// Use our registered TCP congestion algorithm while sending a bunch of data
170171
// over the loopback device.
171172
let () = send_recv(name_to_use)?;
172173
println!("Done.");
173174

174-
let saved_ca_cnt = skel.maps.bss_data.ca_cnt;
175+
let saved_ca_cnt = bss.ca_cnt;
175176
assert_ne!(saved_ca_cnt, 0);
176177
// With `ca_update_cong_control2` active, we should have seen the
177178
// `cong_control` value changed as well.
178-
assert!(skel.maps.bss_data.cong_control);
179+
assert!(bss.cong_control);
179180
Ok(())
180181
}
181182

examples/tcp_option/src/main.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,17 @@ fn main() -> Result<()> {
8686
builder.obj_builder.debug(true);
8787
}
8888
let mut open_object = MaybeUninit::uninit();
89-
let open = builder.open(&mut open_object)?;
89+
let mut open_skel = builder.open(&mut open_object)?;
90+
let rodata = open_skel
91+
.maps
92+
.rodata_data
93+
.as_deref_mut()
94+
.expect("`rodata` is not memory mapped");
9095

91-
open.maps.rodata_data.targ_ip = u32::from_be_bytes(ip.octets()).to_be();
92-
open.maps.rodata_data.data_such_as_trace_id = opts.trace_id;
96+
rodata.targ_ip = u32::from_be_bytes(ip.octets()).to_be();
97+
rodata.data_such_as_trace_id = opts.trace_id;
9398

94-
let skel = open.load()?;
99+
let skel = open_skel.load()?;
95100

96101
let cgroup_fd = OpenOptions::new()
97102
.read(true)

examples/tproxy/src/main.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ fn main() -> Result<()> {
6868

6969
// Set constants
7070
let mut open_object = MaybeUninit::uninit();
71-
let open_skel = skel_builder.open(&mut open_object)?;
72-
open_skel.maps.rodata_data.target_port = opts.port.to_be();
73-
open_skel.maps.rodata_data.proxy_addr = proxy_addr.to_be();
74-
open_skel.maps.rodata_data.proxy_port = opts.proxy_port.to_be();
71+
let mut open_skel = skel_builder.open(&mut open_object)?;
72+
let rodata = open_skel.maps.rodata_data.as_deref_mut().expect("`rodata` is not memory mapped");
73+
rodata.target_port = opts.port.to_be();
74+
rodata.proxy_addr = proxy_addr.to_be();
75+
rodata.proxy_port = opts.proxy_port.to_be();
7576

7677
// Load into kernel
7778
let skel = open_skel.load()?;

libbpf-cargo/src/gen/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ fn gen_skel_map_defs(
405405
write!(
406406
skel,
407407
"\
408-
pub {name}_data: &'obj{ref_mut} types::{name},
408+
pub {name}_data: Option<&'obj{ref_mut} types::{name}>,
409409
",
410410
name = map.name,
411411
)?;
@@ -499,7 +499,6 @@ fn gen_skel_map_defs(
499499
.expect(\"BPF map `{name}` does not have mmap pointer\")
500500
.cast::<types::{name}>()
501501
.as_{ref_conv}()
502-
.expect(\"BPF map `{name}` mmap pointer is NULL\")
503502
}},
504503
",
505504
name = map.name,

0 commit comments

Comments
 (0)