All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: qemu-devel@nongnu.org, Alexander Graf <agraf@suse.de>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH V7 08/16] virtio: introduce bus specific	queue limit
Date: Tue, 28 Apr 2015 11:14:04 +0800	[thread overview]
Message-ID: <1430190844.9163.3@smtp.corp.redhat.com> (raw)
In-Reply-To: <20150427130441-mutt-send-email-mst@redhat.com>



On Mon, Apr 27, 2015 at 7:05 PM, Michael S. Tsirkin <mst@redhat.com> 
wrote:
> On Thu, Apr 23, 2015 at 02:21:41PM +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.
>>  
>>  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>
>>  Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> 
> Is this still needed if you drop the attempt to
> keep the limit around for old machine types?

If we agree to drop, we probably need transport specific macro.

> 
> 
>>  ---
>>   hw/char/virtio-serial-bus.c    |  2 +-
>>   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             | 40 
>> +++++++++++++++++++++++++---------------
>>   include/hw/virtio/virtio-bus.h |  1 +
>>   include/hw/virtio/virtio.h     |  1 +
>>   10 files changed, 36 insertions(+), 20 deletions(-)
>>  
>>  diff --git a/hw/char/virtio-serial-bus.c 
>> b/hw/char/virtio-serial-bus.c
>>  index e336bdb..0694831 100644
>>  --- a/hw/char/virtio-serial-bus.c
>>  +++ b/hw/char/virtio-serial-bus.c
>>  @@ -973,7 +973,7 @@ static void 
>> virtio_serial_device_realize(DeviceState *dev, Error **errp)
>>       }
>>   
>>       /* Each port takes 2 queues, and one pair is for the control 
>> queue */
>>  -    max_supported_ports = VIRTIO_PCI_QUEUE_MAX / 2 - 1;
>>  +    max_supported_ports = virtio_get_queue_max(vdev) / 2 - 1;
>>   
>>       if (vser->serial.max_virtserial_ports > max_supported_ports) {
>>           error_setg(errp, "maximum ports supported: %u", 
>> max_supported_ports);
>>  diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
>>  index b6fac9c..bf286f5 100644
>>  --- a/hw/net/virtio-net.c
>>  +++ b/hw/net/virtio-net.c
>>  @@ -1588,10 +1588,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 047c963..2b41e32 100644
>>  --- a/hw/s390x/s390-virtio-bus.c
>>  +++ b/hw/s390x/s390-virtio-bus.c
>>  @@ -715,6 +715,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 0434f56..590eed5 100644
>>  --- a/hw/s390x/virtio-ccw.c
>>  +++ b/hw/s390x/virtio-ccw.c
>>  @@ -1715,6 +1715,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 c9bea06..fbdde2b 100644
>>  --- a/hw/scsi/virtio-scsi.c
>>  +++ b/hw/scsi/virtio-scsi.c
>>  @@ -826,10 +826,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 10123f3..2ae6942 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 c7c3f72..075b13b 100644
>>  --- a/hw/virtio/virtio-pci.c
>>  +++ b/hw/virtio/virtio-pci.c
>>  @@ -1498,6 +1498,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 17c1260..bbb224f 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);
>>  @@ -599,7 +607,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 < virtio_get_queue_max(vdev); i++) {
>>           vdev->vq[i].vring.desc = 0;
>>           vdev->vq[i].vring.avail = 0;
>>           vdev->vq[i].vring.used = 0;
>>  @@ -738,7 +746,8 @@ 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]);
>>  +
>>  +    assert(vq >= &vdev->vq[0] && vq < 
>> &vdev->vq[virtio_get_queue_max(vdev)]);
>>       return vq - &vdev->vq[0];
>>   }
>>   
>>  @@ -774,28 +783,29 @@ 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 :
>>  +    return n < virtio_get_queue_max(vdev) ? 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)
>>  +    if (n < virtio_get_queue_max(vdev))
>>           vdev->vq[n].vector = vector;
>>   }
>>   
>>   VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
>>                               void (*handle_output)(VirtIODevice *, 
>> VirtQueue *))
>>   {
>>  -    int i;
>>  +    int i, queue_max = virtio_get_queue_max(vdev);
>>   
>>  -    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
>>  +    for (i = 0; i < queue_max; i++) {
>>           if (vdev->vq[i].vring.num == 0)
>>               break;
>>       }
>>   
>>  -    if (i == VIRTIO_PCI_QUEUE_MAX || queue_size > 
>> VIRTQUEUE_MAX_SIZE)
>>  +    if (i == queue_max || queue_size > VIRTQUEUE_MAX_SIZE) {
>>           abort();
>>  +    }
>>   
>>       vdev->vq[i].vring.num = queue_size;
>>       vdev->vq[i].vring.align = VIRTIO_PCI_VRING_ALIGN;
>>  @@ -806,7 +816,7 @@ 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) {
>>  +    if (n < 0 || n >= virtio_get_queue_max(vdev)) {
>>           abort();
>>       }
>>   
>>  @@ -916,14 +926,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;
>>   
>>  @@ -988,7 +998,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);
>>  @@ -1015,7 +1025,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;
>>       }
>>  @@ -1125,15 +1135,15 @@ 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)
>>   {
>>  -    int i;
>>  +    int i, queue_max = virtio_get_queue_max(vdev);
>>       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) * queue_max);
>>       vdev->vm_running = runstate_is_running();
>>  -    for (i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
>>  +    for (i = 0; i < 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 0d2e7b4..4da8022 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 d95f8b6..91fd673 100644
>>  --- a/include/hw/virtio/virtio.h
>>  +++ b/include/hw/virtio/virtio.h
>>  @@ -179,6 +179,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);
>>  -- 
>>  2.1.0
> 

  reply	other threads:[~2015-04-28  3:14 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-23  6:21 [Qemu-devel] [PATCH V7 00/16] Support more virtio queues Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 01/16] virtio-net: fix the upper bound when trying to delete queues Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 02/16] pc: add 2.4 machine types Jason Wang
2015-04-27 11:03   ` Michael S. Tsirkin
2015-04-28  3:12     ` Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 03/16] spapr: add machine type specific instance init function Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 04/16] ppc: spapr: add 2.4 machine type Jason Wang
2015-04-27 11:03   ` Michael S. Tsirkin
2015-04-27 13:14   ` Alexander Graf
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 05/16] monitor: replace the magic number 255 with MAX_QUEUE_NUM Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 06/16] monitor: check return value of qemu_find_net_clients_except() Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 07/16] virtio-ccw: using VIRTIO_NO_VECTOR instead of 0 for invalid virtqueue Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 08/16] virtio: introduce bus specific queue limit Jason Wang
2015-04-27 11:05   ` Michael S. Tsirkin
2015-04-28  3:14     ` Jason Wang [this message]
2015-04-28  5:13       ` Michael S. Tsirkin
2015-04-28  6:13         ` Jason Wang
2015-04-28  7:14           ` Michael S. Tsirkin
2015-04-28  8:04             ` Cornelia Huck
2015-04-28  8:16               ` Michael S. Tsirkin
2015-04-28 10:40                 ` Cornelia Huck
2015-04-28 10:55                   ` Michael S. Tsirkin
2015-04-28 11:39                     ` Cornelia Huck
2015-04-28 12:47                       ` Michael S. Tsirkin
2015-04-28 13:33                         ` Cornelia Huck
2015-04-28 14:40                           ` Michael S. Tsirkin
2015-05-13  7:51                             ` Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 09/16] virtio-ccw: introduce ccw " Jason Wang
2015-04-23 10:59   ` Cornelia Huck
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 10/16] virtio-s390: switch to bus " Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 11/16] virtio-mmio: " Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 12/16] virtio-pci: switch to use " Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 13/16] virtio: introduce vector to virtqueues mapping Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 14/16] virtio-pci: speedup MSI-X masking and unmasking Jason Wang
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 15/16] virtio-pci: increase the maximum number of virtqueues to 513 Jason Wang
2015-04-23 11:24   ` Cornelia Huck
2015-04-28  3:05     ` Jason Wang
2015-04-27 11:02   ` Michael S. Tsirkin
2015-04-28  3:12     ` Jason Wang
2015-04-28  7:17       ` Michael S. Tsirkin
2015-05-13  7:47         ` Jason Wang
2015-05-13  8:16           ` Michael S. Tsirkin
2015-05-14 18:54   ` Eduardo Habkost
2015-04-23  6:21 ` [Qemu-devel] [PATCH V7 16/16] pci: remove hard-coded bar size in msix_init_exclusive_bar() Jason Wang
2015-04-23 11:27 ` [Qemu-devel] [PATCH V7 00/16] Support more virtio queues Cornelia Huck
2015-04-28  3:14   ` Jason Wang
2015-04-27 19:06 ` Michael S. Tsirkin

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=1430190844.9163.3@smtp.corp.redhat.com \
    --to=jasowang@redhat.com \
    --cc=agraf@suse.de \
    --cc=borntraeger@de.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=mst@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.