From 925c862f98cc71044fc894e542f7cf41e2f2dd7b Mon Sep 17 00:00:00 2001 From: Sergio Lopez Date: Tue, 21 Jan 2020 12:36:27 +0100 Subject: [PATCH] vmm: device_manager: Add 'direct' support for virtio-blk vhost_user_blk already has it, so it's only fair to give it to virtio-blk too. Extend DiskConfig with a 'direct' property, honor it while opening the file backing the disk image, and pass it to vm_virtio::RawFile. Fixes #631 Signed-off-by: Sergio Lopez --- vmm/src/config.rs | 6 ++++++ vmm/src/device_manager.rs | 12 ++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/vmm/src/config.rs b/vmm/src/config.rs index 6859e8b9a..d4c53cfb6 100644 --- a/vmm/src/config.rs +++ b/vmm/src/config.rs @@ -340,6 +340,8 @@ pub struct DiskConfig { #[serde(default)] pub readonly: bool, #[serde(default)] + pub direct: bool, + #[serde(default)] pub iommu: bool, } @@ -350,6 +352,7 @@ impl DiskConfig { let mut path_str: &str = ""; let mut readonly_str: &str = ""; + let mut direct_str: &str = ""; let mut iommu_str: &str = ""; for param in params_list.iter() { @@ -357,6 +360,8 @@ impl DiskConfig { path_str = ¶m[5..]; } else if param.starts_with("readonly=") { readonly_str = ¶m[9..]; + } else if param.starts_with("direct=") { + direct_str = ¶m[7..]; } else if param.starts_with("iommu=") { iommu_str = ¶m[6..]; } @@ -365,6 +370,7 @@ impl DiskConfig { Ok(DiskConfig { path: PathBuf::from(path_str), readonly: parse_on_off(readonly_str)?, + direct: parse_on_off(direct_str)?, iommu: parse_on_off(iommu_str)?, }) } diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index fc67500b8..57c17a00a 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -935,14 +935,18 @@ impl DeviceManager { if let Some(disk_list_cfg) = &vm_info.vm_cfg.lock().unwrap().disks { for disk_cfg in disk_list_cfg.iter() { + let mut options = OpenOptions::new(); + options.read(true); + options.write(!disk_cfg.readonly); + if disk_cfg.direct { + options.custom_flags(libc::O_DIRECT); + } // Open block device path - let image: File = OpenOptions::new() - .read(true) - .write(!disk_cfg.readonly) + let image: File = options .open(&disk_cfg.path) .map_err(DeviceManagerError::Disk)?; - let mut raw_img = vm_virtio::RawFile::new(image, false); + let mut raw_img = vm_virtio::RawFile::new(image, disk_cfg.direct); let image_type = qcow::detect_image_type(&mut raw_img) .map_err(DeviceManagerError::DetectImageType)?;