From 22a50b66a632d001fda193eb6429a70e23e6f8e5 Mon Sep 17 00:00:00 2001 From: Helin Guo Date: Sun, 12 Feb 2023 20:55:45 +0800 Subject: [PATCH 1/2] dbs-cli: support virtio-mem feature We can use dbs-cli to simply hotplug memory in virtual machine. It should use update action, and only parameter is size in mib. Example: ./dbs-cli --api-sock-path /tmp/api-sock --hotplug-memory 1024 update Fixes: #23 Signed-off-by: Helin Guo --- Cargo.lock | 21 +++++++++++---------- Cargo.toml | 2 ++ src/api_client.rs | 12 ++++++++++++ src/api_server.rs | 16 ++++++++++++++++ src/parser/args.rs | 8 ++++++++ src/vmm_comm_trait.rs | 7 +++++++ 6 files changed, 56 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ead6b46..53b26a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,11 +246,12 @@ dependencies = [ [[package]] name = "dbs-address-space" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bcc37dc0b8ffae1c5911d13ae630dc7a9020fa0de0edd178d6ab71daf56c8fc" +checksum = "95e20d28a9cd13bf00d0ecd1bd073d242242b04f0acb663d7adfc659f8879322" dependencies = [ "arc-swap", + "lazy_static", "libc", "nix 0.23.2", "thiserror", @@ -284,9 +285,9 @@ dependencies = [ [[package]] name = "dbs-boot" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a74a8c05a1674d3032e610b4f201c7440c345559bad3dfe6b455ce195785108" +checksum = "5466a92f75aa928a9103dcb2088f6d1638ef9da8945fad7389a73864dfa0182c" dependencies = [ "dbs-arch", "kvm-bindings", @@ -363,9 +364,9 @@ dependencies = [ [[package]] name = "dbs-upcall" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "699e62afa444ae4b00d474fd91bc37785ba050acdfbe179731c81898e32efc3f" +checksum = "ea3a78128fd0be8b8b10257675c262b378dc5d00b1e18157736a6c27e45ce4fb" dependencies = [ "anyhow", "dbs-utils", @@ -393,9 +394,9 @@ dependencies = [ [[package]] name = "dbs-virtio-devices" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88e5c6c48b766afb95851b04b6b193871a59d0b2a3ed19990d4f8f651ae5c668" +checksum = "24d671cc3e5f98b84ef6b6bed007d28f72f16d3aea8eb38e2d42b00b2973c1d8" dependencies = [ "byteorder", "caps", @@ -408,7 +409,7 @@ dependencies = [ "kvm-ioctls", "libc", "log", - "nix 0.23.2", + "nix 0.24.3", "nydus-api", "nydus-blobfs", "nydus-rafs", @@ -458,7 +459,7 @@ dependencies = [ [[package]] name = "dragonball" version = "0.1.0" -source = "git+https://github.com/kata-containers/kata-containers?branch=main#ee5dda012b3a8dca08eb1eea32ddac37b5355fd6" +source = "git+https://github.com/kata-containers/kata-containers?branch=main#29885533050d133df86d06edc1a5ee8825129f1f" dependencies = [ "arc-swap", "bytes", diff --git a/Cargo.toml b/Cargo.toml index f1a7b0b..9e1cf6e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,8 +10,10 @@ dragonball = { git = "https://github.com/kata-containers/kata-containers", branc "virtio-blk", "virtio-vsock", "virtio-net", + "virtio-mem", "hotplug", "dbs-upcall", + "atomic-guest-memory" ] } clap = { version = "4.0.27", features = ["derive"] } serde = "1.0.27" diff --git a/src/api_client.rs b/src/api_client.rs index dfd69bb..beb92d4 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -22,6 +22,11 @@ pub fn run_api_client(args: DBSArgs) -> Result<()> { let request = request_virtio_blk(&config); send_request(request, &args.api_sock_path)?; } + if let Some(size_mib) = args.update_args.hotplug_memory { + let request = request_hotplug_memory(size_mib); + send_request(request, &args.api_sock_path)?; + } + Ok(()) } @@ -48,6 +53,13 @@ fn request_virtio_blk(virtio_blk_config: &str) -> Value { }) } +fn request_hotplug_memory(size_mib: usize) -> Value { + json!({ + "action": "hotplug_memory", + "size_mib": size_mib, + }) +} + fn send_request(request: Value, api_sock_path: &str) -> Result<()> { let mut unix_stream = UnixStream::connect(api_sock_path).context("Could not create stream")?; diff --git a/src/api_server.rs b/src/api_server.rs index b9f26a9..af4a1d4 100644 --- a/src/api_server.rs +++ b/src/api_server.rs @@ -10,6 +10,7 @@ use std::os::unix::net::{UnixListener, UnixStream}; use anyhow::{anyhow, Context, Result}; use dragonball::device_manager::blk_dev_mgr::BlockDeviceConfigInfo; +use dragonball::device_manager::mem_dev_mgr::MemDeviceConfigInfo; use dragonball::device_manager::virtio_net_dev_mgr::VirtioNetDeviceConfigInfo; use crate::vmm_comm_trait::VMMComm; @@ -105,6 +106,21 @@ impl ApiServer { .context("Insert a virtio-blk device to the Dragonball")?; } } + Some("hotplug_memory") => { + let mem_cfg = MemDeviceConfigInfo { + mem_id: "virtio-mem0".to_string(), + capacity_mib: 0, + size_mib: v["size_mib"] + .as_u64() + .context("Invalid virtio-mem size input")?, + multi_region: true, + host_numa_node_id: None, + guest_numa_node_id: None, + use_generic_irq: None, + use_shared_irq: None, + }; + return self.insert_mem_device(mem_cfg); + } _ => { println!("Unknown Actions"); } diff --git a/src/parser/args.rs b/src/parser/args.rs index 7f1762c..16eb867 100644 --- a/src/parser/args.rs +++ b/src/parser/args.rs @@ -297,4 +297,12 @@ The type of it is an array of BlockDeviceConfigInfo, e.g. display_order = 2 )] pub hotplug_virblks: Option, + + #[clap( + long, + value_parser, + help = "Hotplug memory (MiB) through connection with dbs-cli api server", + display_order = 2 + )] + pub hotplug_memory: Option, } diff --git a/src/vmm_comm_trait.rs b/src/vmm_comm_trait.rs index d7a9d0f..83a32e6 100644 --- a/src/vmm_comm_trait.rs +++ b/src/vmm_comm_trait.rs @@ -9,6 +9,7 @@ use dragonball::{ BlockDeviceConfigInfo, BootSourceConfig, VmmAction, VmmActionError, VmmData, VmmRequest, VmmResponse, VsockDeviceConfigInfo, }, + device_manager::mem_dev_mgr::MemDeviceConfigInfo, device_manager::virtio_net_dev_mgr::VirtioNetDeviceConfigInfo, vcpu::VcpuResizeInfo, vm::VmConfigInfo, @@ -145,4 +146,10 @@ pub trait VMMComm { .with_context(|| format!("Failed to insert virtio-blk device {:?}", blk_cfg))?; Ok(()) } + + fn insert_mem_device(&self, mem_cfg: MemDeviceConfigInfo) -> Result<()> { + self.handle_request_with_retry(Request::Sync(VmmAction::InsertMemDevice(mem_cfg.clone()))) + .with_context(|| format!("Failed to insert mem device {:?}", mem_cfg))?; + Ok(()) + } } From 52531c37418b7d402359a7bfbd5ce01c9b16b948 Mon Sep 17 00:00:00 2001 From: Helin Guo Date: Sun, 12 Feb 2023 20:56:25 +0800 Subject: [PATCH 2/2] dbs-cli: support virtio-balloon feature We can use dbs-cli to simply reuse unused virtual machine on host. An empty virtio-balloon device should be inserted first before we ask guest to balloon some free memory. It should use update action, and only parameter is size in mib. Example: First time: ./dbs-cli --api-sock-path /tmp/api-sock --balloon-memory 0 update Next: ./dbs-cli --api-sock-path /tmp/api-sock --balloon-memory 512 update Fixes: #23 Signed-off-by: Helin Guo --- Cargo.toml | 1 + src/api_client.rs | 12 ++++++++++++ src/api_server.rs | 15 +++++++++++++++ src/parser/args.rs | 8 ++++++++ src/vmm_comm_trait.rs | 11 ++++++++++- 5 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9e1cf6e..06080d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ dragonball = { git = "https://github.com/kata-containers/kata-containers", branc "virtio-vsock", "virtio-net", "virtio-mem", + "virtio-balloon", "hotplug", "dbs-upcall", "atomic-guest-memory" diff --git a/src/api_client.rs b/src/api_client.rs index beb92d4..dfcb9d2 100644 --- a/src/api_client.rs +++ b/src/api_client.rs @@ -27,6 +27,11 @@ pub fn run_api_client(args: DBSArgs) -> Result<()> { send_request(request, &args.api_sock_path)?; } + if let Some(size_mib) = args.update_args.balloon_memory { + let request = request_balloon_memory(size_mib); + send_request(request, &args.api_sock_path)?; + } + Ok(()) } @@ -60,6 +65,13 @@ fn request_hotplug_memory(size_mib: usize) -> Value { }) } +fn request_balloon_memory(size_mib: usize) -> Value { + json!({ + "action": "balloon_memory", + "size_mib": size_mib, + }) +} + fn send_request(request: Value, api_sock_path: &str) -> Result<()> { let mut unix_stream = UnixStream::connect(api_sock_path).context("Could not create stream")?; diff --git a/src/api_server.rs b/src/api_server.rs index af4a1d4..8ffce86 100644 --- a/src/api_server.rs +++ b/src/api_server.rs @@ -9,6 +9,7 @@ use std::io::prelude::*; use std::os::unix::net::{UnixListener, UnixStream}; use anyhow::{anyhow, Context, Result}; +use dragonball::device_manager::balloon_dev_mgr::BalloonDeviceConfigInfo; use dragonball::device_manager::blk_dev_mgr::BlockDeviceConfigInfo; use dragonball::device_manager::mem_dev_mgr::MemDeviceConfigInfo; use dragonball::device_manager::virtio_net_dev_mgr::VirtioNetDeviceConfigInfo; @@ -121,6 +122,20 @@ impl ApiServer { }; return self.insert_mem_device(mem_cfg); } + Some("balloon_memory") => { + let balloon_cfg = BalloonDeviceConfigInfo { + balloon_id: "virtio-balloon0".to_string(), + size_mib: v["size_mib"] + .as_u64() + .context("Invalid virtio-balloon size input")?, + use_generic_irq: None, + use_shared_irq: None, + f_deflate_on_oom: false, + // TODO: enable free page reporting + f_reporting: false, + }; + return self.insert_balloon_device(balloon_cfg); + } _ => { println!("Unknown Actions"); } diff --git a/src/parser/args.rs b/src/parser/args.rs index 16eb867..48b09bf 100644 --- a/src/parser/args.rs +++ b/src/parser/args.rs @@ -305,4 +305,12 @@ The type of it is an array of BlockDeviceConfigInfo, e.g. display_order = 2 )] pub hotplug_memory: Option, + + #[clap( + long, + value_parser, + help = "Balloon memory (MiB) through connection with dbs-cli api server", + display_order = 2 + )] + pub balloon_memory: Option, } diff --git a/src/vmm_comm_trait.rs b/src/vmm_comm_trait.rs index 83a32e6..a57987f 100644 --- a/src/vmm_comm_trait.rs +++ b/src/vmm_comm_trait.rs @@ -9,6 +9,7 @@ use dragonball::{ BlockDeviceConfigInfo, BootSourceConfig, VmmAction, VmmActionError, VmmData, VmmRequest, VmmResponse, VsockDeviceConfigInfo, }, + device_manager::balloon_dev_mgr::BalloonDeviceConfigInfo, device_manager::mem_dev_mgr::MemDeviceConfigInfo, device_manager::virtio_net_dev_mgr::VirtioNetDeviceConfigInfo, vcpu::VcpuResizeInfo, @@ -146,10 +147,18 @@ pub trait VMMComm { .with_context(|| format!("Failed to insert virtio-blk device {:?}", blk_cfg))?; Ok(()) } - + fn insert_mem_device(&self, mem_cfg: MemDeviceConfigInfo) -> Result<()> { self.handle_request_with_retry(Request::Sync(VmmAction::InsertMemDevice(mem_cfg.clone()))) .with_context(|| format!("Failed to insert mem device {:?}", mem_cfg))?; Ok(()) } + + fn insert_balloon_device(&self, balloon_cfg: BalloonDeviceConfigInfo) -> Result<()> { + self.handle_request_with_retry(Request::Sync(VmmAction::InsertBalloonDevice( + balloon_cfg.clone(), + ))) + .with_context(|| format!("Failed to insert balloon device {:?}", balloon_cfg))?; + Ok(()) + } }