vmm: Group virtio-mem fields under a dedicated structure

This patch simplifies the code as we have one single Option for the
VirtioMemZone. This also prepares for storing additional information
related to the virtio-mem region.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf
2020-09-14 22:24:36 +02:00
parent 4e1b78e1ff
commit 3faf8605f3
2 changed files with 31 additions and 18 deletions
+4 -6
View File
@@ -2430,10 +2430,7 @@ impl DeviceManager {
let mm = self.memory_manager.clone(); let mm = self.memory_manager.clone();
let mm = mm.lock().unwrap(); let mm = mm.lock().unwrap();
for (_memory_zone_id, memory_zone) in mm.memory_zones().iter() { for (_memory_zone_id, memory_zone) in mm.memory_zones().iter() {
if let (Some(region), Some(resize)) = ( if let Some(virtio_mem_zone) = memory_zone.virtio_mem_zone() {
memory_zone.virtio_mem_region(),
memory_zone.virtio_mem_resize(),
) {
let id = self.next_device_name(MEM_DEVICE_NAME_PREFIX)?; let id = self.next_device_name(MEM_DEVICE_NAME_PREFIX)?;
#[cfg(not(feature = "acpi"))] #[cfg(not(feature = "acpi"))]
@@ -2445,8 +2442,9 @@ impl DeviceManager {
let virtio_mem_device = Arc::new(Mutex::new( let virtio_mem_device = Arc::new(Mutex::new(
virtio_devices::Mem::new( virtio_devices::Mem::new(
id.clone(), id.clone(),
&region, virtio_mem_zone.region(),
resize virtio_mem_zone
.resize_handler()
.try_clone() .try_clone()
.map_err(DeviceManagerError::TryCloneVirtioMemResize)?, .map_err(DeviceManagerError::TryCloneVirtioMemResize)?,
self.seccomp_action.clone(), self.seccomp_action.clone(),
+27 -12
View File
@@ -64,22 +64,32 @@ struct HotPlugState {
removing: bool, removing: bool,
} }
pub struct VirtioMemZone {
region: Arc<GuestRegionMmap>,
resize_handler: virtio_devices::Resize,
}
impl VirtioMemZone {
pub fn region(&self) -> &Arc<GuestRegionMmap> {
&self.region
}
pub fn resize_handler(&self) -> &virtio_devices::Resize {
&self.resize_handler
}
}
#[derive(Default)] #[derive(Default)]
pub struct MemoryZone { pub struct MemoryZone {
regions: Vec<Arc<GuestRegionMmap>>, regions: Vec<Arc<GuestRegionMmap>>,
virtio_mem_region: Option<Arc<GuestRegionMmap>>, virtio_mem_zone: Option<VirtioMemZone>,
virtio_mem_resize: Option<virtio_devices::Resize>,
} }
impl MemoryZone { impl MemoryZone {
pub fn regions(&self) -> &Vec<Arc<GuestRegionMmap>> { pub fn regions(&self) -> &Vec<Arc<GuestRegionMmap>> {
&self.regions &self.regions
} }
pub fn virtio_mem_region(&self) -> &Option<Arc<GuestRegionMmap>> { pub fn virtio_mem_zone(&self) -> &Option<VirtioMemZone> {
&self.virtio_mem_region &self.virtio_mem_zone
}
pub fn virtio_mem_resize(&self) -> &Option<virtio_devices::Resize> {
&self.virtio_mem_resize
} }
} }
@@ -598,9 +608,11 @@ impl MemoryManager {
virtio_mem_regions.push(region.clone()); virtio_mem_regions.push(region.clone());
memory_zone.virtio_mem_region = Some(region); memory_zone.virtio_mem_zone = Some(VirtioMemZone {
memory_zone.virtio_mem_resize = region,
Some(virtio_devices::Resize::new().map_err(Error::EventFdFail)?); resize_handler: virtio_devices::Resize::new()
.map_err(Error::EventFdFail)?,
});
start_of_device_area = start_addr.unchecked_add(hotplug_size); start_of_device_area = start_addr.unchecked_add(hotplug_size);
} }
@@ -1186,8 +1198,11 @@ impl MemoryManager {
pub fn virtio_mem_resize(&mut self, id: &str, size: u64) -> Result<(), Error> { pub fn virtio_mem_resize(&mut self, id: &str, size: u64) -> Result<(), Error> {
if let Some(memory_zone) = self.memory_zones.get_mut(id) { if let Some(memory_zone) = self.memory_zones.get_mut(id) {
if let Some(resize) = &memory_zone.virtio_mem_resize { if let Some(virtio_mem_zone) = memory_zone.virtio_mem_zone() {
resize.work(size).map_err(Error::VirtioMemResizeFail)?; virtio_mem_zone
.resize_handler()
.work(size)
.map_err(Error::VirtioMemResizeFail)?;
} else { } else {
error!("Failed resizing virtio-mem region: No virtio-mem handler"); error!("Failed resizing virtio-mem region: No virtio-mem handler");
return Err(Error::MissingVirtioMemHandler); return Err(Error::MissingVirtioMemHandler);