Skip to content

Commit 22a50b6

Browse files
committed
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 <helinguo@linux.alibaba.com>
1 parent 14e89ea commit 22a50b6

6 files changed

Lines changed: 56 additions & 10 deletions

File tree

Cargo.lock

Lines changed: 11 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ dragonball = { git = "https://github.com/kata-containers/kata-containers", branc
1010
"virtio-blk",
1111
"virtio-vsock",
1212
"virtio-net",
13+
"virtio-mem",
1314
"hotplug",
1415
"dbs-upcall",
16+
"atomic-guest-memory"
1517
] }
1618
clap = { version = "4.0.27", features = ["derive"] }
1719
serde = "1.0.27"

src/api_client.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ pub fn run_api_client(args: DBSArgs) -> Result<()> {
2222
let request = request_virtio_blk(&config);
2323
send_request(request, &args.api_sock_path)?;
2424
}
25+
if let Some(size_mib) = args.update_args.hotplug_memory {
26+
let request = request_hotplug_memory(size_mib);
27+
send_request(request, &args.api_sock_path)?;
28+
}
29+
2530
Ok(())
2631
}
2732

@@ -48,6 +53,13 @@ fn request_virtio_blk(virtio_blk_config: &str) -> Value {
4853
})
4954
}
5055

56+
fn request_hotplug_memory(size_mib: usize) -> Value {
57+
json!({
58+
"action": "hotplug_memory",
59+
"size_mib": size_mib,
60+
})
61+
}
62+
5163
fn send_request(request: Value, api_sock_path: &str) -> Result<()> {
5264
let mut unix_stream = UnixStream::connect(api_sock_path).context("Could not create stream")?;
5365

src/api_server.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use std::os::unix::net::{UnixListener, UnixStream};
1010

1111
use anyhow::{anyhow, Context, Result};
1212
use dragonball::device_manager::blk_dev_mgr::BlockDeviceConfigInfo;
13+
use dragonball::device_manager::mem_dev_mgr::MemDeviceConfigInfo;
1314
use dragonball::device_manager::virtio_net_dev_mgr::VirtioNetDeviceConfigInfo;
1415

1516
use crate::vmm_comm_trait::VMMComm;
@@ -105,6 +106,21 @@ impl ApiServer {
105106
.context("Insert a virtio-blk device to the Dragonball")?;
106107
}
107108
}
109+
Some("hotplug_memory") => {
110+
let mem_cfg = MemDeviceConfigInfo {
111+
mem_id: "virtio-mem0".to_string(),
112+
capacity_mib: 0,
113+
size_mib: v["size_mib"]
114+
.as_u64()
115+
.context("Invalid virtio-mem size input")?,
116+
multi_region: true,
117+
host_numa_node_id: None,
118+
guest_numa_node_id: None,
119+
use_generic_irq: None,
120+
use_shared_irq: None,
121+
};
122+
return self.insert_mem_device(mem_cfg);
123+
}
108124
_ => {
109125
println!("Unknown Actions");
110126
}

src/parser/args.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,4 +297,12 @@ The type of it is an array of BlockDeviceConfigInfo, e.g.
297297
display_order = 2
298298
)]
299299
pub hotplug_virblks: Option<String>,
300+
301+
#[clap(
302+
long,
303+
value_parser,
304+
help = "Hotplug memory (MiB) through connection with dbs-cli api server",
305+
display_order = 2
306+
)]
307+
pub hotplug_memory: Option<usize>,
300308
}

src/vmm_comm_trait.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use dragonball::{
99
BlockDeviceConfigInfo, BootSourceConfig, VmmAction, VmmActionError, VmmData, VmmRequest,
1010
VmmResponse, VsockDeviceConfigInfo,
1111
},
12+
device_manager::mem_dev_mgr::MemDeviceConfigInfo,
1213
device_manager::virtio_net_dev_mgr::VirtioNetDeviceConfigInfo,
1314
vcpu::VcpuResizeInfo,
1415
vm::VmConfigInfo,
@@ -145,4 +146,10 @@ pub trait VMMComm {
145146
.with_context(|| format!("Failed to insert virtio-blk device {:?}", blk_cfg))?;
146147
Ok(())
147148
}
149+
150+
fn insert_mem_device(&self, mem_cfg: MemDeviceConfigInfo) -> Result<()> {
151+
self.handle_request_with_retry(Request::Sync(VmmAction::InsertMemDevice(mem_cfg.clone())))
152+
.with_context(|| format!("Failed to insert mem device {:?}", mem_cfg))?;
153+
Ok(())
154+
}
148155
}

0 commit comments

Comments
 (0)