add map_ids field to bpf_prog_get_info_by_fd

Add an optional field (map_ids) to the syscall, this allows a pointer to
a buffer to be filled with the map_ids in use by the program.

Signed-off-by: Andrew Stoycos <astoycos@redhat.com>
reviewable/pr637/r35
Andrew Stoycos 2 years ago
parent f334cbd86e
commit 0295b63315
No known key found for this signature in database
GPG Key ID: 66735B92BB71C096

@ -151,11 +151,12 @@ impl Extension {
/// with the name `func_name` within that BTF object.
fn get_btf_info(prog_fd: i32, func_name: &str) -> Result<(RawFd, u32), ProgramError> {
// retrieve program information
let info =
sys::bpf_prog_get_info_by_fd(prog_fd).map_err(|io_error| ProgramError::SyscallError {
let info = sys::bpf_prog_get_info_by_fd(prog_fd, &[]).map_err(|io_error| {
ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})?;
}
})?;
// btf_id refers to the ID of the program btf that was loaded with bpf(BPF_BTF_LOAD)
if info.btf_id == 0 {

@ -132,7 +132,7 @@ impl LircLink {
/// Get ProgramInfo from this link
pub fn info(&self) -> Result<ProgramInfo, ProgramError> {
match bpf_prog_get_info_by_fd(self.prog_fd) {
match bpf_prog_get_info_by_fd(self.prog_fd, &[]) {
Ok(info) => Ok(ProgramInfo(info)),
Err(io_error) => Err(ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",

@ -494,10 +494,11 @@ impl<T: Link> ProgramData<T> {
io_error,
})? as RawFd;
let info = bpf_prog_get_info_by_fd(fd).map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})?;
let info =
bpf_prog_get_info_by_fd(fd, &[]).map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})?;
let name = ProgramInfo(info).name_as_str().map(|s| s.to_string());
ProgramData::from_bpf_prog_info(name, fd, path.as_ref(), info, verifier_log_level)
@ -967,10 +968,11 @@ impl ProgramInfo {
io_error,
})? as RawFd;
let info = bpf_prog_get_info_by_fd(fd).map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})?;
let info =
bpf_prog_get_info_by_fd(fd, &[]).map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,
})?;
unsafe {
libc::close(fd);
}
@ -1003,7 +1005,7 @@ impl Iterator for ProgramsIter {
io_error,
})
.and_then(|fd| {
bpf_prog_get_info_by_fd(fd.as_raw_fd())
bpf_prog_get_info_by_fd(fd.as_raw_fd(), &[])
.map_err(|io_error| ProgramError::SyscallError {
call: "bpf_prog_get_info_by_fd",
io_error,

@ -481,17 +481,21 @@ pub(crate) fn bpf_prog_get_fd_by_id(prog_id: u32) -> Result<OwnedFd, io::Error>
}
}
pub(crate) fn bpf_prog_get_info_by_fd(prog_fd: RawFd) -> Result<bpf_prog_info, io::Error> {
pub(crate) fn bpf_prog_get_info_by_fd(
prog_fd: RawFd,
map_ids: &[u32],
) -> Result<bpf_prog_info, io::Error> {
let mut attr = unsafe { mem::zeroed::<bpf_attr>() };
// info gets entirely populated by the kernel
let info = MaybeUninit::zeroed();
let mut info = unsafe { mem::zeroed::<bpf_prog_info>() };
info.map_ids = map_ids.as_ptr() as u64;
info.nr_map_ids = map_ids.len() as u32;
attr.info.bpf_fd = prog_fd as u32;
attr.info.info = &info as *const _ as u64;
attr.info.info_len = mem::size_of::<bpf_prog_info>() as u32;
match sys_bpf(bpf_cmd::BPF_OBJ_GET_INFO_BY_FD, &attr) {
Ok(_) => Ok(unsafe { info.assume_init() }),
Ok(_) => Ok(info),
Err((_, err)) => Err(err),
}
}

Loading…
Cancel
Save