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