summary refs log tree commit diff
path: root/disk
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-11-12 14:05:56 -0800
committerCommit Bot <commit-bot@chromium.org>2019-11-27 21:22:40 +0000
commit624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59 (patch)
treebb2b724f31bb560df8c060deddd0fcd3996d7622 /disk
parent41d889eb267cdcd066575b5647bf05c516d70201 (diff)
downloadcrosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.tar
crosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.tar.gz
crosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.tar.bz2
crosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.tar.lz
crosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.tar.xz
crosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.tar.zst
crosvm-624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59.zip
disk: switch from WriteZeroes to WriteZeroesAt
This eliminates an extra seek per guest write zeroes request.

Additionally, it allows us to stop depending on the file cursor and pass
the offset directly, making multi-queue implementation easier.

BUG=chromium:858815
TEST=Boot Termina in crosvm

Change-Id: I8b15a39752a1b68597a2b1e1fd72382a484a3cb2
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1913521
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'disk')
-rw-r--r--disk/src/composite.rs22
-rw-r--r--disk/src/disk.rs6
2 files changed, 12 insertions, 16 deletions
diff --git a/disk/src/composite.rs b/disk/src/composite.rs
index 6e0d2a0..da0fe07 100644
--- a/disk/src/composite.rs
+++ b/disk/src/composite.rs
@@ -14,7 +14,7 @@ use crate::{create_disk_file, DiskFile, ImageType};
 use data_model::VolatileSlice;
 use protos::cdisk_spec;
 use remain::sorted;
-use sys_util::{AsRawFds, FileReadWriteAtVolatile, FileSetLen, FileSync, PunchHole, WriteZeroes};
+use sys_util::{AsRawFds, FileReadWriteAtVolatile, FileSetLen, FileSync, PunchHole, WriteZeroesAt};
 
 #[sorted]
 #[derive(Debug)]
@@ -300,22 +300,17 @@ impl Seek for CompositeDiskFile {
     }
 }
 
-impl WriteZeroes for CompositeDiskFile {
-    fn write_zeroes(&mut self, length: usize) -> io::Result<usize> {
-        let cursor_location = self.cursor_location;
+impl WriteZeroesAt for CompositeDiskFile {
+    fn write_zeroes_at(&mut self, offset: u64, length: usize) -> io::Result<usize> {
+        let cursor_location = offset;
         let disk = self.disk_at_offset(cursor_location)?;
-        disk.file
-            .seek(SeekFrom::Start(cursor_location - disk.offset))?;
+        let offset_within_disk = cursor_location - disk.offset;
         let new_length = if cursor_location + length as u64 > disk.offset + disk.length {
             (disk.offset + disk.length - cursor_location) as usize
         } else {
             length
         };
-        let result = disk.file.write_zeroes(new_length);
-        if let Ok(size) = result {
-            self.cursor_location += size as u64;
-        }
-        result
+        disk.file.write_zeroes_at(offset_within_disk, new_length)
     }
 }
 
@@ -524,10 +519,11 @@ mod tests {
         composite
             .write_all_at_volatile(input_volatile_memory.get_slice(0, 300).unwrap(), 0)
             .unwrap();
-        composite.seek(SeekFrom::Start(50)).unwrap();
         let mut zeroes_written = 0;
         while zeroes_written < 200 {
-            zeroes_written += composite.write_zeroes(200 - zeroes_written).unwrap();
+            zeroes_written += composite
+                .write_zeroes_at(50 + zeroes_written as u64, 200 - zeroes_written)
+                .unwrap();
         }
         let mut output_memory = [0u8; 300];
         let output_volatile_memory = &mut output_memory[..];
diff --git a/disk/src/disk.rs b/disk/src/disk.rs
index b5692a3..a9c44c6 100644
--- a/disk/src/disk.rs
+++ b/disk/src/disk.rs
@@ -11,7 +11,7 @@ use libc::EINVAL;
 use qcow::{QcowFile, QCOW_MAGIC};
 use remain::sorted;
 use sys_util::{
-    AsRawFds, FileReadWriteAtVolatile, FileSetLen, FileSync, PunchHole, SeekHole, WriteZeroes,
+    AsRawFds, FileReadWriteAtVolatile, FileSetLen, FileSync, PunchHole, SeekHole, WriteZeroesAt,
 };
 
 #[cfg(feature = "composite-disk")]
@@ -45,7 +45,7 @@ pub trait DiskFile:
     + FileReadWriteAtVolatile
     + PunchHole
     + Seek
-    + WriteZeroes
+    + WriteZeroesAt
     + Send
     + AsRawFds
 {
@@ -56,7 +56,7 @@ impl<
             + PunchHole
             + FileReadWriteAtVolatile
             + Seek
-            + WriteZeroes
+            + WriteZeroesAt
             + Send
             + AsRawFds,
     > DiskFile for D