perf(kernel): linked cap tree, translate-based page lookup, next-fit frames/heap, targeted dequeue; host benches
This commit is contained in:
@@ -35,17 +35,17 @@ impl<P: Platform> Kernel<P> {
|
||||
|
||||
/// Homes a new thread on the core with the fewest live threads.
|
||||
pub(crate) fn place(&mut self, tid: ThreadId) {
|
||||
let cores = self.scheduler.num_cores().max(1);
|
||||
let load = |core: CoreId| {
|
||||
self.threads
|
||||
.iter()
|
||||
.filter(|(t, _)| *t != tid && self.home(*t) == core)
|
||||
.count()
|
||||
};
|
||||
let cores = usize::from(self.scheduler.num_cores().max(1));
|
||||
let mut load = [0usize; u8::MAX as usize + 1];
|
||||
for (t, _) in self.threads.iter().filter(|(t, _)| *t != tid) {
|
||||
if let Some(n) = load.get_mut(usize::from(self.home(t).raw())) {
|
||||
*n += 1;
|
||||
}
|
||||
}
|
||||
let best = (0..cores)
|
||||
.map(CoreId::from_raw)
|
||||
.min_by_key(|c| load(*c))
|
||||
.unwrap_or(CoreId::from_raw(0));
|
||||
.min_by_key(|c| load.get(*c).copied().unwrap_or(usize::MAX))
|
||||
.and_then(|c| u8::try_from(c).ok())
|
||||
.map_or(CoreId::from_raw(0), CoreId::from_raw);
|
||||
self.set_home(tid, best);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user