summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorIliyan Malchev <malchev@google.com>2020-04-17 23:57:47 +0000
committerCommit Bot <commit-bot@chromium.org>2020-04-23 20:11:48 +0000
commited1498678a80bfdcd844af27d13252d3c3c9f51c (patch)
tree923f073ddb57386257ed8c7c27239019b41a610d /src/linux.rs
parent1160f456a4f21eb7ff11630fdeed224c3b4c56b4 (diff)
downloadcrosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.tar
crosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.tar.gz
crosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.tar.bz2
crosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.tar.lz
crosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.tar.xz
crosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.tar.zst
crosvm-ed1498678a80bfdcd844af27d13252d3c3c9f51c.zip
Apply same permissions to pmem-region alignments.
https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1979257
created a padding of read-only pages between the end of the pmem region
and padding up to the next multiple of 2MiB.  However, on ARM systems,
kvm_arch_prepare_memory_region does not permit read-only pages on a
write-able memory region.

BUG=b:148706939
TEST=Tested on x86_64 and arm64 board with pmem image < 2MiB
Tested-by: Iliyan Malchev <malchev@google.com>

Change-Id: If06c2e0f74fdcd7db1b7d56e1a8d732d17f352bf
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2153103
Tested-by: Dylan Reid <dgreid@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Dylan Reid <dgreid@chromium.org>
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Diffstat (limited to 'src/linux.rs')
-rw-r--r--src/linux.rs14
1 files changed, 5 insertions, 9 deletions
diff --git a/src/linux.rs b/src/linux.rs
index c8eb478..6a50449 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -890,7 +890,7 @@ fn create_pmem_device(
         .open(&disk.path)
         .map_err(|e| Error::Disk(disk.path.to_path_buf(), e))?;
 
-    let (disk_size, arena_size) = {
+    let arena_size = {
         let metadata =
             std::fs::metadata(&disk.path).map_err(|e| Error::Disk(disk.path.to_path_buf(), e))?;
         let disk_len = metadata.len();
@@ -905,12 +905,9 @@ fn create_pmem_device(
         } else {
             0
         };
-        (
-            disk_len,
-            disk_len
-                .checked_add(align_adjust)
-                .ok_or(Error::PmemDeviceImageTooBig)?,
-        )
+        disk_len
+            .checked_add(align_adjust)
+            .ok_or(Error::PmemDeviceImageTooBig)?
     };
 
     let protection = {
@@ -924,11 +921,10 @@ fn create_pmem_device(
     let arena = {
         // Conversion from u64 to usize may fail on 32bit system.
         let arena_size = usize::try_from(arena_size).map_err(|_| Error::PmemDeviceImageTooBig)?;
-        let disk_size = usize::try_from(disk_size).map_err(|_| Error::PmemDeviceImageTooBig)?;
 
         let mut arena = MemoryMappingArena::new(arena_size).map_err(Error::ReservePmemMemory)?;
         arena
-            .add_fd_offset_protection(0, disk_size, &fd, 0, protection)
+            .add_fd_offset_protection(0, arena_size, &fd, 0, protection)
             .map_err(Error::ReservePmemMemory)?;
         arena
     };