mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
virtio: change set guest notifier to per-device
When using irqfd with vhost-net to inject interrupts, a single evenfd might inject multiple interrupts. Implementing this is much easier with a single per-device callback to set guest notifiers. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
010ec62934
commit
54dd932128
3 changed files with 57 additions and 26 deletions
|
@ -451,6 +451,33 @@ static int virtio_pci_set_guest_notifier(void *opaque, int n, bool assign)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int virtio_pci_set_guest_notifiers(void *opaque, bool assign)
|
||||
{
|
||||
VirtIOPCIProxy *proxy = opaque;
|
||||
VirtIODevice *vdev = proxy->vdev;
|
||||
int r, n;
|
||||
|
||||
for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
|
||||
if (!virtio_queue_get_num(vdev, n)) {
|
||||
break;
|
||||
}
|
||||
|
||||
r = virtio_pci_set_guest_notifier(opaque, n, assign);
|
||||
if (r < 0) {
|
||||
goto assign_error;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
assign_error:
|
||||
/* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
|
||||
while (--n >= 0) {
|
||||
virtio_pci_set_guest_notifier(opaque, n, !assign);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
static int virtio_pci_set_host_notifier(void *opaque, int n, bool assign)
|
||||
{
|
||||
VirtIOPCIProxy *proxy = opaque;
|
||||
|
@ -488,7 +515,7 @@ static const VirtIOBindings virtio_pci_bindings = {
|
|||
.load_queue = virtio_pci_load_queue,
|
||||
.get_features = virtio_pci_get_features,
|
||||
.set_host_notifier = virtio_pci_set_host_notifier,
|
||||
.set_guest_notifier = virtio_pci_set_guest_notifier,
|
||||
.set_guest_notifiers = virtio_pci_set_guest_notifiers,
|
||||
};
|
||||
|
||||
static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue