Re: [PATCH v7 02/10] virtio-pci:decouple virtqueue from interrupt setting process
在 2021/6/2 上午11:47, Cindy Lu 写道: Decouple virtqueue from interrupt setting process to support config interrupt Now the code for interrupt/vector are coupling with the vq number, this patch will decouple the vritqueue numbers from these functions. Signed-off-by: Cindy Lu --- hw/virtio/virtio-pci.c | 51 -- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index b321604d9b..c5c080ec94 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -693,23 +693,17 @@ static void kvm_virtio_pci_vq_vector_release(VirtIOPCIProxy *proxy, } static int kvm_virtio_pci_irqfd_use(VirtIOPCIProxy *proxy, - unsigned int queue_no, + EventNotifier *n, unsigned int vector) { VirtIOIRQFD *irqfd = >vector_irqfd[vector]; -VirtIODevice *vdev = virtio_bus_get_device(>bus); -VirtQueue *vq = virtio_get_queue(vdev, queue_no); -EventNotifier *n = virtio_queue_get_guest_notifier(vq); return kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, n, NULL, irqfd->virq); } static void kvm_virtio_pci_irqfd_release(VirtIOPCIProxy *proxy, - unsigned int queue_no, + EventNotifier *n , unsigned int vector) { -VirtIODevice *vdev = virtio_bus_get_device(>bus); -VirtQueue *vq = virtio_get_queue(vdev, queue_no); -EventNotifier *n = virtio_queue_get_guest_notifier(vq); VirtIOIRQFD *irqfd = >vector_irqfd[vector]; int ret; @@ -724,7 +718,8 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); unsigned int vector; int ret, queue_no; - +VirtQueue *vq; +EventNotifier *n; Let's leave a newline here. for (queue_no = 0; queue_no < nvqs; queue_no++) { if (!virtio_queue_get_num(vdev, queue_no)) { break; @@ -741,7 +736,9 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) * Otherwise, delay until unmasked in the frontend. */ if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { -ret = kvm_virtio_pci_irqfd_use(proxy, queue_no, vector); +vq = virtio_get_queue(vdev, queue_no); +n = virtio_queue_get_guest_notifier(vq); +ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); if (ret < 0) { kvm_virtio_pci_vq_vector_release(proxy, vector); goto undo; @@ -757,7 +754,9 @@ undo: continue; } if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { -kvm_virtio_pci_irqfd_release(proxy, queue_no, vector); +vq = virtio_get_queue(vdev, queue_no); +n = virtio_queue_get_guest_notifier(vq); +kvm_virtio_pci_irqfd_release(proxy, n, vector); } kvm_virtio_pci_vq_vector_release(proxy, vector); } @@ -771,7 +770,8 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) unsigned int vector; int queue_no; VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); - +VirtQueue *vq; +EventNotifier *n; Similar here. for (queue_no = 0; queue_no < nvqs; queue_no++) { if (!virtio_queue_get_num(vdev, queue_no)) { break; @@ -784,7 +784,9 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) * Otherwise, it was cleaned when masked in the frontend. */ if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { -kvm_virtio_pci_irqfd_release(proxy, queue_no, vector); +vq = virtio_get_queue(vdev, queue_no); +n = virtio_queue_get_guest_notifier(vq); +kvm_virtio_pci_irqfd_release(proxy, n, vector); } kvm_virtio_pci_vq_vector_release(proxy, vector); } @@ -793,12 +795,11 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy, unsigned int queue_no, unsigned int vector, - MSIMessage msg) + MSIMessage msg, + EventNotifier *n) { A question: if this function needs to be used by configure interrupt, it needs rename. Otherwise we don't need to bother since it only deal with vq vector. VirtIODevice *vdev = virtio_bus_get_device(>bus); VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); -VirtQueue *vq = virtio_get_queue(vdev, queue_no); -EventNotifier *n = virtio_queue_get_guest_notifier(vq);
[PATCH v7 02/10] virtio-pci:decouple virtqueue from interrupt setting process
Decouple virtqueue from interrupt setting process to support config interrupt Now the code for interrupt/vector are coupling with the vq number, this patch will decouple the vritqueue numbers from these functions. Signed-off-by: Cindy Lu --- hw/virtio/virtio-pci.c | 51 -- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index b321604d9b..c5c080ec94 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -693,23 +693,17 @@ static void kvm_virtio_pci_vq_vector_release(VirtIOPCIProxy *proxy, } static int kvm_virtio_pci_irqfd_use(VirtIOPCIProxy *proxy, - unsigned int queue_no, + EventNotifier *n, unsigned int vector) { VirtIOIRQFD *irqfd = >vector_irqfd[vector]; -VirtIODevice *vdev = virtio_bus_get_device(>bus); -VirtQueue *vq = virtio_get_queue(vdev, queue_no); -EventNotifier *n = virtio_queue_get_guest_notifier(vq); return kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, n, NULL, irqfd->virq); } static void kvm_virtio_pci_irqfd_release(VirtIOPCIProxy *proxy, - unsigned int queue_no, + EventNotifier *n , unsigned int vector) { -VirtIODevice *vdev = virtio_bus_get_device(>bus); -VirtQueue *vq = virtio_get_queue(vdev, queue_no); -EventNotifier *n = virtio_queue_get_guest_notifier(vq); VirtIOIRQFD *irqfd = >vector_irqfd[vector]; int ret; @@ -724,7 +718,8 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); unsigned int vector; int ret, queue_no; - +VirtQueue *vq; +EventNotifier *n; for (queue_no = 0; queue_no < nvqs; queue_no++) { if (!virtio_queue_get_num(vdev, queue_no)) { break; @@ -741,7 +736,9 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) * Otherwise, delay until unmasked in the frontend. */ if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { -ret = kvm_virtio_pci_irqfd_use(proxy, queue_no, vector); +vq = virtio_get_queue(vdev, queue_no); +n = virtio_queue_get_guest_notifier(vq); +ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); if (ret < 0) { kvm_virtio_pci_vq_vector_release(proxy, vector); goto undo; @@ -757,7 +754,9 @@ undo: continue; } if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { -kvm_virtio_pci_irqfd_release(proxy, queue_no, vector); +vq = virtio_get_queue(vdev, queue_no); +n = virtio_queue_get_guest_notifier(vq); +kvm_virtio_pci_irqfd_release(proxy, n, vector); } kvm_virtio_pci_vq_vector_release(proxy, vector); } @@ -771,7 +770,8 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) unsigned int vector; int queue_no; VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); - +VirtQueue *vq; +EventNotifier *n; for (queue_no = 0; queue_no < nvqs; queue_no++) { if (!virtio_queue_get_num(vdev, queue_no)) { break; @@ -784,7 +784,9 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) * Otherwise, it was cleaned when masked in the frontend. */ if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { -kvm_virtio_pci_irqfd_release(proxy, queue_no, vector); +vq = virtio_get_queue(vdev, queue_no); +n = virtio_queue_get_guest_notifier(vq); +kvm_virtio_pci_irqfd_release(proxy, n, vector); } kvm_virtio_pci_vq_vector_release(proxy, vector); } @@ -793,12 +795,11 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy, unsigned int queue_no, unsigned int vector, - MSIMessage msg) + MSIMessage msg, + EventNotifier *n) { VirtIODevice *vdev = virtio_bus_get_device(>bus); VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); -VirtQueue *vq = virtio_get_queue(vdev, queue_no); -EventNotifier *n = virtio_queue_get_guest_notifier(vq); VirtIOIRQFD *irqfd; int ret = 0; @@ -825,14 +826,15 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy, event_notifier_set(n); } } else { -ret = kvm_virtio_pci_irqfd_use(proxy, queue_no, vector); +ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); }