Skip to content

Commit f0b7412

Browse files
author
Samuel Ortiz
committed
vmm: device_manager: Add all virtio devices to the migratable list
We want to track all migratable devices through the DeviceManager. Fixes: cloud-hypervisor#341 Signed-off-by: Samuel Ortiz <[email protected]>
1 parent 37557c8 commit f0b7412

File tree

1 file changed

+79
-10
lines changed

1 file changed

+79
-10
lines changed

vmm/src/device_manager.rs

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ impl DeviceManager {
456456
&address_manager,
457457
&mut mem_slots,
458458
&mut mmap_regions,
459+
&mut migratable_devices,
459460
)?);
460461

461462
DeviceManager::add_legacy_devices(
@@ -481,6 +482,7 @@ impl DeviceManager {
481482
&mut virt_iommu,
482483
virtio_devices,
483484
&interrupt_info,
485+
&mut migratable_devices,
484486
)?;
485487
} else if cfg!(feature = "mmio_support") {
486488
DeviceManager::add_mmio_devices(
@@ -489,6 +491,7 @@ impl DeviceManager {
489491
virtio_devices,
490492
&interrupt_info,
491493
&mut cmdline_additions,
494+
&mut migratable_devices,
492495
)?;
493496
}
494497

@@ -520,6 +523,7 @@ impl DeviceManager {
520523
virt_iommu: &mut Option<(u32, Vec<u32>)>,
521524
virtio_devices: Vec<(Arc<Mutex<dyn vm_virtio::VirtioDevice>>, bool)>,
522525
interrupt_info: &InterruptInfo,
526+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
523527
) -> DeviceManagerResult<()> {
524528
#[cfg(feature = "pci_support")]
525529
{
@@ -553,6 +557,7 @@ impl DeviceManager {
553557
vm_info.vm_fd,
554558
&mut pci_bus,
555559
mapping,
560+
migratable_devices,
556561
)?;
557562

558563
if let Some(dev_id) = virtio_iommu_attach_dev {
@@ -588,6 +593,7 @@ impl DeviceManager {
588593
vm_info.vm_fd,
589594
&mut pci_bus,
590595
&None,
596+
migratable_devices,
591597
)?;
592598

593599
*virt_iommu = Some((iommu_id, iommu_attached_devices));
@@ -620,6 +626,7 @@ impl DeviceManager {
620626
virtio_devices: Vec<(Arc<Mutex<dyn vm_virtio::VirtioDevice>>, bool)>,
621627
interrupt_info: &InterruptInfo,
622628
mut cmdline_additions: &mut Vec<String>,
629+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
623630
) -> DeviceManagerResult<()> {
624631
#[cfg(feature = "mmio_support")]
625632
{
@@ -638,6 +645,7 @@ impl DeviceManager {
638645
&interrupt_info,
639646
addr,
640647
&mut cmdline_additions,
648+
migratable_devices,
641649
)?;
642650
} else {
643651
error!("Unable to allocate MMIO address!");
@@ -841,21 +849,32 @@ impl DeviceManager {
841849
address_manager: &Arc<AddressManager>,
842850
mut mem_slots: &mut u32,
843851
mmap_regions: &mut Vec<(*mut libc::c_void, usize)>,
852+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
844853
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
845854
let mut allocator = address_manager.allocator.lock().unwrap();
846855
let mut devices: Vec<(Arc<Mutex<dyn vm_virtio::VirtioDevice>>, bool)> = Vec::new();
847856

848857
// Create "standard" virtio devices (net/block/rng)
849-
devices.append(&mut DeviceManager::make_virtio_block_devices(vm_info)?);
850-
devices.append(&mut DeviceManager::make_virtio_net_devices(vm_info)?);
851-
devices.append(&mut DeviceManager::make_virtio_rng_devices(vm_info)?);
858+
devices.append(&mut DeviceManager::make_virtio_block_devices(
859+
vm_info,
860+
migratable_devices,
861+
)?);
862+
devices.append(&mut DeviceManager::make_virtio_net_devices(
863+
vm_info,
864+
migratable_devices,
865+
)?);
866+
devices.append(&mut DeviceManager::make_virtio_rng_devices(
867+
vm_info,
868+
migratable_devices,
869+
)?);
852870

853871
// Add virtio-fs if required
854872
devices.append(&mut DeviceManager::make_virtio_fs_devices(
855873
vm_info,
856874
&mut allocator,
857875
&mut mem_slots,
858876
mmap_regions,
877+
migratable_devices,
859878
)?);
860879

861880
// Add virtio-pmem if required
@@ -864,26 +883,33 @@ impl DeviceManager {
864883
&mut allocator,
865884
&mut mem_slots,
866885
mmap_regions,
886+
migratable_devices,
867887
)?);
868888

869889
// Add virtio-vhost-user-net if required
870890
devices.append(&mut DeviceManager::make_virtio_vhost_user_net_devices(
871891
vm_info,
892+
migratable_devices,
872893
)?);
873894

874895
// Add virtio-vhost-user-blk if required
875896
devices.append(&mut DeviceManager::make_virtio_vhost_user_blk_devices(
876897
vm_info,
898+
migratable_devices,
877899
)?);
878900

879901
// Add virtio-vsock if required
880-
devices.append(&mut DeviceManager::make_virtio_vsock_devices(vm_info)?);
902+
devices.append(&mut DeviceManager::make_virtio_vsock_devices(
903+
vm_info,
904+
migratable_devices,
905+
)?);
881906

882907
Ok(devices)
883908
}
884909

885910
fn make_virtio_block_devices(
886911
vm_info: &VmInfo,
912+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
887913
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
888914
let mut devices = Vec::new();
889915

@@ -898,7 +924,7 @@ impl DeviceManager {
898924

899925
let image_type = qcow::detect_image_type(&raw_img)
900926
.map_err(DeviceManagerError::DetectImageType)?;
901-
let block = match image_type {
927+
match image_type {
902928
ImageType::Raw => {
903929
let raw_img = vm_virtio::RawFile::new(raw_img);
904930
let dev = vm_virtio::Block::new(
@@ -909,7 +935,13 @@ impl DeviceManager {
909935
)
910936
.map_err(DeviceManagerError::CreateVirtioBlock)?;
911937

912-
Arc::new(Mutex::new(dev)) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>
938+
let block = Arc::new(Mutex::new(dev));
939+
940+
devices.push((
941+
Arc::clone(&block) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
942+
disk_cfg.iommu,
943+
));
944+
migratable_devices.push(Arc::clone(&block) as Arc<Mutex<dyn Migratable>>);
913945
}
914946
ImageType::Qcow2 => {
915947
let qcow_img = QcowFile::from(raw_img)
@@ -921,11 +953,16 @@ impl DeviceManager {
921953
disk_cfg.iommu,
922954
)
923955
.map_err(DeviceManagerError::CreateVirtioBlock)?;
924-
Arc::new(Mutex::new(dev)) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>
956+
957+
let block = Arc::new(Mutex::new(dev));
958+
959+
devices.push((
960+
Arc::clone(&block) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
961+
disk_cfg.iommu,
962+
));
963+
migratable_devices.push(Arc::clone(&block) as Arc<Mutex<dyn Migratable>>);
925964
}
926965
};
927-
928-
devices.push((Arc::clone(&block), disk_cfg.iommu));
929966
}
930967
}
931968

@@ -934,6 +971,7 @@ impl DeviceManager {
934971

935972
fn make_virtio_net_devices(
936973
vm_info: &VmInfo,
974+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
937975
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
938976
let mut devices = Vec::new();
939977

@@ -962,6 +1000,8 @@ impl DeviceManager {
9621000
Arc::clone(&virtio_net_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
9631001
net_cfg.iommu,
9641002
));
1003+
migratable_devices
1004+
.push(Arc::clone(&virtio_net_device) as Arc<Mutex<dyn Migratable>>);
9651005
}
9661006
}
9671007

@@ -970,6 +1010,7 @@ impl DeviceManager {
9701010

9711011
fn make_virtio_rng_devices(
9721012
vm_info: &VmInfo,
1013+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
9731014
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
9741015
let mut devices = Vec::new();
9751016

@@ -984,6 +1025,8 @@ impl DeviceManager {
9841025
Arc::clone(&virtio_rng_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
9851026
false,
9861027
));
1028+
1029+
migratable_devices.push(Arc::clone(&virtio_rng_device) as Arc<Mutex<dyn Migratable>>);
9871030
}
9881031

9891032
Ok(devices)
@@ -994,6 +1037,7 @@ impl DeviceManager {
9941037
allocator: &mut SystemAllocator,
9951038
mem_slots: &mut u32,
9961039
mmap_regions: &mut Vec<(*mut libc::c_void, usize)>,
1040+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
9971041
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
9981042
let mut devices = Vec::new();
9991043
// Add virtio-fs if required
@@ -1074,6 +1118,9 @@ impl DeviceManager {
10741118
Arc::clone(&virtio_fs_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
10751119
false,
10761120
));
1121+
1122+
migratable_devices
1123+
.push(Arc::clone(&virtio_fs_device) as Arc<Mutex<dyn Migratable>>);
10771124
}
10781125
}
10791126
}
@@ -1086,6 +1133,7 @@ impl DeviceManager {
10861133
allocator: &mut SystemAllocator,
10871134
mem_slots: &mut u32,
10881135
mmap_regions: &mut Vec<(*mut libc::c_void, usize)>,
1136+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
10891137
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
10901138
let mut devices = Vec::new();
10911139
// Add virtio-pmem if required
@@ -1177,6 +1225,9 @@ impl DeviceManager {
11771225
Arc::clone(&virtio_pmem_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
11781226
false,
11791227
));
1228+
1229+
migratable_devices
1230+
.push(Arc::clone(&virtio_pmem_device) as Arc<Mutex<dyn Migratable>>);
11801231
}
11811232
}
11821233

@@ -1185,6 +1236,7 @@ impl DeviceManager {
11851236

11861237
fn make_virtio_vhost_user_net_devices(
11871238
vm_info: &VmInfo,
1239+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
11881240
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
11891241
let mut devices = Vec::new();
11901242
// Add vhost-user-net if required
@@ -1204,6 +1256,9 @@ impl DeviceManager {
12041256
Arc::clone(&vhost_user_net_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
12051257
false,
12061258
));
1259+
1260+
migratable_devices
1261+
.push(Arc::clone(&vhost_user_net_device) as Arc<Mutex<dyn Migratable>>);
12071262
}
12081263
}
12091264

@@ -1212,6 +1267,7 @@ impl DeviceManager {
12121267

12131268
fn make_virtio_vhost_user_blk_devices(
12141269
vm_info: &VmInfo,
1270+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
12151271
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
12161272
let mut devices = Vec::new();
12171273
// Add vhost-user-blk if required
@@ -1231,6 +1287,9 @@ impl DeviceManager {
12311287
Arc::clone(&vhost_user_blk_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
12321288
false,
12331289
));
1290+
1291+
migratable_devices
1292+
.push(Arc::clone(&vhost_user_blk_device) as Arc<Mutex<dyn Migratable>>);
12341293
}
12351294
}
12361295

@@ -1239,6 +1298,7 @@ impl DeviceManager {
12391298

12401299
fn make_virtio_vsock_devices(
12411300
vm_info: &VmInfo,
1301+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
12421302
) -> DeviceManagerResult<Vec<(VirtioDeviceArc, bool)>> {
12431303
let mut devices = Vec::new();
12441304
// Add vsock if required
@@ -1261,6 +1321,8 @@ impl DeviceManager {
12611321
Arc::clone(&vsock_device) as Arc<Mutex<dyn vm_virtio::VirtioDevice>>,
12621322
false,
12631323
));
1324+
1325+
migratable_devices.push(Arc::clone(&vsock_device) as Arc<Mutex<dyn Migratable>>);
12641326
}
12651327
}
12661328

@@ -1373,6 +1435,7 @@ impl DeviceManager {
13731435
vm_fd: &Arc<VmFd>,
13741436
pci: &mut PciBus,
13751437
iommu_mapping: &Option<Arc<IommuMapping>>,
1438+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
13761439
) -> DeviceManagerResult<Option<u32>> {
13771440
// Allows support for one MSI-X vector per queue. It also adds 1
13781441
// as we need to take into account the dedicated vector to notify
@@ -1471,6 +1534,8 @@ impl DeviceManager {
14711534
)
14721535
.map_err(DeviceManagerError::AddPciDevice)?;
14731536

1537+
migratable_devices.push(Arc::clone(&virtio_pci_device) as Arc<Mutex<dyn Migratable>>);
1538+
14741539
let ret = if iommu_mapping.is_some() {
14751540
Some(dev_id)
14761541
} else {
@@ -1490,6 +1555,7 @@ impl DeviceManager {
14901555
interrupt_info: &InterruptInfo,
14911556
mmio_base: GuestAddress,
14921557
cmdline_additions: &mut Vec<String>,
1558+
migratable_devices: &mut Vec<Arc<Mutex<dyn Migratable>>>,
14931559
) -> DeviceManagerResult<()> {
14941560
let mut mmio_device = vm_virtio::transport::MmioDevice::new(memory.clone(), virtio_device)
14951561
.map_err(DeviceManagerError::VirtioDevice)?;
@@ -1515,9 +1581,10 @@ impl DeviceManager {
15151581

15161582
mmio_device.assign_interrupt(interrupt);
15171583

1584+
let mmio_device_arc = Arc::new(Mutex::new(mmio_device));
15181585
address_manager
15191586
.mmio_bus
1520-
.insert(Arc::new(Mutex::new(mmio_device)), mmio_base.0, MMIO_LEN)
1587+
.insert(mmio_device_arc.clone(), mmio_base.0, MMIO_LEN)
15211588
.map_err(DeviceManagerError::BusError)?;
15221589

15231590
cmdline_additions.push(format!(
@@ -1527,6 +1594,8 @@ impl DeviceManager {
15271594
irq_num
15281595
));
15291596

1597+
migratable_devices.push(Arc::clone(&mmio_device_arc) as Arc<Mutex<dyn Migratable>>);
1598+
15301599
Ok(())
15311600
}
15321601

0 commit comments

Comments
 (0)