From 3fa5df4161085bd7cfdc1ea1f028e66994a26727 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Wed, 30 Oct 2019 09:41:08 -0700 Subject: [PATCH] vmm: Unregister old ioeventfds when reprogramming PCI BAR Now that kvm-ioctls has been updated, the function unregister_ioevent() can be used to remove eventfd previously associated with some specific PIO or MMIO guest address. Particularly, it is useful for the PCI BAR reprogramming case, as we want to ensure the eventfd will only get triggered by the new BAR address, and not the old one. Signed-off-by: Sebastien Boeuf --- vmm/src/device_manager.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/vmm/src/device_manager.rs b/vmm/src/device_manager.rs index cac505d9d..5b181b0dc 100644 --- a/vmm/src/device_manager.rs +++ b/vmm/src/device_manager.rs @@ -360,6 +360,10 @@ impl DeviceRelocation for AddressManager { if let Some(virtio_pci_dev) = any_dev.downcast_ref::() { let bar_addr = virtio_pci_dev.config_bar_addr(); if bar_addr == new_base { + for (event, addr, _) in virtio_pci_dev.ioeventfds(old_base) { + let io_addr = IoEventAddress::Mmio(addr); + self.vm_fd.unregister_ioevent(event, &io_addr)?; + } for (event, addr, _) in virtio_pci_dev.ioeventfds(new_base) { let io_addr = IoEventAddress::Mmio(addr); self.vm_fd.register_ioevent(event, &io_addr, NoDatamatch)?;