Message ID | 20210706072030.32365-9-lulu@redhat.com |
---|---|
State | New |
Headers | show |
Series | vhost-vdpa: add support for configure interrupt | expand |
在 2021/7/6 下午3:20, Cindy Lu 写道: > use the kvm_virtio_pci_vector_use_one and _release_one > these funtion is to deal with the single vector, the > whole process will finish in a loop with vq number. > > Signed-off-by: Cindy Lu <lulu@redhat.com> > --- > hw/virtio/virtio-pci.c | 109 ++++++++++++++++------------------------- > 1 file changed, 42 insertions(+), 67 deletions(-) > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > index fe06847b62..e43d5760ee 100644 > --- a/hw/virtio/virtio-pci.c > +++ b/hw/virtio/virtio-pci.c > @@ -666,7 +666,6 @@ static uint32_t virtio_read_config(PCIDevice *pci_dev, > } > > static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy, > - unsigned int queue_no, > unsigned int vector) > { > VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector]; > @@ -733,87 +732,63 @@ static int virtio_pci_get_notifier(VirtIOPCIProxy *proxy, int queue_no, > return 0; > } > > -static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) > +static int kvm_virtio_pci_vector_use_one(VirtIOPCIProxy *proxy, int queue_no) > { > - PCIDevice *dev = &proxy->pci_dev; > - VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); > - VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); > unsigned int vector; > - int ret, queue_no; > + int ret; > EventNotifier *n; > - for (queue_no = 0; queue_no < nvqs; queue_no++) { > - if (!virtio_queue_get_num(vdev, queue_no)) { > - break; > - } So this check is not moved but deleted, is this intentional? > - ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); > - if (ret < 0) { > - break; > - } > - if (vector >= msix_nr_vectors_allocated(dev)) { > - continue; > - } So did this? > - ret = kvm_virtio_pci_vq_vector_use(proxy, queue_no, vector); > - if (ret < 0) { > - goto undo; > - } > - /* If guest supports masking, set up irqfd now. > - * Otherwise, delay until unmasked in the frontend. > - */ > - if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { > - ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); > - if (ret < 0) { > - kvm_virtio_pci_vq_vector_release(proxy, vector); > - goto undo; > - } > - } > + ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); > + if (ret < 0) { > + return ret; > + } > + ret = kvm_virtio_pci_vq_vector_use(proxy, vector); > + if (ret < 0) { > + goto undo; > + } > + ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); > + if (ret < 0) { > + goto undo; > } > return 0; > - > undo: > - while (--queue_no >= 0) { > - vector = virtio_queue_vector(vdev, queue_no); > - if (vector >= msix_nr_vectors_allocated(dev)) { > - continue; > - } > - if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { > - ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); > - if (ret < 0) { > - break; > - } > - kvm_virtio_pci_irqfd_release(proxy, n, vector); > - } > - kvm_virtio_pci_vq_vector_release(proxy, vector); > + kvm_virtio_pci_irqfd_release(proxy, n, vector); > + return ret; > +} > +static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) > +{ > + int queue_no; > + int ret = 0; > + for (queue_no = 0; queue_no < nvqs; queue_no++) { > + ret = kvm_virtio_pci_vector_use_one(proxy, queue_no); > } > return ret; > } > > -static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) > + > +static void kvm_virtio_pci_vector_release_one(VirtIOPCIProxy *proxy, > + int queue_no) > { > - PCIDevice *dev = &proxy->pci_dev; > VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); > unsigned int vector; > - int queue_no; > - VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); > EventNotifier *n; > - int ret ; > + int ret; > + VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); > + ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); > + if (ret < 0) { > + return; > + } > + > + if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { > + kvm_virtio_pci_irqfd_release(proxy, n, vector); > + } > + kvm_virtio_pci_vq_vector_release(proxy, vector); > +} > +static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) > +{ > + int queue_no; > + > for (queue_no = 0; queue_no < nvqs; queue_no++) { > - if (!virtio_queue_get_num(vdev, queue_no)) { > - break; > - } This is deleted by not removed. > - ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); > - if (ret < 0) { > - break; > - } > - if (vector >= msix_nr_vectors_allocated(dev)) { > - continue; > - } So did this. Thanks > - /* If guest supports masking, clean up irqfd now. > - * 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, n, vector); > - } > - kvm_virtio_pci_vq_vector_release(proxy, vector); > + kvm_virtio_pci_vector_release_one(proxy, queue_no); > } > } >
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index fe06847b62..e43d5760ee 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -666,7 +666,6 @@ static uint32_t virtio_read_config(PCIDevice *pci_dev, } static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy, - unsigned int queue_no, unsigned int vector) { VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector]; @@ -733,87 +732,63 @@ static int virtio_pci_get_notifier(VirtIOPCIProxy *proxy, int queue_no, return 0; } -static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) +static int kvm_virtio_pci_vector_use_one(VirtIOPCIProxy *proxy, int queue_no) { - PCIDevice *dev = &proxy->pci_dev; - VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); - VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); unsigned int vector; - int ret, queue_no; + int ret; EventNotifier *n; - for (queue_no = 0; queue_no < nvqs; queue_no++) { - if (!virtio_queue_get_num(vdev, queue_no)) { - break; - } - ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); - if (ret < 0) { - break; - } - if (vector >= msix_nr_vectors_allocated(dev)) { - continue; - } - ret = kvm_virtio_pci_vq_vector_use(proxy, queue_no, vector); - if (ret < 0) { - goto undo; - } - /* If guest supports masking, set up irqfd now. - * Otherwise, delay until unmasked in the frontend. - */ - if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { - ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); - if (ret < 0) { - kvm_virtio_pci_vq_vector_release(proxy, vector); - goto undo; - } - } + ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); + if (ret < 0) { + return ret; + } + ret = kvm_virtio_pci_vq_vector_use(proxy, vector); + if (ret < 0) { + goto undo; + } + ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); + if (ret < 0) { + goto undo; } return 0; - undo: - while (--queue_no >= 0) { - vector = virtio_queue_vector(vdev, queue_no); - if (vector >= msix_nr_vectors_allocated(dev)) { - continue; - } - if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { - ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); - if (ret < 0) { - break; - } - kvm_virtio_pci_irqfd_release(proxy, n, vector); - } - kvm_virtio_pci_vq_vector_release(proxy, vector); + kvm_virtio_pci_irqfd_release(proxy, n, vector); + return ret; +} +static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs) +{ + int queue_no; + int ret = 0; + for (queue_no = 0; queue_no < nvqs; queue_no++) { + ret = kvm_virtio_pci_vector_use_one(proxy, queue_no); } return ret; } -static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) + +static void kvm_virtio_pci_vector_release_one(VirtIOPCIProxy *proxy, + int queue_no) { - PCIDevice *dev = &proxy->pci_dev; VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); unsigned int vector; - int queue_no; - VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); EventNotifier *n; - int ret ; + int ret; + VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev); + ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); + if (ret < 0) { + return; + } + + if (vdev->use_guest_notifier_mask && k->guest_notifier_mask) { + kvm_virtio_pci_irqfd_release(proxy, n, vector); + } + kvm_virtio_pci_vq_vector_release(proxy, vector); +} +static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs) +{ + int queue_no; + for (queue_no = 0; queue_no < nvqs; queue_no++) { - if (!virtio_queue_get_num(vdev, queue_no)) { - break; - } - ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); - if (ret < 0) { - break; - } - if (vector >= msix_nr_vectors_allocated(dev)) { - continue; - } - /* If guest supports masking, clean up irqfd now. - * 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, n, vector); - } - kvm_virtio_pci_vq_vector_release(proxy, vector); + kvm_virtio_pci_vector_release_one(proxy, queue_no); } }
use the kvm_virtio_pci_vector_use_one and _release_one these funtion is to deal with the single vector, the whole process will finish in a loop with vq number. Signed-off-by: Cindy Lu <lulu@redhat.com> --- hw/virtio/virtio-pci.c | 109 ++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 67 deletions(-)