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

View File

@ -2430,10 +2430,7 @@ impl DeviceManager {
let mm = self.memory_manager.clone();
let mm = mm.lock().unwrap();
for (_memory_zone_id, memory_zone) in mm.memory_zones().iter() {
if let (Some(region), Some(resize)) = (
memory_zone.virtio_mem_region(),
memory_zone.virtio_mem_resize(),
) {
if let Some(virtio_mem_zone) = memory_zone.virtio_mem_zone() {
let id = self.next_device_name(MEM_DEVICE_NAME_PREFIX)?;
#[cfg(not(feature = "acpi"))]
@ -2445,8 +2442,9 @@ impl DeviceManager {
let virtio_mem_device = Arc::new(Mutex::new(
virtio_devices::Mem::new(
id.clone(),
&region,
resize
virtio_mem_zone.region(),
virtio_mem_zone
.resize_handler()
.try_clone()
.map_err(DeviceManagerError::TryCloneVirtioMemResize)?,
self.seccomp_action.clone(),

View File

@ -64,22 +64,32 @@ struct HotPlugState {
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)]
pub struct MemoryZone {
regions: Vec<Arc<GuestRegionMmap>>,
virtio_mem_region: Option<Arc<GuestRegionMmap>>,
virtio_mem_resize: Option<virtio_devices::Resize>,
virtio_mem_zone: Option<VirtioMemZone>,
}
impl MemoryZone {
pub fn regions(&self) -> &Vec<Arc<GuestRegionMmap>> {
&self.regions
}
pub fn virtio_mem_region(&self) -> &Option<Arc<GuestRegionMmap>> {
&self.virtio_mem_region
}
pub fn virtio_mem_resize(&self) -> &Option<virtio_devices::Resize> {
&self.virtio_mem_resize
pub fn virtio_mem_zone(&self) -> &Option<VirtioMemZone> {
&self.virtio_mem_zone
}
}
@ -598,9 +608,11 @@ impl MemoryManager {
virtio_mem_regions.push(region.clone());
memory_zone.virtio_mem_region = Some(region);
memory_zone.virtio_mem_resize =
Some(virtio_devices::Resize::new().map_err(Error::EventFdFail)?);
memory_zone.virtio_mem_zone = Some(VirtioMemZone {
region,
resize_handler: virtio_devices::Resize::new()
.map_err(Error::EventFdFail)?,
});
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> {
if let Some(memory_zone) = self.memory_zones.get_mut(id) {
if let Some(resize) = &memory_zone.virtio_mem_resize {
resize.work(size).map_err(Error::VirtioMemResizeFail)?;
if let Some(virtio_mem_zone) = memory_zone.virtio_mem_zone() {
virtio_mem_zone
.resize_handler()
.work(size)
.map_err(Error::VirtioMemResizeFail)?;
} else {
error!("Failed resizing virtio-mem region: No virtio-mem handler");
return Err(Error::MissingVirtioMemHandler);