mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-28 20:03:22 +00:00
Unwrap some unreachable errors
This commit is contained in:
@ -270,7 +270,7 @@ impl VmarInner {
|
|||||||
let vm_mapping_range = vm_mapping.range();
|
let vm_mapping_range = vm_mapping.range();
|
||||||
let intersected_range = get_intersected_range(&range, &vm_mapping_range);
|
let intersected_range = get_intersected_range(&range, &vm_mapping_range);
|
||||||
|
|
||||||
let (left, taken, right) = vm_mapping.split_range(&intersected_range)?;
|
let (left, taken, right) = vm_mapping.split_range(&intersected_range);
|
||||||
if let Some(left) = left {
|
if let Some(left) = left {
|
||||||
self.insert(left);
|
self.insert(left);
|
||||||
}
|
}
|
||||||
@ -278,7 +278,7 @@ impl VmarInner {
|
|||||||
self.insert(right);
|
self.insert(right);
|
||||||
}
|
}
|
||||||
|
|
||||||
rss_delta.add(taken.rss_type(), -(taken.unmap(vm_space)? as isize));
|
rss_delta.add(taken.rss_type(), -(taken.unmap(vm_space) as isize));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(offset..(offset + size))
|
Ok(offset..(offset + size))
|
||||||
@ -460,7 +460,7 @@ impl Vmar_ {
|
|||||||
let intersected_range = get_intersected_range(&range, &vm_mapping_range);
|
let intersected_range = get_intersected_range(&range, &vm_mapping_range);
|
||||||
|
|
||||||
// Protects part of the taken `VmMapping`.
|
// Protects part of the taken `VmMapping`.
|
||||||
let (left, taken, right) = vm_mapping.split_range(&intersected_range)?;
|
let (left, taken, right) = vm_mapping.split_range(&intersected_range);
|
||||||
|
|
||||||
let taken = taken.protect(vm_space.as_ref(), perms);
|
let taken = taken.protect(vm_space.as_ref(), perms);
|
||||||
inner.insert(taken);
|
inner.insert(taken);
|
||||||
@ -551,6 +551,10 @@ impl Vmar_ {
|
|||||||
new_addr: Option<Vaddr>,
|
new_addr: Option<Vaddr>,
|
||||||
new_size: usize,
|
new_size: usize,
|
||||||
) -> Result<Vaddr> {
|
) -> Result<Vaddr> {
|
||||||
|
debug_assert_eq!(old_addr % PAGE_SIZE, 0);
|
||||||
|
debug_assert_eq!(old_size % PAGE_SIZE, 0);
|
||||||
|
debug_assert_eq!(new_size % PAGE_SIZE, 0);
|
||||||
|
|
||||||
let mut inner = self.inner.write();
|
let mut inner = self.inner.write();
|
||||||
let old_mapping_addr = inner.check_lies_in_single_mapping(old_addr, old_size)?;
|
let old_mapping_addr = inner.check_lies_in_single_mapping(old_addr, old_size)?;
|
||||||
|
|
||||||
@ -586,7 +590,7 @@ impl Vmar_ {
|
|||||||
// Create a new `VmMapping`.
|
// Create a new `VmMapping`.
|
||||||
let old_mapping = {
|
let old_mapping = {
|
||||||
let vm_mapping = inner.remove(&old_mapping_addr).unwrap();
|
let vm_mapping = inner.remove(&old_mapping_addr).unwrap();
|
||||||
let (left, old_mapping, right) = vm_mapping.split_range(&old_range)?;
|
let (left, old_mapping, right) = vm_mapping.split_range(&old_range);
|
||||||
if let Some(left) = left {
|
if let Some(left) = left {
|
||||||
inner.insert(left);
|
inner.insert(left);
|
||||||
}
|
}
|
||||||
@ -594,8 +598,8 @@ impl Vmar_ {
|
|||||||
inner.insert(right);
|
inner.insert(right);
|
||||||
}
|
}
|
||||||
if new_size < old_size {
|
if new_size < old_size {
|
||||||
let (old_mapping, taken) = old_mapping.split(old_range.start + new_size)?;
|
let (old_mapping, taken) = old_mapping.split(old_range.start + new_size).unwrap();
|
||||||
rss_delta.add(taken.rss_type(), -(taken.unmap(&self.vm_space)? as isize));
|
rss_delta.add(taken.rss_type(), -(taken.unmap(&self.vm_space) as isize));
|
||||||
old_size = new_size;
|
old_size = new_size;
|
||||||
old_range = old_range.start..(old_range.start + old_size);
|
old_range = old_range.start..(old_range.start + old_size);
|
||||||
old_mapping
|
old_mapping
|
||||||
@ -604,7 +608,7 @@ impl Vmar_ {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Now we can ensure that `new_size >= old_size`.
|
// Now we can ensure that `new_size >= old_size`.
|
||||||
let new_mapping = old_mapping.clone_for_remap_at(new_range.start)?;
|
let new_mapping = old_mapping.clone_for_remap_at(new_range.start).unwrap();
|
||||||
inner.insert(new_mapping.enlarge(new_size - old_size));
|
inner.insert(new_mapping.enlarge(new_size - old_size));
|
||||||
|
|
||||||
// Move the mapping.
|
// Move the mapping.
|
||||||
|
@ -444,27 +444,28 @@ impl VmMapping {
|
|||||||
///
|
///
|
||||||
/// Panics if the mapping does not contain the range, or if the start or
|
/// Panics if the mapping does not contain the range, or if the start or
|
||||||
/// end of the range is not page-aligned.
|
/// end of the range is not page-aligned.
|
||||||
pub fn split_range(self, range: &Range<Vaddr>) -> Result<(Option<Self>, Self, Option<Self>)> {
|
pub fn split_range(self, range: &Range<Vaddr>) -> (Option<Self>, Self, Option<Self>) {
|
||||||
let mapping_range = self.range();
|
let mapping_range = self.range();
|
||||||
if range.start <= mapping_range.start && mapping_range.end <= range.end {
|
if range.start <= mapping_range.start && mapping_range.end <= range.end {
|
||||||
// Condition 4.
|
// Condition 4.
|
||||||
return Ok((None, self, None));
|
(None, self, None)
|
||||||
} else if mapping_range.start < range.start {
|
} else if mapping_range.start < range.start {
|
||||||
let (left, within) = self.split(range.start).unwrap();
|
let (left, within) = self.split(range.start).unwrap();
|
||||||
if range.end < mapping_range.end {
|
if range.end < mapping_range.end {
|
||||||
// Condition 3.
|
// Condition 3.
|
||||||
let (within, right) = within.split(range.end).unwrap();
|
let (within, right) = within.split(range.end).unwrap();
|
||||||
return Ok((Some(left), within, Some(right)));
|
(Some(left), within, Some(right))
|
||||||
} else {
|
} else {
|
||||||
// Condition 1.
|
// Condition 1.
|
||||||
return Ok((Some(left), within, None));
|
(Some(left), within, None)
|
||||||
}
|
}
|
||||||
} else if mapping_range.contains(&range.end) {
|
} else if mapping_range.contains(&range.end) {
|
||||||
// Condition 2.
|
// Condition 2.
|
||||||
let (within, right) = self.split(range.end).unwrap();
|
let (within, right) = self.split(range.end).unwrap();
|
||||||
return Ok((None, within, Some(right)));
|
(None, within, Some(right))
|
||||||
|
} else {
|
||||||
|
panic!("The mapping does not contain the splitting range");
|
||||||
}
|
}
|
||||||
panic!("The mapping does not contain the splitting range.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -473,16 +474,16 @@ impl VmMapping {
|
|||||||
impl VmMapping {
|
impl VmMapping {
|
||||||
/// Unmaps the mapping from the VM space,
|
/// Unmaps the mapping from the VM space,
|
||||||
/// and returns the number of unmapped pages.
|
/// and returns the number of unmapped pages.
|
||||||
pub(super) fn unmap(self, vm_space: &VmSpace) -> Result<usize> {
|
pub(super) fn unmap(self, vm_space: &VmSpace) -> usize {
|
||||||
let preempt_guard = disable_preempt();
|
let preempt_guard = disable_preempt();
|
||||||
let range = self.range();
|
let range = self.range();
|
||||||
let mut cursor = vm_space.cursor_mut(&preempt_guard, &range)?;
|
let mut cursor = vm_space.cursor_mut(&preempt_guard, &range).unwrap();
|
||||||
|
|
||||||
let num_unmapped = cursor.unmap(range.len());
|
let num_unmapped = cursor.unmap(range.len());
|
||||||
cursor.flusher().dispatch_tlb_flush();
|
cursor.flusher().dispatch_tlb_flush();
|
||||||
cursor.flusher().sync_tlb_flush();
|
cursor.flusher().sync_tlb_flush();
|
||||||
|
|
||||||
Ok(num_unmapped)
|
num_unmapped
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Change the perms of the mapping.
|
/// Change the perms of the mapping.
|
||||||
|
Reference in New Issue
Block a user