mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-24 18:03:25 +00:00
Make TLB flush policy relaxed
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
52f1787d35
commit
fad39fdf7a
@ -16,7 +16,7 @@ use align_ext::AlignExt;
|
||||
use aster_rights::Rights;
|
||||
use ostd::{
|
||||
cpu::CpuExceptionInfo,
|
||||
mm::{PageFlags, PageProperty, VmSpace, MAX_USERSPACE_VADDR},
|
||||
mm::{tlb::TlbFlushOp, PageFlags, PageProperty, VmSpace, MAX_USERSPACE_VADDR},
|
||||
};
|
||||
|
||||
use self::{
|
||||
@ -706,6 +706,8 @@ impl Vmar_ {
|
||||
};
|
||||
new_cursor.copy_from(&mut cur_cursor, vm_mapping.map_size(), &mut op);
|
||||
}
|
||||
cur_cursor.flusher().issue_tlb_flush(TlbFlushOp::All);
|
||||
cur_cursor.flusher().dispatch_tlb_flush();
|
||||
}
|
||||
|
||||
drop(new_inner);
|
||||
|
@ -11,7 +11,8 @@ use core::{
|
||||
use align_ext::AlignExt;
|
||||
use aster_rights::Rights;
|
||||
use ostd::mm::{
|
||||
vm_space::VmItem, CachePolicy, Frame, FrameAllocOptions, PageFlags, PageProperty, VmSpace,
|
||||
tlb::TlbFlushOp, vm_space::VmItem, CachePolicy, Frame, FrameAllocOptions, PageFlags,
|
||||
PageProperty, VmSpace,
|
||||
};
|
||||
|
||||
use super::{interval::Interval, is_intersected, Vmar, Vmar_};
|
||||
@ -224,7 +225,7 @@ impl VmMapping {
|
||||
|
||||
match cursor.query().unwrap() {
|
||||
VmItem::Mapped {
|
||||
va: _,
|
||||
va,
|
||||
frame,
|
||||
mut prop,
|
||||
} if is_write => {
|
||||
@ -245,7 +246,9 @@ impl VmMapping {
|
||||
let new_flags = PageFlags::W | PageFlags::ACCESSED | PageFlags::DIRTY;
|
||||
|
||||
if self.is_shared || only_reference {
|
||||
cursor.protect(PAGE_SIZE, |p| p.flags |= new_flags);
|
||||
cursor.protect_next(PAGE_SIZE, |p| p.flags |= new_flags);
|
||||
cursor.flusher().issue_tlb_flush(TlbFlushOp::Address(va));
|
||||
cursor.flusher().dispatch_tlb_flush();
|
||||
} else {
|
||||
let new_frame = duplicate_frame(&frame)?;
|
||||
prop.flags |= new_flags;
|
||||
@ -558,7 +561,15 @@ impl VmMappingInner {
|
||||
debug_assert!(range.start % PAGE_SIZE == 0);
|
||||
debug_assert!(range.end % PAGE_SIZE == 0);
|
||||
let mut cursor = vm_space.cursor_mut(&range).unwrap();
|
||||
cursor.protect(range.len(), |p| p.flags = perms.into());
|
||||
let op = |p: &mut PageProperty| p.flags = perms.into();
|
||||
while cursor.virt_addr() < range.end {
|
||||
if let Some(va) = cursor.protect_next(range.end - cursor.virt_addr(), op) {
|
||||
cursor.flusher().issue_tlb_flush(TlbFlushOp::Range(va));
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
cursor.flusher().dispatch_tlb_flush();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user