mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 01:43:22 +00:00
Implement remote TLB flush on VmSpace
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
326ec09169
commit
d9eccdcfbe
@ -50,14 +50,14 @@ impl<T: PreemptSchedInfo> PreemptScheduler<T> {
|
||||
let mut minimum_load = usize::MAX;
|
||||
|
||||
for candidate in runnable.cpu_affinity().iter() {
|
||||
let rq = self.rq[candidate].lock();
|
||||
let rq = self.rq[candidate as usize].lock();
|
||||
// A wild guess measuring the load of a runqueue. We assume that
|
||||
// real-time tasks are 4-times as important as normal tasks.
|
||||
let load = rq.real_time_entities.len() * 8
|
||||
+ rq.normal_entities.len() * 2
|
||||
+ rq.lowest_entities.len();
|
||||
if load < minimum_load {
|
||||
selected = candidate as u32;
|
||||
selected = candidate;
|
||||
minimum_load = load;
|
||||
}
|
||||
}
|
||||
|
@ -24,12 +24,12 @@ impl WorkerScheduler for SimpleScheduler {
|
||||
fn schedule(&self) {
|
||||
let worker_pool = self.worker_pool.upgrade().unwrap();
|
||||
for cpu_id in worker_pool.cpu_set().iter() {
|
||||
if !worker_pool.heartbeat(cpu_id as u32)
|
||||
&& worker_pool.has_pending_work_items(cpu_id as u32)
|
||||
&& !worker_pool.wake_worker(cpu_id as u32)
|
||||
&& worker_pool.num_workers(cpu_id as u32) < WORKER_LIMIT
|
||||
if !worker_pool.heartbeat(cpu_id)
|
||||
&& worker_pool.has_pending_work_items(cpu_id)
|
||||
&& !worker_pool.wake_worker(cpu_id)
|
||||
&& worker_pool.num_workers(cpu_id) < WORKER_LIMIT
|
||||
{
|
||||
worker_pool.add_worker(cpu_id as u32);
|
||||
worker_pool.add_worker(cpu_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -128,10 +128,7 @@ impl WorkerPool {
|
||||
Arc::new_cyclic(|pool_ref| {
|
||||
let mut local_pools = Vec::new();
|
||||
for cpu_id in cpu_set.iter() {
|
||||
local_pools.push(Arc::new(LocalWorkerPool::new(
|
||||
pool_ref.clone(),
|
||||
cpu_id as u32,
|
||||
)));
|
||||
local_pools.push(Arc::new(LocalWorkerPool::new(pool_ref.clone(), cpu_id)));
|
||||
}
|
||||
WorkerPool {
|
||||
local_pools,
|
||||
|
@ -336,7 +336,7 @@ impl Vmar_ {
|
||||
if !self.is_root_vmar() {
|
||||
return_errno_with_message!(Errno::EACCES, "The vmar is not root vmar");
|
||||
}
|
||||
self.vm_space.clear();
|
||||
self.clear_vm_space();
|
||||
let mut inner = self.inner.lock();
|
||||
inner.child_vmar_s.clear();
|
||||
inner.vm_mappings.clear();
|
||||
@ -346,6 +346,13 @@ impl Vmar_ {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn clear_vm_space(&self) {
|
||||
let start = ROOT_VMAR_LOWEST_ADDR;
|
||||
let end = ROOT_VMAR_CAP_ADDR;
|
||||
let mut cursor = self.vm_space.cursor_mut(&(start..end)).unwrap();
|
||||
cursor.unmap(end - start);
|
||||
}
|
||||
|
||||
pub fn destroy(&self, range: Range<usize>) -> Result<()> {
|
||||
self.check_destroy_range(&range)?;
|
||||
let mut inner = self.inner.lock();
|
||||
|
Reference in New Issue
Block a user