Core affinity for FreeBSD pinning task to the wanted cpu (#756)
This commit is contained in:
parent
28194ac746
commit
87fdd55125
@ -618,7 +618,7 @@ mod freebsd {
|
||||
use alloc::vec::Vec;
|
||||
use std::{mem, thread::available_parallelism};
|
||||
|
||||
use libc::{cpuset_setaffinity, cpuset_t, CPU_SET};
|
||||
use libc::{cpuset_getaffinity, cpuset_setaffinity, cpuset_t, CPU_ISSET, CPU_SET};
|
||||
|
||||
use super::CoreId;
|
||||
use crate::Error;
|
||||
@ -658,6 +658,29 @@ mod freebsd {
|
||||
}
|
||||
}
|
||||
|
||||
fn get_affinity_mask() -> Result<cpuset_t, Error> {
|
||||
let mut set = new_cpuset();
|
||||
|
||||
// Try to get current core affinity mask.
|
||||
let result = unsafe {
|
||||
cpuset_getaffinity(
|
||||
CPU_LEVEL_WHICH,
|
||||
CPU_WHICH_PID,
|
||||
-1, // Defaults to current thread
|
||||
mem::size_of::<cpuset_t>(),
|
||||
&mut set,
|
||||
)
|
||||
};
|
||||
|
||||
if result == 0 {
|
||||
Ok(set)
|
||||
} else {
|
||||
Err(Error::unknown(
|
||||
"Failed to retrieve affinity using cpuset_getaffinity",
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
fn new_cpuset() -> cpuset_t {
|
||||
unsafe { mem::zeroed::<cpuset_t>() }
|
||||
}
|
||||
@ -666,6 +689,11 @@ mod freebsd {
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_freebsd_get_affinity_mask() {
|
||||
get_affinity_mask().unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_freebsd_set_for_current() {
|
||||
let ids = get_core_ids().unwrap();
|
||||
@ -674,8 +702,25 @@ mod freebsd {
|
||||
|
||||
ids[0].set_affinity().unwrap();
|
||||
|
||||
// TODO: Ensure that the system pinned the current thread
|
||||
// Ensure that the system pinned the current thread
|
||||
// to the specified core.
|
||||
let mut core_mask = new_cpuset();
|
||||
unsafe { CPU_SET(ids[0].id, &mut core_mask) };
|
||||
|
||||
let new_mask = get_affinity_mask().unwrap();
|
||||
|
||||
let mut is_equal = true;
|
||||
|
||||
for i in 0..256 as usize {
|
||||
let is_set1 = unsafe { CPU_ISSET(i, &core_mask) };
|
||||
let is_set2 = unsafe { CPU_ISSET(i, &new_mask) };
|
||||
|
||||
if is_set1 != is_set2 {
|
||||
is_equal = false;
|
||||
}
|
||||
}
|
||||
|
||||
assert!(is_equal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user