Use walk_range when traversing the page tables without modifying them

modify_range() has been updated to split block entries to match the
provided range, so that modifications to the descriptor cannot impact
adjacent mappings inadvertently.

This is not always desirable, and most of our uses of modify_range()
don't make any changes at all to the descriptor so let's use the newly
added walk_range() instead. Note that the region is not expanded
outwards to match the granularity of the a block descriptor at the given
level, so we need to calculate this value from the level argument where
needed.

Test: build tested only
Change-Id: I154f7e7f64c58613dd409c17a7125c92db259314
diff --git a/vmbase/src/memory/dbm.rs b/vmbase/src/memory/dbm.rs
index 401022e..45f409c 100644
--- a/vmbase/src/memory/dbm.rs
+++ b/vmbase/src/memory/dbm.rs
@@ -52,14 +52,10 @@
 /// Flushes a memory range the descriptor refers to, if the descriptor is in writable-dirty state.
 pub(super) fn flush_dirty_range(
     va_range: &MemoryRegion,
-    desc: &mut Descriptor,
-    level: usize,
+    desc: &Descriptor,
+    _level: usize,
 ) -> Result<(), ()> {
-    // Only flush ranges corresponding to dirty leaf PTEs.
     let flags = desc.flags().ok_or(())?;
-    if !is_leaf_pte(&flags, level) {
-        return Ok(());
-    }
     if !flags.contains(Attributes::READ_ONLY) {
         flush_region(va_range.start().0, va_range.len());
     }