From dcedd4cded0f2a8d04c349bb941de619ef8c57d7 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Fri, 11 Sep 2020 15:09:06 +0200 Subject: [PATCH] virtio-devices: virtio-mem: Add NUMA support Implement support for associating a virtio-mem device with a specific guest NUMA node, based on the ACPI proximity domain identifier. Signed-off-by: Sebastien Boeuf --- virtio-devices/src/mem.rs | 12 ++++++++++-- vmm/src/device_manager.rs | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/virtio-devices/src/mem.rs b/virtio-devices/src/mem.rs index d98c7e3d7..4f3f1042b 100644 --- a/virtio-devices/src/mem.rs +++ b/virtio-devices/src/mem.rs @@ -90,6 +90,9 @@ const RESIZE_EVENT: u16 = EPOLL_HELPER_EVENT_LAST + 1; // New descriptors are pending on the virtio queue. const QUEUE_AVAIL_EVENT: u16 = EPOLL_HELPER_EVENT_LAST + 2; +// Virtio features +const VIRTIO_MEM_F_ACPI_PXM: u8 = 0; + #[derive(Debug)] pub enum Error { // Guest gave us bad memory addresses. @@ -695,6 +698,7 @@ impl Mem { region: &Arc, resize: Resize, seccomp_action: SeccompAction, + numa_node_id: Option, ) -> io::Result { let region_len = region.len(); @@ -709,8 +713,7 @@ impl Mem { )); } - // Fixme: Not support VIRTIO_MEM_F_ACPI_PXM - let avail_features = 1u64 << VIRTIO_F_VERSION_1; + let mut avail_features = 1u64 << VIRTIO_F_VERSION_1; let mut config = VirtioMemConfig::default(); config.block_size = VIRTIO_MEM_DEFAULT_BLOCK_SIZE; @@ -721,6 +724,11 @@ impl Mem { config.requested_size + VIRTIO_MEM_USABLE_EXTENT, ); + if let Some(node_id) = numa_node_id { + avail_features |= 1u64 << VIRTIO_MEM_F_ACPI_PXM; + config.node_id = node_id; + } + let host_fd = if let Some(f_offset) = region.file_offset() { Some(f_offset.file().as_raw_fd()) } else { diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index e39a5b20e..776da603b 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -2434,6 +2434,7 @@ impl DeviceManager { .try_clone() .map_err(DeviceManagerError::TryCloneVirtioMemResize)?, self.seccomp_action.clone(), + None, ) .map_err(DeviceManagerError::CreateVirtioMem)?, ));