Revision 54dd9321 hw/virtio-pci.c

b/hw/virtio-pci.c
451 451
    return 0;
452 452
}
453 453

  
454
static int virtio_pci_set_guest_notifiers(void *opaque, bool assign)
455
{
456
    VirtIOPCIProxy *proxy = opaque;
457
    VirtIODevice *vdev = proxy->vdev;
458
    int r, n;
459

  
460
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
461
        if (!virtio_queue_get_num(vdev, n)) {
462
            break;
463
        }
464

  
465
        r = virtio_pci_set_guest_notifier(opaque, n, assign);
466
        if (r < 0) {
467
            goto assign_error;
468
        }
469
    }
470

  
471
    return 0;
472

  
473
assign_error:
474
    /* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
475
    while (--n >= 0) {
476
        virtio_pci_set_guest_notifier(opaque, n, !assign);
477
    }
478
    return r;
479
}
480

  
454 481
static int virtio_pci_set_host_notifier(void *opaque, int n, bool assign)
455 482
{
456 483
    VirtIOPCIProxy *proxy = opaque;
......
488 515
    .load_queue = virtio_pci_load_queue,
489 516
    .get_features = virtio_pci_get_features,
490 517
    .set_host_notifier = virtio_pci_set_host_notifier,
491
    .set_guest_notifier = virtio_pci_set_guest_notifier,
518
    .set_guest_notifiers = virtio_pci_set_guest_notifiers,
492 519
};
493 520

  
494 521
static void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev,

Also available in: Unified diff