From bb8b94f954a559d1efac987dce1860bbb232d746 Mon Sep 17 00:00:00 2001 From: Jon Lange Date: Tue, 28 Nov 2023 13:17:59 -0800 Subject: [PATCH] Optimize VMM creation of reserved ranges by skipping the loop that attempts to map pages Signed-off-by: Jon Lange --- src/mm/vm/mapping/api.rs | 11 +++++++++++ src/mm/vm/mapping/reserved.rs | 4 ++++ src/mm/vm/range.rs | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/src/mm/vm/mapping/api.rs b/src/mm/vm/mapping/api.rs index 7917d6250..3c2745a4d 100644 --- a/src/mm/vm/mapping/api.rs +++ b/src/mm/vm/mapping/api.rs @@ -39,6 +39,17 @@ pub trait VirtualMapping: core::fmt::Debug { /// Mapping size. Will always be a multiple of `VirtualMapping::page_size()` fn mapping_size(&self) -> usize; + /// Indicates whether the mapping has any associated data. + /// + /// # Returns + /// + /// `true' if there is associated physical data, or `false' if there is + /// none. + fn has_data(&self) -> bool { + // Defaults to true + true + } + /// Request physical address to map for a given offset /// /// # Arguments diff --git a/src/mm/vm/mapping/reserved.rs b/src/mm/vm/mapping/reserved.rs index 7dcbf4266..5bd9b298b 100644 --- a/src/mm/vm/mapping/reserved.rs +++ b/src/mm/vm/mapping/reserved.rs @@ -51,6 +51,10 @@ impl VirtualMapping for VMReserved { self.size } + fn has_data(&self) -> bool { + false + } + fn map(&self, _offset: usize) -> Option { None } diff --git a/src/mm/vm/range.rs b/src/mm/vm/range.rs index cf324ca6a..fa584de5d 100644 --- a/src/mm/vm/range.rs +++ b/src/mm/vm/range.rs @@ -159,6 +159,11 @@ impl VMR { let page_size = mapping.page_size(); let shared = mapping.shared(); + // Exit early if the mapping has no data. + if !mapping.has_data() { + return Ok(()); + } + while vmm_start + offset < vmm_end { let idx = PageTable::index::<3>(VirtAddr::from(vmm_start - rstart)); if let Some(paddr) = mapping.map(offset) {