Unwrap some unreachable errors

This commit is contained in:
Ruihan Li
2025-06-22 09:31:12 +08:00
committed by Chengjun Chen
parent 65fd1aac81
commit 1c423d6b6d
2 changed files with 21 additions and 16 deletions

View File

@ -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.

View File

@ -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.