Skip to content

Commit 9dbaf5d

Browse files
committed
feat(virtio-mem): add dummy virtio-mem device
Add a dummy virtio-mem device that is detected by the guest driver. The device is configured with total_size, block_size, and slot_size, and uses a fixed address after the MMIO64 memory zone. Signed-off-by: Riccardo Mancini <[email protected]>
1 parent 655d455 commit 9dbaf5d

File tree

6 files changed

+668
-0
lines changed

6 files changed

+668
-0
lines changed

src/vmm/src/builder.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::device_manager::{
3232
use crate::devices::acpi::vmgenid::VmGenIdError;
3333
use crate::devices::virtio::balloon::Balloon;
3434
use crate::devices::virtio::block::device::Block;
35+
use crate::devices::virtio::mem::VirtioMem;
3536
use crate::devices::virtio::net::Net;
3637
use crate::devices::virtio::rng::Entropy;
3738
use crate::devices::virtio::vsock::{Vsock, VsockUnixBackend};
@@ -45,6 +46,7 @@ use crate::seccomp::BpfThreadMap;
4546
use crate::snapshot::Persist;
4647
use crate::vmm_config::instance_info::InstanceInfo;
4748
use crate::vmm_config::machine_config::MachineConfigError;
49+
use crate::vmm_config::memory_hotplug::MemoryHotplugConfig;
4850
use crate::vstate::kvm::{Kvm, KvmError};
4951
use crate::vstate::memory::GuestRegionMmap;
5052
#[cfg(target_arch = "aarch64")]
@@ -240,6 +242,17 @@ pub fn build_microvm_for_boot(
240242
)?;
241243
}
242244

245+
// Attach virtio-mem device if configured
246+
if let Some(memory_hotplug) = &vm_resources.memory_hotplug {
247+
attach_virtio_mem_device(
248+
&mut device_manager,
249+
&vm,
250+
&mut boot_cmdline,
251+
memory_hotplug,
252+
event_manager,
253+
)?;
254+
}
255+
243256
#[cfg(target_arch = "aarch64")]
244257
device_manager.attach_legacy_devices_aarch64(
245258
&vm,
@@ -563,6 +576,29 @@ fn attach_entropy_device(
563576
device_manager.attach_virtio_device(vm, id, entropy_device.clone(), cmdline, false)
564577
}
565578

579+
fn attach_virtio_mem_device(
580+
device_manager: &mut DeviceManager,
581+
vm: &Arc<Vm>,
582+
cmdline: &mut LoaderKernelCmdline,
583+
config: &MemoryHotplugConfig,
584+
event_manager: &mut EventManager,
585+
) -> Result<(), StartMicrovmError> {
586+
let virtio_mem = Arc::new(Mutex::new(
587+
VirtioMem::new(
588+
Arc::clone(vm),
589+
config.total_size_mib,
590+
config.block_size_mib,
591+
config.slot_size_mib,
592+
)
593+
.map_err(|e| StartMicrovmError::Internal(VmmError::VirtioMem(e)))?,
594+
));
595+
596+
let id = virtio_mem.lock().expect("Poisoned lock").id().to_string();
597+
event_manager.add_subscriber(virtio_mem.clone());
598+
device_manager.attach_virtio_device(vm, id, virtio_mem.clone(), cmdline, false)?;
599+
Ok(())
600+
}
601+
566602
fn attach_block_devices<'a, I: Iterator<Item = &'a Arc<Mutex<Block>>> + Debug>(
567603
device_manager: &mut DeviceManager,
568604
vm: &Arc<Vm>,
@@ -1187,4 +1223,42 @@ pub(crate) mod tests {
11871223
"virtio_mmio.device=4K@0xc0001000:5"
11881224
));
11891225
}
1226+
1227+
pub(crate) fn insert_virtio_mem_device(
1228+
vmm: &mut Vmm,
1229+
cmdline: &mut Cmdline,
1230+
event_manager: &mut EventManager,
1231+
config: MemoryHotplugConfig,
1232+
) {
1233+
attach_virtio_mem_device(
1234+
&mut vmm.device_manager,
1235+
&vmm.vm,
1236+
cmdline,
1237+
&config,
1238+
event_manager,
1239+
)
1240+
.unwrap();
1241+
}
1242+
1243+
#[test]
1244+
fn test_attach_virtio_mem_device() {
1245+
let mut event_manager = EventManager::new().expect("Unable to create EventManager");
1246+
let mut vmm = default_vmm();
1247+
1248+
let config = MemoryHotplugConfig {
1249+
total_size_mib: 1024,
1250+
block_size_mib: 2,
1251+
slot_size_mib: 128,
1252+
};
1253+
1254+
let mut cmdline = default_kernel_cmdline();
1255+
insert_virtio_mem_device(&mut vmm, &mut cmdline, &mut event_manager, config);
1256+
1257+
// Check if the vsock device is described in kernel_cmdline.
1258+
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
1259+
assert!(cmdline_contains(
1260+
&cmdline,
1261+
"virtio_mmio.device=4K@0xc0001000:5"
1262+
));
1263+
}
11901264
}

0 commit comments

Comments
 (0)