vmm: Conditionally update ioeventfds for virtio PCI device

The specific part of PCI BAR reprogramming that happens for a virtio PCI
device is the update of the ioeventfds addresses KVM should listen to.
This should not be triggered for every BAR reprogramming associated with
the virtio device since a virtio PCI device might have multiple BARs.

The update of the ioeventfds addresses should only happen when the BAR
related to those addresses is being moved.

Signed-off-by: Sebastien Boeuf <sebastien.boeuf@intel.com>
This commit is contained in:
Sebastien Boeuf
2019-10-30 09:13:29 -07:00
committed by Samuel Ortiz
parent de21c9ba4f
commit c7cabc88b4
4 changed files with 29 additions and 26 deletions
+12 -16
View File
@@ -194,14 +194,9 @@ impl PciConfigIo {
if let Some(d) = pci_bus.devices.get(device) {
let mut device = d.lock().unwrap();
// Find out if one of the device's BAR is being reprogrammed
let bar_reprog_params = device.detect_bar_reprogramming(register, data);
// Update the register value
device.write_config_register(register, offset, data);
// Reprogram the BAR if needed
if let Some(params) = bar_reprog_params {
// Find out if one of the device's BAR is being reprogrammed, and
// reprogram it if needed.
if let Some(params) = device.detect_bar_reprogramming(register, data) {
if let Err(e) = pci_bus.device_reloc.upgrade().unwrap().move_bar(
params.old_base,
params.new_base,
@@ -212,6 +207,9 @@ impl PciConfigIo {
error!("Failed moving device BAR: {}", e);
}
}
// Update the register value
device.write_config_register(register, offset, data);
}
}
@@ -312,14 +310,9 @@ impl PciConfigMmio {
if let Some(d) = pci_bus.devices.get(device) {
let mut device = d.lock().unwrap();
// Find out if one of the device's BAR is being reprogrammed
let bar_reprog_params = device.detect_bar_reprogramming(register, data);
// Update the register value
device.write_config_register(register, offset, data);
// Reprogram the BAR if needed
if let Some(params) = bar_reprog_params {
// Find out if one of the device's BAR is being reprogrammed, and
// reprogram it if needed.
if let Some(params) = device.detect_bar_reprogramming(register, data) {
if let Err(e) = pci_bus.device_reloc.upgrade().unwrap().move_bar(
params.old_base,
params.new_base,
@@ -330,6 +323,9 @@ impl PciConfigMmio {
error!("Failed moving device BAR: {}", e);
}
}
// Update the register value
device.write_config_register(register, offset, data);
}
}
}