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)?, ));