aya: Fix program loading on kernels with a patch > 255

pull/791/head
Andrés Medina 1 year ago committed by Tamir Duberstein
parent 2f9c67c735
commit 0a6a2674fa

@ -617,14 +617,8 @@ fn load_program<T: Link>(
}, },
) = obj; ) = obj;
let target_kernel_version = kernel_version.unwrap_or_else(|| { let target_kernel_version =
let KernelVersion { kernel_version.unwrap_or_else(|| KernelVersion::current().unwrap().code());
major,
minor,
patch,
} = KernelVersion::current().unwrap();
(u32::from(major) << 16) + (u32::from(minor) << 8) + u32::from(patch)
});
let prog_name = if let Some(name) = name { let prog_name = if let Some(name) = name {
let mut name = name.clone(); let mut name = name.clone();

@ -49,23 +49,43 @@ impl KernelVersion {
/// Returns the kernel version of the currently running kernel. /// Returns the kernel version of the currently running kernel.
pub fn current() -> Result<Self, impl Error> { pub fn current() -> Result<Self, impl Error> {
let kernel_version = Self::get_kernel_version(); Self::get_kernel_version()
}
// The kernel version is clamped to 4.19.255 on kernels 4.19.222 and above. /// The equivalent of LINUX_VERSION_CODE.
// pub(crate) fn code(self) -> u32 {
// See https://github.com/torvalds/linux/commit/a256aac. let Self {
const CLAMPED_KERNEL_MAJOR: u8 = 4; major,
const CLAMPED_KERNEL_MINOR: u8 = 19; minor,
if let Ok(Self { mut patch,
major: CLAMPED_KERNEL_MAJOR, } = self;
minor: CLAMPED_KERNEL_MINOR,
patch: 222.., // Certain LTS kernels went above the "max" 255 patch so
}) = kernel_version // backports were done to cap the patch version
{ let max_patch = match (major, minor) {
return Ok(Self::new(CLAMPED_KERNEL_MAJOR, CLAMPED_KERNEL_MINOR, 255)); // On 4.4 + 4.9, any patch 257 or above was hardcoded to 255.
// See: https://github.com/torvalds/linux/commit/a15813a +
// https://github.com/torvalds/linux/commit/42efb098
(4, 4 | 9) => 257,
// On 4.14, any patch 252 or above was hardcoded to 255.
// See: https://github.com/torvalds/linux/commit/e131e0e
(4, 14) => 252,
// On 4.19, any patch 222 or above was hardcoded to 255.
// See: https://github.com/torvalds/linux/commit/a256aac
(4, 19) => 222,
// For other kernels (i.e., newer LTS kernels as other
// ones won't reach 255+ patches) clamp it to 255. See:
// https://github.com/torvalds/linux/commit/9b82f13e
_ => 255,
};
// anything greater or equal to `max_patch` is hardcoded to
// 255.
if patch >= max_patch {
patch = 255;
} }
kernel_version (u32::from(major) << 16) + (u32::from(minor) << 8) + u32::from(patch)
} }
// This is ported from https://github.com/torvalds/linux/blob/3f01e9f/tools/lib/bpf/libbpf_probes.c#L21-L101. // This is ported from https://github.com/torvalds/linux/blob/3f01e9f/tools/lib/bpf/libbpf_probes.c#L21-L101.

Loading…
Cancel
Save