msix: fix msix_set/unset_mask_notifier
PATCH 1/1 msix: fix msix_set/unset_mask_notifier
Sridhar Samudrala reported hitting the following assertions in msix.c when doing a guest reboot or live migration using vhost. qemu-kvm/hw/msix.c:375: msix_mask_all: Assertion `r >= 0' failed. qemu-kvm/hw/msix.c:640: msix_unset_mask_notifier:
Assertion `dev->msix_mask_notifier_opaque[vector]' failed.
The issue is that we didn't clear/set the opaque pointer when vector is masked. The following patch fixes this.
---
Sridhar, could you test the following please?
hw/msix.c | 33 ++++++++++++++++----------------- 1 files changed, 16 insertions(+), 17 deletions(-)
hw/msix.c +15 -17
@@ -610,7 +610,7 @@ void msix_unuse_all_vectors(PCIDevice *dev)int msix_set_mask_notifier (PCIDevice *dev,unsigned vector,void *opaque) { -int r; +int r =0 ;if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])return 0 ;
@@ -619,13 +619,11 @@ int msix_set_mask_notifier(PCIDevice *dev, unsigned vector, void *opaque)assert (!dev->msix_mask_notifier_opaque[vector]);/* Unmask the new notifier unless vector is masked. */ -if (msix_is_masked (dev, vector)) { -return 0 ; - } - r = dev->msix_mask_notifier (dev, vector, opaque, -msix_is_masked (dev, vector)); -if (r <0 ) { -return r; +if (!msix_is_masked (dev, vector)) { + r = dev->msix_mask_notifier (dev, vector, opaque, false); +if (r <0 ) { +return r; + } } dev->msix_mask_notifier_opaque[vector] = opaque;return r;
@@ -634,21 +632,21 @@ int msix_set_mask_notifier(PCIDevice *dev, unsigned vector, void *opaque)int msix_unset_mask_notifier (PCIDevice *dev,unsigned vector) {int r =0 ; +void *opaque;if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])return 0 ; + opaque = dev->msix_mask_notifier_opaque[vector]; +assert (dev->msix_mask_notifier); -assert (dev->msix_mask_notifier_opaque[vector]); +assert (opaque);/* Mask the old notifier unless it is already masked. */ -if (msix_is_masked (dev, vector)) { -return 0 ; - } - r = dev->msix_mask_notifier (dev, vector, - dev->msix_mask_notifier_opaque[vector], - !msix_is_masked (dev, vector)); -if (r <0 ) { -return r; +if (!msix_is_masked (dev, vector)) { + r = dev->msix_mask_notifier (dev, vector, opaque, true); +if (r <0 ) { +return r; + } } dev->msix_mask_notifier_opaque[vector] =NULL ;return r;
Signature · 1 line
1.7.1.12.g42b7f
Quoted 6 lines · Michael S. Tsirkin
Sridhar Samudrala reported hitting the following assertions in
msix.cwhen doing a guest reboot or live migration using vhost.qemu-kvm/hw/msix.c:375:msix_mask_all: Assertion `r >= 0' failed.qemu-kvm/hw/msix.c:640:msix_unset_mask_notifier:
Assertion `dev->msix_mask_notifier_opaque[vector]' failed.
Quoted 8 lines
The issue is that we didn't clear/set the opaque pointer when vector is masked. The following patch fixes this.
Signed-off-by Sridhar Samudrala <[email protected]>Signed-off-by Michael S. Tsirkin <[email protected]>---
Sridhar, could you test the following please?
Yes. looks good and works fine for me.
Quoted 67 lines
hw/msix.c | 33 ++++++++++++++++----------------- 1 files changed, 16 insertions(+), 17 deletions(-)hw/msix.c +15
-17@@ -610,7 +610,7 @@ void msix_unuse_all_vectors(PCIDevice *dev)int msix_set_mask_notifier (PCIDevice *dev,unsigned vector,void *opaque) { -int r; +int r =0 ;if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])return 0 ;@@ -619,13 +619,11 @@ int msix_set_mask_notifier(PCIDevice *dev, unsigned vector, void *opaque)assert (!dev->msix_mask_notifier_opaque[vector]);/* Unmask the new notifier unless vector is masked. */ -if (msix_is_masked (dev, vector)) { -return 0 ; - } - r = dev->msix_mask_notifier (dev, vector, opaque, -msix_is_masked (dev, vector)); -if (r <0 ) { -return r; +if (!msix_is_masked (dev, vector)) { + r = dev->msix_mask_notifier (dev, vector, opaque, false); +if (r <0 ) { +return r; + } } dev->msix_mask_notifier_opaque[vector] = opaque;return r;@@ -634,21 +632,21 @@ int msix_set_mask_notifier(PCIDevice *dev, unsigned vector, void *opaque)int msix_unset_mask_notifier (PCIDevice *dev,unsigned vector) {int r =0 ; +void *opaque;if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])return 0 ; + opaque = dev->msix_mask_notifier_opaque[vector]; +assert (dev->msix_mask_notifier); -assert (dev->msix_mask_notifier_opaque[vector]); +assert (opaque);/* Mask the old notifier unless it is already masked. */ -if (msix_is_masked (dev, vector)) { -return 0 ; - } - r = dev->msix_mask_notifier (dev, vector, - dev->msix_mask_notifier_opaque[vector], - !msix_is_masked (dev, vector)); -if (r <0 ) { -return r; +if (!msix_is_masked (dev, vector)) { + r = dev->msix_mask_notifier (dev, vector, opaque, true); +if (r <0 ) { +return r; + } } dev->msix_mask_notifier_opaque[vector] =NULL ;return r;
Marcelo Tosatti
AppliedQuoted 9 lines · Michael S. Tsirkin
Sridhar Samudrala reported hitting the following assertions in
msix.cwhen doing a guest reboot or live migration using vhost.qemu-kvm/hw/msix.c:375:msix_mask_all: Assertion `r >= 0' failed.qemu-kvm/hw/msix.c:640:msix_unset_mask_notifier:
Assertion `dev->msix_mask_notifier_opaque[vector]' failed.The issue is that we didn't clear/set the opaque pointer when vector is masked. The following patch fixes this.
Quoted 8 lines
Signed-off-by Sridhar Samudrala <[email protected]>Signed-off-by Michael S. Tsirkin <[email protected]>---
Sridhar, could you test the following please?
hw/msix.c | 33 ++++++++++++++++----------------- 1 files changed, 16 insertions(+), 17 deletions(-)
Applied, thanks.