From: "Michael S. Tsirkin" <mst@redhat.com>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: virtualization@lists.linux-foundation.org
Subject: Re: [PATCH 1/5] virtio: move queue_index and num_free fields into core struct virtqueue.
Date: Tue, 16 Oct 2012 15:53:22 +0200 [thread overview]
Message-ID: <20121016135322.GB12972@redhat.com> (raw)
In-Reply-To: <1350394252-23934-1-git-send-email-rusty@rustcorp.com.au>
On Wed, Oct 17, 2012 at 12:00:48AM +1030, Rusty Russell wrote:
> They're generic concepts, so hoist them. This also avoids accessor
> functions.
>
> This goes even further than Jason Wang's 17bb6d4088 patch
> ("virtio-ring: move queue_index to vring_virtqueue") which moved the
> queue_index from the specific transport.
>
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
> ---
> drivers/virtio/virtio_mmio.c | 4 ++--
> drivers/virtio/virtio_pci.c | 6 ++----
> drivers/virtio/virtio_ring.c | 34 +++++++++++-----------------------
> include/linux/virtio.h | 6 ++++--
> 4 files changed, 19 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
> index 6b1b7e1..5a0e1d3 100644
> --- a/drivers/virtio/virtio_mmio.c
> +++ b/drivers/virtio/virtio_mmio.c
> @@ -225,7 +225,7 @@ static void vm_notify(struct virtqueue *vq)
>
> /* We write the queue's selector into the notification register to
> * signal the other end */
> - writel(virtqueue_get_queue_index(vq), vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY);
> + writel(vq->index, vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY);
> }
>
> /* Notify all virtqueues on an interrupt. */
> @@ -266,7 +266,7 @@ static void vm_del_vq(struct virtqueue *vq)
> struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev);
> struct virtio_mmio_vq_info *info = vq->priv;
> unsigned long flags, size;
> - unsigned int index = virtqueue_get_queue_index(vq);
> + unsigned int index = vq->index;
>
> spin_lock_irqsave(&vm_dev->lock, flags);
> list_del(&info->node);
> diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
> index b59237c..e3ecc94 100644
> --- a/drivers/virtio/virtio_pci.c
> +++ b/drivers/virtio/virtio_pci.c
> @@ -203,8 +203,7 @@ static void vp_notify(struct virtqueue *vq)
>
> /* we write the queue's selector into the notification register to
> * signal the other end */
> - iowrite16(virtqueue_get_queue_index(vq),
> - vp_dev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY);
> + iowrite16(vq->index, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY);
> }
>
> /* Handle a configuration change: Tell driver if it wants to know. */
> @@ -479,8 +478,7 @@ static void vp_del_vq(struct virtqueue *vq)
> list_del(&info->node);
> spin_unlock_irqrestore(&vp_dev->lock, flags);
>
> - iowrite16(virtqueue_get_queue_index(vq),
> - vp_dev->ioaddr + VIRTIO_PCI_QUEUE_SEL);
> + iowrite16(vq->index, vp_dev->ioaddr + VIRTIO_PCI_QUEUE_SEL);
>
> if (vp_dev->msix_enabled) {
> iowrite16(VIRTIO_MSI_NO_VECTOR,
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index e639584..335dcec 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -93,8 +93,6 @@ struct vring_virtqueue
> /* Host publishes avail event idx */
> bool event;
>
> - /* Number of free buffers */
> - unsigned int num_free;
> /* Head of free buffer list. */
> unsigned int free_head;
> /* Number we've added since last sync. */
> @@ -106,9 +104,6 @@ struct vring_virtqueue
> /* How to notify other side. FIXME: commonalize hcalls! */
> void (*notify)(struct virtqueue *vq);
>
> - /* Index of the queue */
> - int queue_index;
> -
> #ifdef DEBUG
> /* They're supposed to lock for us. */
> unsigned int in_use;
> @@ -160,7 +155,7 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
> desc[i-1].next = 0;
>
> /* We're about to use a buffer */
> - vq->num_free--;
> + vq->vq.num_free--;
>
> /* Use a single buffer which doesn't continue */
> head = vq->free_head;
> @@ -174,13 +169,6 @@ static int vring_add_indirect(struct vring_virtqueue *vq,
> return head;
> }
>
> -int virtqueue_get_queue_index(struct virtqueue *_vq)
> -{
> - struct vring_virtqueue *vq = to_vvq(_vq);
> - return vq->queue_index;
> -}
> -EXPORT_SYMBOL_GPL(virtqueue_get_queue_index);
> -
> /**
> * virtqueue_add_buf - expose buffer to other end
> * @vq: the struct virtqueue we're talking about.
> @@ -228,7 +216,7 @@ int virtqueue_add_buf(struct virtqueue *_vq,
>
> /* If the host supports indirect descriptor tables, and we have multiple
> * buffers, then go indirect. FIXME: tune this threshold */
> - if (vq->indirect && (out + in) > 1 && vq->num_free) {
> + if (vq->indirect && (out + in) > 1 && vq->vq.num_free) {
> head = vring_add_indirect(vq, sg, out, in, gfp);
> if (likely(head >= 0))
> goto add_head;
> @@ -237,9 +225,9 @@ int virtqueue_add_buf(struct virtqueue *_vq,
> BUG_ON(out + in > vq->vring.num);
> BUG_ON(out + in == 0);
>
> - if (vq->num_free < out + in) {
> + if (vq->vq.num_free < out + in) {
> pr_debug("Can't add buf len %i - avail = %i\n",
> - out + in, vq->num_free);
> + out + in, vq->vq.num_free);
> /* FIXME: for historical reasons, we force a notify here if
> * there are outgoing parts to the buffer. Presumably the
> * host should service the ring ASAP. */
> @@ -250,7 +238,7 @@ int virtqueue_add_buf(struct virtqueue *_vq,
> }
>
> /* We're about to use some buffers from the free list. */
> - vq->num_free -= out + in;
> + vq->vq.num_free -= out + in;
>
> head = vq->free_head;
> for (i = vq->free_head; out; i = vq->vring.desc[i].next, out--) {
> @@ -296,7 +284,7 @@ add_head:
> pr_debug("Added buffer head %i to %p\n", head, vq);
> END_USE(vq);
>
> - return vq->num_free;
> + return vq->vq.num_free;
> }
> EXPORT_SYMBOL_GPL(virtqueue_add_buf);
>
> @@ -393,13 +381,13 @@ static void detach_buf(struct vring_virtqueue *vq, unsigned int head)
>
> while (vq->vring.desc[i].flags & VRING_DESC_F_NEXT) {
> i = vq->vring.desc[i].next;
> - vq->num_free++;
> + vq->vq.num_free++;
> }
>
> vq->vring.desc[i].next = vq->free_head;
> vq->free_head = head;
> /* Plus final descriptor */
> - vq->num_free++;
> + vq->vq.num_free++;
> }
>
> static inline bool more_used(const struct vring_virtqueue *vq)
> @@ -599,7 +587,7 @@ void *virtqueue_detach_unused_buf(struct virtqueue *_vq)
> return buf;
> }
> /* That should have freed everything. */
> - BUG_ON(vq->num_free != vq->vring.num);
> + BUG_ON(vq->vq.num_free != vq->vring.num);
>
> END_USE(vq);
> return NULL;
> @@ -653,12 +641,13 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
> vq->vq.callback = callback;
> vq->vq.vdev = vdev;
> vq->vq.name = name;
> + vq->vq.num_free = num;
> + vq->vq.index = index;
> vq->notify = notify;
> vq->weak_barriers = weak_barriers;
> vq->broken = false;
> vq->last_used_idx = 0;
> vq->num_added = 0;
> - vq->queue_index = index;
> list_add_tail(&vq->vq.list, &vdev->vqs);
> #ifdef DEBUG
> vq->in_use = false;
> @@ -673,7 +662,6 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
> vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT;
>
> /* Put everything in free lists. */
> - vq->num_free = num;
> vq->free_head = 0;
> for (i = 0; i < num-1; i++) {
> vq->vring.desc[i].next = i+1;
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index 533b115..ed4c437 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -16,12 +16,16 @@
> * @name: the name of this virtqueue (mainly for debugging)
> * @vdev: the virtio device this queue was created for.
> * @priv: a pointer for the virtqueue implementation to use.
> + * @index: the zero-based ordinal number for this queue.
> + * @num_free: number of buffers we expect to be able to fit.
Only it's not exactly buffers: a single buffer can use
multiple s/g entries, right?
Maybe clarify as 'linear buffers'?
> */
> struct virtqueue {
> struct list_head list;
> void (*callback)(struct virtqueue *vq);
> const char *name;
> struct virtio_device *vdev;
> + unsigned int index;
> + unsigned int num_free;
> void *priv;
> };
>
> @@ -50,8 +54,6 @@ void *virtqueue_detach_unused_buf(struct virtqueue *vq);
>
> unsigned int virtqueue_get_vring_size(struct virtqueue *vq);
>
> -int virtqueue_get_queue_index(struct virtqueue *vq);
> -
> /**
> * virtio_device - representation of a device using virtio
> * @index: unique position on the virtio bus
> --
> 1.7.9.5
next prev parent reply other threads:[~2012-10-16 13:53 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-16 13:30 [PATCH 1/5] virtio: move queue_index and num_free fields into core struct virtqueue Rusty Russell
2012-10-16 13:30 ` [PATCH 2/5] virtio-net: remove unused skb_vnet_hdr->num_sg field Rusty Russell
2012-10-16 13:30 ` [PATCH 3/5] virtio-net: correct capacity math on ring full Rusty Russell
2012-10-16 13:30 ` [PATCH 4/5] virtio_net: don't rely on virtqueue_add_buf() returning capacity Rusty Russell
2012-10-16 13:47 ` Michael S. Tsirkin
2012-10-16 13:30 ` [PATCH 5/5] virtio: make virtqueue_add_buf() returning 0 on success, not capacity Rusty Russell
2012-10-16 13:49 ` Rusty Russell
2012-10-16 13:53 ` Michael S. Tsirkin [this message]
2012-10-16 14:19 ` [PATCH 1/5] virtio: move queue_index and num_free fields into core struct virtqueue Rusty Russell
2012-10-16 14:34 ` 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=20121016135322.GB12972@redhat.com \
--to=mst@redhat.com \
--cc=rusty@rustcorp.com.au \
--cc=virtualization@lists.linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).