aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2011-11-21 19:14:08 +0200
committerAvi Kivity <avi@redhat.com>2011-11-27 13:42:02 +0200
commita26b6a63a988fe8de1f5f8793c12edc009676014 (patch)
treef5d013797644bcdffeb64a7cd73de53d0914253e
parent360e6724867d825e3af6b27c1c54869719196636 (diff)
qemu-kvm: msix: Fire mask notifier on global mask changes
Also invoke the mask notifier if the global MSI-X mask is modified. For this purpose, we push the notifier call from the per-vector mask update to the central msix_handle_mask_update. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--hw/msix.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/hw/msix.c b/hw/msix.c
index 56422c636..e50074f8e 100644
--- a/hw/msix.c
+++ b/hw/msix.c
@@ -231,6 +231,12 @@ static void msix_handle_mask_update(PCIDevice *dev, int vector, bool was_masked)
return;
}
+ if (dev->msix_mask_notifier) {
+ int ret;
+ ret = dev->msix_mask_notifier(dev, vector, is_masked);
+ assert(ret >= 0);
+ }
+
if (!is_masked && msix_is_pending(dev, vector)) {
msix_clr_pending(dev, vector);
msix_notify(dev, vector);
@@ -292,11 +298,6 @@ static void msix_mmio_write(void *opaque, target_phys_addr_t addr,
if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_msix_update(dev, vector, was_masked, msix_is_masked(dev, vector));
}
- if (was_masked != msix_is_masked(dev, vector) && dev->msix_mask_notifier) {
- int r = dev->msix_mask_notifier(dev, vector,
- msix_is_masked(dev, vector));
- assert(r >= 0);
- }
msix_handle_mask_update(dev, vector, was_masked);
}