int msix_set_vector_notifiers(PCIDevice *dev, MSIVectorUseNotifier use_notifier, MSIVectorReleaseNotifier release_notifier, MSIVectorPollNotifier poll_notifier) { int vector, ret; assert(use_notifier && release_notifier); dev->msix_vector_use_notifier = use_notifier; dev->msix_vector_release_notifier = release_notifier; dev->msix_vector_poll_notifier = poll_notifier; if ((dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] & (MSIX_ENABLE_MASK | MSIX_MASKALL_MASK)) == MSIX_ENABLE_MASK) { for (vector = 0; vector < dev->msix_entries_nr; vector++) { ret = msix_set_notifier_for_vector(dev, vector); if (ret < 0) { goto undo; } } } if (dev->msix_vector_poll_notifier) { dev->msix_vector_poll_notifier(dev, 0, dev->msix_entries_nr); } return 0; undo: while (--vector >= 0) { msix_unset_notifier_for_vector(dev, vector); } dev->msix_vector_use_notifier = NULL; dev->msix_vector_release_notifier = NULL; return ret; }
void msix_unset_vector_notifiers(PCIDevice *dev) { int vector; assert(dev->msix_vector_use_notifier && dev->msix_vector_release_notifier); if ((dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] & (MSIX_ENABLE_MASK | MSIX_MASKALL_MASK)) == MSIX_ENABLE_MASK) { for (vector = 0; vector < dev->msix_entries_nr; vector++) { msix_unset_notifier_for_vector(dev, vector); } } dev->msix_vector_use_notifier = NULL; dev->msix_vector_release_notifier = NULL; }