If MSI-X is disabled or the global mask is set, don't fire the notifier during registration or removal, reporting a wrong state. Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> --- hw/msix.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) diff --git a/hw/msix.c b/hw/msix.c index 60d6d1e..6493937 100644 --- a/hw/msix.c +++ b/hw/msix.c @@ -563,10 +563,13 @@ int msix_set_mask_notifier(PCIDevice *dev, msix_mask_notifier_func f) int r, n; assert(!dev->msix_mask_notifier); dev->msix_mask_notifier = f; - for (n = 0; n < dev->msix_entries_nr; ++n) { - r = msix_set_mask_notifier_for_vector(dev, n); - if (r < 0) { - goto undo; + if ((dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] & + (MSIX_ENABLE_MASK | MSIX_MASKALL_MASK)) == MSIX_ENABLE_MASK) { + for (n = 0; n < dev->msix_entries_nr; ++n) { + r = msix_set_mask_notifier_for_vector(dev, n); + if (r < 0) { + goto undo; + } } } return 0; @@ -583,10 +586,13 @@ int msix_unset_mask_notifier(PCIDevice *dev) { int r, n; assert(dev->msix_mask_notifier); - for (n = 0; n < dev->msix_entries_nr; ++n) { - r = msix_unset_mask_notifier_for_vector(dev, n); - if (r < 0) { - goto undo; + if ((dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] & + (MSIX_ENABLE_MASK | MSIX_MASKALL_MASK)) == MSIX_ENABLE_MASK) { + for (n = 0; n < dev->msix_entries_nr; ++n) { + r = msix_unset_mask_notifier_for_vector(dev, n); + if (r < 0) { + goto undo; + } } } dev->msix_mask_notifier = NULL; -- 1.7.3.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html