From bde6609b93c33db1c86e7cf3d40a0b9abce5110f Mon Sep 17 00:00:00 2001 From: Chao Wu Date: Mon, 4 Jul 2022 19:47:14 +0800 Subject: [PATCH] hotplug: add room for other hotplug solution Add room in the code for other hotplug solution without upcall Signed-off-by: Chao Wu --- src/dragonball/src/device_manager/mod.rs | 4 ++-- src/dragonball/src/error.rs | 4 ++-- src/dragonball/src/vcpu/vcpu_manager.rs | 12 +++++++----- src/dragonball/src/vm/mod.rs | 22 ++++++++++++++++++---- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/dragonball/src/device_manager/mod.rs b/src/dragonball/src/device_manager/mod.rs index 53a1e2df92..af19fdeac3 100644 --- a/src/dragonball/src/device_manager/mod.rs +++ b/src/dragonball/src/device_manager/mod.rs @@ -323,11 +323,11 @@ impl DeviceOpContext { } } -#[cfg(not(feature = "hotplug"))] +#[cfg(all(feature = "hotplug", not(feature = "dbs-upcall")))] impl DeviceOpContext { pub(crate) fn insert_hotplug_mmio_device( &self, - _dev: &Arc, + _dev: &Arc, _callback: Option<()>, ) -> Result<()> { Err(DeviceMgrError::InvalidOperation) diff --git a/src/dragonball/src/error.rs b/src/dragonball/src/error.rs index 2c6fbf6c44..b4ee401194 100644 --- a/src/dragonball/src/error.rs +++ b/src/dragonball/src/error.rs @@ -149,12 +149,12 @@ pub enum StartMicroVmError { #[error("vCPU related error: {0}")] Vcpu(#[source] vcpu::VcpuManagerError), - #[cfg(feature = "hotplug")] + #[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] /// Upcall initialize Error. #[error("failure while initializing the upcall client: {0}")] UpcallInitError(#[source] dbs_upcall::UpcallClientError), - #[cfg(feature = "hotplug")] + #[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] /// Upcall connect Error. #[error("failure while connecting the upcall client: {0}")] UpcallConnectError(#[source] dbs_upcall::UpcallClientError), diff --git a/src/dragonball/src/vcpu/vcpu_manager.rs b/src/dragonball/src/vcpu/vcpu_manager.rs index 278a88ecea..f6f3e93ffa 100644 --- a/src/dragonball/src/vcpu/vcpu_manager.rs +++ b/src/dragonball/src/vcpu/vcpu_manager.rs @@ -147,6 +147,7 @@ pub enum VcpuResizeError { #[error("Removable vcpu not enough, removable vcpu num: {0}, number to remove: {1}, present vcpu count {2}")] LackRemovableVcpus(u16, u16, u16), + #[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] /// Cannot update the configuration by upcall channel. #[error("cannot update the configuration by upcall channel: {0}")] Upcall(#[source] dbs_upcall::UpcallClientError), @@ -782,13 +783,14 @@ impl VcpuManager { #[cfg(feature = "hotplug")] mod hotplug { + #[cfg(feature = "dbs-upcall")] + use super::*; + #[cfg(feature = "dbs-upcall")] + use dbs_upcall::{CpuDevRequest, DevMgrRequest}; + #[cfg(feature = "dbs-upcall")] use std::cmp::Ordering; - use dbs_upcall::{CpuDevRequest, DevMgrRequest}; - - use super::*; - - #[cfg(all(target_arch = "x86_64"))] + #[cfg(all(target_arch = "x86_64", feature = "dbs-upcall"))] use dbs_boot::mptable::APIC_VERSION; #[cfg(all(target_arch = "aarch64"))] const APIC_VERSION: u8 = 0; diff --git a/src/dragonball/src/vm/mod.rs b/src/dragonball/src/vm/mod.rs index 8c3cb21c97..31b41baed2 100644 --- a/src/dragonball/src/vm/mod.rs +++ b/src/dragonball/src/vm/mod.rs @@ -20,7 +20,7 @@ use slog::{error, info}; use vm_memory::{Bytes, GuestAddress, GuestAddressSpace}; use vmm_sys_util::eventfd::EventFd; -#[cfg(feature = "hotplug")] +#[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] use dbs_upcall::{DevMgrService, UpcallClient}; use crate::address_space_manager::{ @@ -195,7 +195,7 @@ pub struct Vm { #[cfg(target_arch = "aarch64")] irqchip_handle: Option>, - #[cfg(feature = "hotplug")] + #[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] upcall_client: Option>>, } @@ -240,7 +240,7 @@ impl Vm { #[cfg(target_arch = "aarch64")] irqchip_handle: None, - #[cfg(feature = "hotplug")] + #[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] upcall_client: None, }) } @@ -305,7 +305,7 @@ impl Vm { /// returns true if system upcall service is ready pub fn is_upcall_client_ready(&self) -> bool { - #[cfg(feature = "hotplug")] + #[cfg(all(feature = "hotplug", feature = "dbs-upcall"))] { if let Some(upcall_client) = self.upcall_client() { return upcall_client.is_ready(); @@ -705,6 +705,7 @@ impl Vm { .map_err(StartMicroVmError::Vcpu)?; self.init_microvm(event_mgr.epoll_manager(), vm_as.clone(), request_ts)?; self.init_configure_system(&vm_as)?; + #[cfg(feature = "dbs-upcall")] self.init_upcall()?; info!(self.logger, "VM: register events"); @@ -730,6 +731,7 @@ impl Vm { #[cfg(feature = "hotplug")] impl Vm { /// initialize upcall client for guest os + #[cfg(feature = "dbs-upcall")] fn new_upcall(&mut self) -> std::result::Result<(), StartMicroVmError> { // get vsock inner connector for upcall let inner_connector = self @@ -752,6 +754,7 @@ impl Vm { Ok(()) } + #[cfg(feature = "dbs-upcall")] fn init_upcall(&mut self) -> std::result::Result<(), StartMicroVmError> { info!(self.logger, "VM upcall init"); if let Err(e) = self.new_upcall() { @@ -769,10 +772,12 @@ impl Vm { } /// Get upcall client. + #[cfg(feature = "dbs-upcall")] pub fn upcall_client(&self) -> &Option>> { &self.upcall_client } + #[cfg(feature = "dbs-upcall")] fn create_device_hotplug_context( &self, epoll_mgr: Option, @@ -785,6 +790,15 @@ impl Vm { Err(StartMicroVmError::UpcallNotReady) } } + + // We will support hotplug without upcall in future stages. + #[cfg(not(feature = "dbs-upcall"))] + fn create_device_hotplug_context( + &self, + _epoll_mgr: Option, + ) -> std::result::Result { + Err(StartMicroVmError::MicroVMAlreadyRunning) + } } #[cfg(not(feature = "hotplug"))]