|
@@ -59,7 +59,7 @@ use std::{
|
|
|
};
|
|
|
|
|
|
use crate::util::KernelVersion;
|
|
|
-use libc::{getrlimit, rlimit, RLIMIT_MEMLOCK, RLIM_INFINITY};
|
|
|
+use libc::{getrlimit, rlim_t, rlimit, RLIMIT_MEMLOCK, RLIM_INFINITY};
|
|
|
use log::warn;
|
|
|
use thiserror::Error;
|
|
|
|
|
@@ -198,20 +198,6 @@ impl AsFd for MapFd {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
|
|
-struct RlimitSize(usize);
|
|
|
-impl fmt::Display for RlimitSize {
|
|
|
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
- if self.0 < 1024 {
|
|
|
- write!(f, "{} bytes", self.0)
|
|
|
- } else if self.0 < 1024 * 1024 {
|
|
|
- write!(f, "{} KiB", self.0 / 1024)
|
|
|
- } else {
|
|
|
- write!(f, "{} MiB", self.0 / 1024 / 1024)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/// Raises a warning about rlimit. Should be used only if creating a map was not
|
|
|
/// successful.
|
|
|
fn maybe_warn_rlimit() {
|
|
@@ -220,15 +206,28 @@ fn maybe_warn_rlimit() {
|
|
|
if ret == 0 {
|
|
|
let limit = unsafe { limit.assume_init() };
|
|
|
|
|
|
- let limit: RlimitSize = RlimitSize(limit.rlim_cur.try_into().unwrap());
|
|
|
- if limit.0 == RLIM_INFINITY.try_into().unwrap() {
|
|
|
+ if limit.rlim_cur == RLIM_INFINITY {
|
|
|
return;
|
|
|
}
|
|
|
+ struct HumanSize(rlim_t);
|
|
|
+
|
|
|
+ impl fmt::Display for HumanSize {
|
|
|
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
+ let &Self(size) = self;
|
|
|
+ if size < 1024 {
|
|
|
+ write!(f, "{} bytes", size)
|
|
|
+ } else if size < 1024 * 1024 {
|
|
|
+ write!(f, "{} KiB", size / 1024)
|
|
|
+ } else {
|
|
|
+ write!(f, "{} MiB", size / 1024 / 1024)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
warn!(
|
|
|
- "RLIMIT_MEMLOCK value is {}, not RLIM_INFNITY; if experiencing problems with creating \
|
|
|
- maps, try raising RMILIT_MEMLOCK either to RLIM_INFINITY or to a higher value sufficient \
|
|
|
- for size of your maps",
|
|
|
- limit
|
|
|
+ "RLIMIT_MEMLOCK value is {}, not RLIM_INFINITY; if experiencing problems with creating \
|
|
|
+ maps, try raising RLIMIT_MEMLOCK either to RLIM_INFINITY or to a higher value sufficient \
|
|
|
+ for the size of your maps",
|
|
|
+ HumanSize(limit.rlim_cur)
|
|
|
);
|
|
|
}
|
|
|
}
|