diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2019-11-12 14:05:56 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-11-27 21:22:40 +0000 |
commit | 624c51bee3a8356c3e4bbdd6aef21ea45b0f4d59 (patch) | |
tree | bb2b724f31bb560df8c060deddd0fcd3996d7622 /disk | |
parent | 41d889eb267cdcd066575b5647bf05c516d70201 (diff) | |
download | crosvm-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.rs | 22 | ||||
-rw-r--r-- | disk/src/disk.rs | 6 |
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 |