diff --git a/src/libs/kata-types/src/config/hypervisor/mod.rs b/src/libs/kata-types/src/config/hypervisor/mod.rs index f17cc87239..f5fff4ba06 100644 --- a/src/libs/kata-types/src/config/hypervisor/mod.rs +++ b/src/libs/kata-types/src/config/hypervisor/mod.rs @@ -491,6 +491,12 @@ pub struct DeviceInfo { /// Enabling this will result in the VM device having iommu_platform=on set #[serde(default)] pub enable_iommu_platform: bool, + + /// Enable balloon f_reporting, default false + /// + /// Enabling this will result in the VM balloon device having f_reporting=on set + #[serde(default)] + pub enable_balloon_f_reporting: bool, } impl DeviceInfo { diff --git a/src/runtime-rs/config/configuration-dragonball.toml.in b/src/runtime-rs/config/configuration-dragonball.toml.in index b2a226f202..53f5092acf 100644 --- a/src/runtime-rs/config/configuration-dragonball.toml.in +++ b/src/runtime-rs/config/configuration-dragonball.toml.in @@ -98,6 +98,12 @@ default_maxvcpus = @DEFMAXVCPUS_DB@ # > 5 --> will be set to 5 default_bridges = @DEFBRIDGES@ +# Enable balloon f_reporting, default false +# Enabling this will result in the VM balloon device having f_reporting=on set +# +# Default false +#enable_balloon_f_reporting = true + # Default memory size in MiB for SB/VM. # If unspecified then it will be set @DEFMEMSZ@ MiB. default_memory = @DEFMEMSZ@ diff --git a/src/runtime-rs/crates/hypervisor/src/dragonball/inner.rs b/src/runtime-rs/crates/hypervisor/src/dragonball/inner.rs index ab51f8dcc4..57613813dd 100644 --- a/src/runtime-rs/crates/hypervisor/src/dragonball/inner.rs +++ b/src/runtime-rs/crates/hypervisor/src/dragonball/inner.rs @@ -6,8 +6,9 @@ use super::vmm_instance::VmmInstance; use crate::{ - device::DeviceType, hypervisor_persist::HypervisorState, kernel_param::KernelParams, - MemoryConfig, VmmState, DEV_HUGEPAGES, HUGETLBFS, HUGE_SHMEM, HYPERVISOR_DRAGONBALL, SHMEM, + device::DeviceType, firecracker::sl, hypervisor_persist::HypervisorState, + kernel_param::KernelParams, MemoryConfig, VmmState, DEV_HUGEPAGES, HUGETLBFS, HUGE_SHMEM, + HYPERVISOR_DRAGONBALL, SHMEM, }; use anyhow::{anyhow, Context, Result}; use async_trait::async_trait; @@ -118,6 +119,20 @@ impl DragonballInner { } } + pub(crate) async fn try_insert_balloon_f_reporting(&mut self) { + let balloon_config = BalloonDeviceConfigInfo { + balloon_id: BALLOON_DEVICE_ID.to_owned(), + size_mib: 0, + use_shared_irq: None, + use_generic_irq: None, + f_deflate_on_oom: false, + f_reporting: true, + }; + if let Err(e) = self.vmm_instance.insert_balloon_device(balloon_config) { + error!(sl(), "failed to insert f_reporting balloon device: {:?}", e); + } + } + pub(crate) async fn cold_start_vm(&mut self, timeout: i32) -> Result<()> { info!(sl!(), "start sandbox cold"); @@ -415,7 +430,7 @@ impl DragonballInner { use_shared_irq: None, use_generic_irq: None, f_deflate_on_oom: false, - f_reporting: false, + f_reporting: self.config.device_info.enable_balloon_f_reporting, }; self.vmm_instance .insert_balloon_device(balloon_config) @@ -447,7 +462,7 @@ impl DragonballInner { use_shared_irq: None, use_generic_irq: None, f_deflate_on_oom: false, - f_reporting: false, + f_reporting: self.config.device_info.enable_balloon_f_reporting, }; self.balloon_size = had_mem_mb - new_mem_mb; self.vmm_instance diff --git a/src/runtime-rs/crates/hypervisor/src/dragonball/mod.rs b/src/runtime-rs/crates/hypervisor/src/dragonball/mod.rs index 9313854714..36ac15f932 100644 --- a/src/runtime-rs/crates/hypervisor/src/dragonball/mod.rs +++ b/src/runtime-rs/crates/hypervisor/src/dragonball/mod.rs @@ -77,7 +77,26 @@ impl Hypervisor for Dragonball { #[instrument] async fn start_vm(&self, timeout: i32) -> Result<()> { let mut inner = self.inner.write().await; - inner.start_vm(timeout).await + let ret = inner.start_vm(timeout).await; + + if ret.is_ok() && inner.config.device_info.enable_balloon_f_reporting { + // The virtio-balloon device must be inserted into dragonball and + // recognized by the guest kernel only after the dragonball upcall is ready. + // The dragonball upcall is not ready immediately after the VM starts, + // so here we create an asynchronous task that waits for 5 seconds before + // inserting the virtio-balloon device. + let inner_clone = self.inner.clone(); + tokio::spawn(async move { + tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; + inner_clone + .write() + .await + .try_insert_balloon_f_reporting() + .await; + }); + } + + ret } async fn stop_vm(&self) -> Result<()> { diff --git a/tools/packaging/kernel/configs/fragments/build-type/dragonball-experimental/mm.conf b/tools/packaging/kernel/configs/fragments/build-type/dragonball-experimental/mm.conf new file mode 100644 index 0000000000..13872f2ce0 --- /dev/null +++ b/tools/packaging/kernel/configs/fragments/build-type/dragonball-experimental/mm.conf @@ -0,0 +1,2 @@ +CONFIG_BALLOON_COMPACTION=y +CONFIG_PAGE_REPORTING=y diff --git a/tools/packaging/kernel/configs/fragments/build-type/dragonball-experimental/virtio.conf b/tools/packaging/kernel/configs/fragments/build-type/dragonball-experimental/virtio.conf new file mode 100644 index 0000000000..1992c34fd5 --- /dev/null +++ b/tools/packaging/kernel/configs/fragments/build-type/dragonball-experimental/virtio.conf @@ -0,0 +1 @@ +CONFIG_VIRTIO_BALLOON=y diff --git a/tools/packaging/kernel/kata_config_version b/tools/packaging/kernel/kata_config_version index c8b255fc8e..7296f257eb 100644 --- a/tools/packaging/kernel/kata_config_version +++ b/tools/packaging/kernel/kata_config_version @@ -1 +1 @@ -135 +136