All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: qemu-devel@nongnu.org, Alexander Graf <agraf@suse.de>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Anthony Liguori <aliguori@amazon.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH V2 03/11] virito: introduce bus specific queue limit
Date: Thu, 26 Feb 2015 11:19:06 +0100	[thread overview]
Message-ID: <20150226101906.GA24889@redhat.com> (raw)
In-Reply-To: <1424934286-7099-4-git-send-email-jasowang@redhat.com>

On Thu, Feb 26, 2015 at 03:04:38PM +0800, Jason Wang wrote:
> This patch introduces a bus specific queue limitation. It will be
> useful for increasing the limit for one of the bus without disturbing
> other buses.

Is this about s390 only supporting up to 64 queues?


> 
> Cc: Anthony Liguori <aliguori@amazon.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Richard Henderson <rth@twiddle.net>
> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> Cc: Christian Borntraeger <borntraeger@de.ibm.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
>  hw/net/virtio-net.c            |  4 ++--
>  hw/s390x/s390-virtio-bus.c     |  1 +
>  hw/s390x/virtio-ccw.c          |  1 +
>  hw/scsi/virtio-scsi.c          |  4 ++--
>  hw/virtio/virtio-mmio.c        |  1 +
>  hw/virtio/virtio-pci.c         |  1 +
>  hw/virtio/virtio.c             | 52 +++++++++++++++++++++++++++++++-----------
>  include/hw/virtio/virtio-bus.h |  1 +
>  include/hw/virtio/virtio.h     |  1 +
>  9 files changed, 49 insertions(+), 17 deletions(-)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index c8d2cca..260345c 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -1585,10 +1585,10 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
>      virtio_init(vdev, "virtio-net", VIRTIO_ID_NET, n->config_size);
>  
>      n->max_queues = MAX(n->nic_conf.peers.queues, 1);
> -    if (n->max_queues * 2 + 1 > VIRTIO_PCI_QUEUE_MAX) {
> +    if (n->max_queues * 2 + 1 > virtio_get_queue_max(vdev)) {
>          error_setg(errp, "Invalid number of queues (= %" PRIu32 "), "
>                     "must be a postive integer less than %d.",
> -                   n->max_queues, (VIRTIO_PCI_QUEUE_MAX - 1) / 2);
> +                   n->max_queues, (virtio_get_queue_max(vdev) - 1) / 2);
>          virtio_cleanup(vdev);
>          return;
>      }
> diff --git a/hw/s390x/s390-virtio-bus.c b/hw/s390x/s390-virtio-bus.c
> index 39dc201..d48590a 100644
> --- a/hw/s390x/s390-virtio-bus.c
> +++ b/hw/s390x/s390-virtio-bus.c
> @@ -707,6 +707,7 @@ static void virtio_s390_bus_class_init(ObjectClass *klass, void *data)
>      bus_class->max_dev = 1;
>      k->notify = virtio_s390_notify;
>      k->get_features = virtio_s390_get_features;
> +    k->queue_max = VIRTIO_PCI_QUEUE_MAX;
>  }
>  
>  static const TypeInfo virtio_s390_bus_info = {
> diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
> index ea236c9..4874622 100644
> --- a/hw/s390x/virtio-ccw.c
> +++ b/hw/s390x/virtio-ccw.c
> @@ -1695,6 +1695,7 @@ static void virtio_ccw_bus_class_init(ObjectClass *klass, void *data)
>      k->load_queue = virtio_ccw_load_queue;
>      k->save_config = virtio_ccw_save_config;
>      k->load_config = virtio_ccw_load_config;
> +    k->queue_max = VIRTIO_PCI_QUEUE_MAX;
>  }
>  
>  static const TypeInfo virtio_ccw_bus_info = {
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 9e2c718..91d49f1 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -822,10 +822,10 @@ void virtio_scsi_common_realize(DeviceState *dev, Error **errp,
>                  sizeof(VirtIOSCSIConfig));
>  
>      if (s->conf.num_queues == 0 ||
> -            s->conf.num_queues > VIRTIO_PCI_QUEUE_MAX - 2) {
> +            s->conf.num_queues > virtio_get_queue_max(vdev) - 2) {
>          error_setg(errp, "Invalid number of queues (= %" PRIu32 "), "
>                           "must be a positive integer less than %d.",
> -                   s->conf.num_queues, VIRTIO_PCI_QUEUE_MAX - 2);
> +                   s->conf.num_queues, virtio_get_queue_max(vdev) - 2);
>          virtio_cleanup(vdev);
>          return;
>      }
> diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
> index 2450c13..ad03218 100644
> --- a/hw/virtio/virtio-mmio.c
> +++ b/hw/virtio/virtio-mmio.c
> @@ -403,6 +403,7 @@ static void virtio_mmio_bus_class_init(ObjectClass *klass, void *data)
>      k->device_plugged = virtio_mmio_device_plugged;
>      k->has_variable_vring_alignment = true;
>      bus_class->max_dev = 1;
> +    k->queue_max = VIRTIO_PCI_QUEUE_MAX;
>  }
>  
>  static const TypeInfo virtio_mmio_bus_info = {
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index dde1d73..7fa8141 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -1559,6 +1559,7 @@ static void virtio_pci_bus_class_init(ObjectClass *klass, void *data)
>      k->vmstate_change = virtio_pci_vmstate_change;
>      k->device_plugged = virtio_pci_device_plugged;
>      k->device_unplugged = virtio_pci_device_unplugged;
> +    k->queue_max = VIRTIO_PCI_QUEUE_MAX;
>  }
>  
>  static const TypeInfo virtio_pci_bus_info = {
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index ffc22e8..5a806b5 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -541,6 +541,14 @@ void virtio_update_irq(VirtIODevice *vdev)
>      virtio_notify_vector(vdev, VIRTIO_NO_VECTOR);
>  }
>  
> +int virtio_get_queue_max(VirtIODevice *vdev)
> +{
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> +
> +    return k->queue_max;
> +}
> +
>  void virtio_set_status(VirtIODevice *vdev, uint8_t val)
>  {
>      VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
> @@ -576,6 +584,8 @@ static enum virtio_device_endian virtio_current_cpu_endian(void)
>  void virtio_reset(void *opaque)
>  {
>      VirtIODevice *vdev = opaque;
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *bk = VIRTIO_BUS_GET_CLASS(qbus);
>      VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
>      int i;
>  
> @@ -599,7 +609,7 @@ void virtio_reset(void *opaque)
>      vdev->config_vector = VIRTIO_NO_VECTOR;
>      virtio_notify_vector(vdev, vdev->config_vector);
>  
> -    for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
> +    for(i = 0; i < bk->queue_max; i++) {
>          vdev->vq[i].vring.desc = 0;
>          vdev->vq[i].vring.avail = 0;
>          vdev->vq[i].vring.used = 0;
> @@ -738,7 +748,10 @@ int virtio_queue_get_num(VirtIODevice *vdev, int n)
>  int virtio_queue_get_id(VirtQueue *vq)
>  {
>      VirtIODevice *vdev = vq->vdev;
> -    assert(vq >= &vdev->vq[0] && vq < &vdev->vq[VIRTIO_PCI_QUEUE_MAX]);
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> +
> +    assert(vq >= &vdev->vq[0] && vq < &vdev->vq[k->queue_max]);
>      return vq - &vdev->vq[0];
>  }
>  
> @@ -777,27 +790,35 @@ void virtio_queue_notify(VirtIODevice *vdev, int n)
>  
>  uint16_t virtio_queue_vector(VirtIODevice *vdev, int n)
>  {
> -    return n < VIRTIO_PCI_QUEUE_MAX ? vdev->vq[n].vector :
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> +
> +    return n < k->queue_max ? vdev->vq[n].vector :
>          VIRTIO_NO_VECTOR;
>  }
>  
>  void virtio_queue_set_vector(VirtIODevice *vdev, int n, uint16_t vector)
>  {
> -    if (n < VIRTIO_PCI_QUEUE_MAX)
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> +
> +    if (n < k->queue_max)
>          vdev->vq[n].vector = vector;
>  }
>  
>  VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
>                              void (*handle_output)(VirtIODevice *, VirtQueue *))
>  {
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
>      int i;
>  
> -    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
> +    for (i = 0; i < k->queue_max; i++) {
>          if (vdev->vq[i].vring.num == 0)
>              break;
>      }
>  
> -    if (i == VIRTIO_PCI_QUEUE_MAX || queue_size > VIRTQUEUE_MAX_SIZE)
> +    if (i == k->queue_max || queue_size > VIRTQUEUE_MAX_SIZE)
>          abort();
>  
>      vdev->vq[i].vring.num = queue_size;
> @@ -809,7 +830,10 @@ VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
>  
>  void virtio_del_queue(VirtIODevice *vdev, int n)
>  {
> -    if (n < 0 || n >= VIRTIO_PCI_QUEUE_MAX) {
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
> +
> +    if (n < 0 || n >= k->queue_max) {
>          abort();
>      }
>  
> @@ -932,14 +956,14 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)
>      qemu_put_be32(f, vdev->config_len);
>      qemu_put_buffer(f, vdev->config, vdev->config_len);
>  
> -    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
> +    for (i = 0; i < k->queue_max; i++) {
>          if (vdev->vq[i].vring.num == 0)
>              break;
>      }
>  
>      qemu_put_be32(f, i);
>  
> -    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
> +    for (i = 0; i < k->queue_max; i++) {
>          if (vdev->vq[i].vring.num == 0)
>              break;
>  
> @@ -1004,7 +1028,7 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
>      qemu_get_8s(f, &vdev->status);
>      qemu_get_8s(f, &vdev->isr);
>      qemu_get_be16s(f, &vdev->queue_sel);
> -    if (vdev->queue_sel >= VIRTIO_PCI_QUEUE_MAX) {
> +    if (vdev->queue_sel >= k->queue_max) {
>          return -1;
>      }
>      qemu_get_be32s(f, &features);
> @@ -1031,7 +1055,7 @@ int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id)
>  
>      num = qemu_get_be32(f);
>  
> -    if (num > VIRTIO_PCI_QUEUE_MAX) {
> +    if (num > k->queue_max) {
>          error_report("Invalid number of PCI queues: 0x%x", num);
>          return -1;
>      }
> @@ -1141,15 +1165,17 @@ void virtio_instance_init_common(Object *proxy_obj, void *data,
>  void virtio_init(VirtIODevice *vdev, const char *name,
>                   uint16_t device_id, size_t config_size)
>  {
> +    BusState *qbus = qdev_get_parent_bus(DEVICE(vdev));
> +    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
>      int i;
>      vdev->device_id = device_id;
>      vdev->status = 0;
>      vdev->isr = 0;
>      vdev->queue_sel = 0;
>      vdev->config_vector = VIRTIO_NO_VECTOR;
> -    vdev->vq = g_malloc0(sizeof(VirtQueue) * VIRTIO_PCI_QUEUE_MAX);
> +    vdev->vq = g_malloc0(sizeof(VirtQueue) * k->queue_max);
>      vdev->vm_running = runstate_is_running();
> -    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
> +    for (i = 0; i < k->queue_max; i++) {
>          vdev->vq[i].vector = VIRTIO_NO_VECTOR;
>          vdev->vq[i].vdev = vdev;
>          vdev->vq[i].queue_index = i;
> diff --git a/include/hw/virtio/virtio-bus.h b/include/hw/virtio/virtio-bus.h
> index 0756545..979835c 100644
> --- a/include/hw/virtio/virtio-bus.h
> +++ b/include/hw/virtio/virtio-bus.h
> @@ -68,6 +68,7 @@ typedef struct VirtioBusClass {
>       * Note that changing this will break migration for this transport.
>       */
>      bool has_variable_vring_alignment;
> +    uint16_t queue_max;
>  } VirtioBusClass;
>  
>  struct VirtioBusState {
> diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
> index f24997d..9fe0d92 100644
> --- a/include/hw/virtio/virtio.h
> +++ b/include/hw/virtio/virtio.h
> @@ -223,6 +223,7 @@ void virtio_queue_notify(VirtIODevice *vdev, int n);
>  uint16_t virtio_queue_vector(VirtIODevice *vdev, int n);
>  void virtio_queue_set_vector(VirtIODevice *vdev, int n, uint16_t vector);
>  void virtio_set_status(VirtIODevice *vdev, uint8_t val);
> +int virtio_get_queue_max(VirtIODevice *vdev);
>  void virtio_reset(void *opaque);
>  void virtio_update_irq(VirtIODevice *vdev);
>  int virtio_set_features(VirtIODevice *vdev, uint32_t val);
> -- 
> 1.9.1

  reply	other threads:[~2015-02-26 10:19 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-26  7:04 [Qemu-devel] [PATCH V2 00/11] Support more virtio queues Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 01/11] virtio-net: validate backend queue numbers against bus limitation Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 02/11] virtio-net: fix the upper bound when trying to delete queues Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 03/11] virito: introduce bus specific queue limit Jason Wang
2015-02-26 10:19   ` Michael S. Tsirkin [this message]
2015-02-27  3:04     ` Jason Wang
2015-02-26 12:57   ` Cornelia Huck
2015-02-27  3:34     ` Jason Wang
2015-02-27  9:34       ` Cornelia Huck
2015-02-28  3:17         ` Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 04/11] virtio-ccw: introduce ccw " Jason Wang
2015-02-26 13:02   ` Cornelia Huck
2015-02-27  3:38     ` Jason Wang
2015-02-27  9:41       ` Cornelia Huck
2015-02-28  3:30         ` Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 05/11] virtio-serial-bus: switch to bus " Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 06/11] virtio-s390: " Jason Wang
2015-02-26 13:05   ` Cornelia Huck
2015-02-27  6:34     ` Jason Wang
2015-02-27  9:49       ` Cornelia Huck
2015-02-28  3:31         ` Jason Wang
2015-03-02  8:51           ` Cornelia Huck
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 07/11] virtio-mmio: " Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 08/11] virtio-pci: switch to use " Jason Wang
2015-02-26 10:20   ` Michael S. Tsirkin
2015-02-27  3:18     ` Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 09/11] virtio-pci: increase the maximum number of virtqueues to 513 Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 10/11] pci: remove hard-coded bar size in msix_init_exclusive_bar() Jason Wang
2015-02-26  7:04 ` [Qemu-devel] [PATCH V2 11/11] virtio-pci: introduce auto_msix_bar_size property Jason Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150226101906.GA24889@redhat.com \
    --to=mst@redhat.com \
    --cc=agraf@suse.de \
    --cc=aliguori@amazon.com \
    --cc=borntraeger@de.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=jasowang@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.