From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Amit Shah <amit.shah@redhat.com>,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org
Subject: Re: [RFC PATCH] virtio_console: link vq to port with a private pointer in struct virtqueue
Date: Wed, 18 Apr 2012 17:21:47 +0300 [thread overview]
Message-ID: <20120418142146.GB11801@redhat.com> (raw)
In-Reply-To: <1334756013-11752-1-git-send-email-pbonzini@redhat.com>
On Wed, Apr 18, 2012 at 03:33:33PM +0200, Paolo Bonzini wrote:
> For virtio-scsi multiqueue support I would like to have an easy and
> fast way to go from a virtqueue to the internal struct for that
> queue.
>
> It turns out that virtio-serial has the same need, but it gets
> by with a simple list walk.
>
> This patch adds a pointer to struct virtqueue that is reserved for
> the virtio device, and uses it in virtio-serial.
>
> Cc: Amit Shah <amit.shah@redhat.com>
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> Untested; what do you think? Would this patch be acceptable
> as is, or only with a more pressing need in virtio-scsi, or never?
>
> drivers/char/virtio_console.c | 16 +++++-----------
> include/linux/virtio.h | 2 ++
> 2 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
> index 1c74734..cfc7a63 100644
> --- a/drivers/char/virtio_console.c
> +++ b/drivers/char/virtio_console.c
> @@ -297,17 +297,7 @@ out:
> static struct port *find_port_by_vq(struct ports_device *portdev,
> struct virtqueue *vq)
> {
> - struct port *port;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&portdev->ports_lock, flags);
> - list_for_each_entry(port, &portdev->ports, list)
> - if (port->in_vq == vq || port->out_vq == vq)
> - goto out;
> - port = NULL;
> -out:
> - spin_unlock_irqrestore(&portdev->ports_lock, flags);
> - return port;
> + return vq->vdev_priv;
> }
>
> static bool is_console_port(struct port *port)
> @@ -1159,6 +1149,8 @@ static int add_port(struct ports_device *portdev, u32 id)
>
> port->in_vq = portdev->in_vqs[port->id];
> port->out_vq = portdev->out_vqs[port->id];
> + port->in_vq->vdev_priv = port;
> + port->out_vq->vdev_priv = port;
>
> port->cdev = cdev_alloc();
> if (!port->cdev) {
> @@ -1872,6 +1864,8 @@ static int virtcons_restore(struct virtio_device *vdev)
> list_for_each_entry(port, &portdev->ports, list) {
> port->in_vq = portdev->in_vqs[port->id];
> port->out_vq = portdev->out_vqs[port->id];
> + port->in_vq->vdev_priv = port;
> + port->out_vq->vdev_priv = port;
>
> fill_queue(port->in_vq, &port->inbuf_lock);
>
Let's add an API to set this pointer.
Document that you must not set it after
probe/restore returned.
With an API we can actually have a BUG_ON that checks it's not modified
after probe.
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index c193ccf..6b39c1a 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -14,6 +14,7 @@
> * @callback: the function to call when buffers are consumed (can be NULL).
> * @name: the name of this virtqueue (mainly for debugging)
> * @vdev: the virtio device this queue was created for.
> + * @vdev_priv: a pointer for the virtio device to use.
It's for the driver actually.
> * @priv: a pointer for the virtqueue implementation to use.
> */
> struct virtqueue {
> @@ -21,6 +22,7 @@ struct virtqueue {
> void (*callback)(struct virtqueue *vq);
> const char *name;
> struct virtio_device *vdev;
> + void *vdev_priv;
> void *priv;
The name is confusing: it seems to imply it's a device pointer.
Maybe we should rename priv to something like __priv and make
priv useful for devices?
> };
>
> --
> 1.7.9.3
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Amit Shah <amit.shah@redhat.com>,
Rusty Russell <rusty@rustcorp.com.au>
Subject: Re: [RFC PATCH] virtio_console: link vq to port with a private pointer in struct virtqueue
Date: Wed, 18 Apr 2012 17:21:47 +0300 [thread overview]
Message-ID: <20120418142146.GB11801@redhat.com> (raw)
In-Reply-To: <1334756013-11752-1-git-send-email-pbonzini@redhat.com>
On Wed, Apr 18, 2012 at 03:33:33PM +0200, Paolo Bonzini wrote:
> For virtio-scsi multiqueue support I would like to have an easy and
> fast way to go from a virtqueue to the internal struct for that
> queue.
>
> It turns out that virtio-serial has the same need, but it gets
> by with a simple list walk.
>
> This patch adds a pointer to struct virtqueue that is reserved for
> the virtio device, and uses it in virtio-serial.
>
> Cc: Amit Shah <amit.shah@redhat.com>
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: "Michael S. Tsirkin" <mst@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> Untested; what do you think? Would this patch be acceptable
> as is, or only with a more pressing need in virtio-scsi, or never?
>
> drivers/char/virtio_console.c | 16 +++++-----------
> include/linux/virtio.h | 2 ++
> 2 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
> index 1c74734..cfc7a63 100644
> --- a/drivers/char/virtio_console.c
> +++ b/drivers/char/virtio_console.c
> @@ -297,17 +297,7 @@ out:
> static struct port *find_port_by_vq(struct ports_device *portdev,
> struct virtqueue *vq)
> {
> - struct port *port;
> - unsigned long flags;
> -
> - spin_lock_irqsave(&portdev->ports_lock, flags);
> - list_for_each_entry(port, &portdev->ports, list)
> - if (port->in_vq == vq || port->out_vq == vq)
> - goto out;
> - port = NULL;
> -out:
> - spin_unlock_irqrestore(&portdev->ports_lock, flags);
> - return port;
> + return vq->vdev_priv;
> }
>
> static bool is_console_port(struct port *port)
> @@ -1159,6 +1149,8 @@ static int add_port(struct ports_device *portdev, u32 id)
>
> port->in_vq = portdev->in_vqs[port->id];
> port->out_vq = portdev->out_vqs[port->id];
> + port->in_vq->vdev_priv = port;
> + port->out_vq->vdev_priv = port;
>
> port->cdev = cdev_alloc();
> if (!port->cdev) {
> @@ -1872,6 +1864,8 @@ static int virtcons_restore(struct virtio_device *vdev)
> list_for_each_entry(port, &portdev->ports, list) {
> port->in_vq = portdev->in_vqs[port->id];
> port->out_vq = portdev->out_vqs[port->id];
> + port->in_vq->vdev_priv = port;
> + port->out_vq->vdev_priv = port;
>
> fill_queue(port->in_vq, &port->inbuf_lock);
>
Let's add an API to set this pointer.
Document that you must not set it after
probe/restore returned.
With an API we can actually have a BUG_ON that checks it's not modified
after probe.
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index c193ccf..6b39c1a 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -14,6 +14,7 @@
> * @callback: the function to call when buffers are consumed (can be NULL).
> * @name: the name of this virtqueue (mainly for debugging)
> * @vdev: the virtio device this queue was created for.
> + * @vdev_priv: a pointer for the virtio device to use.
It's for the driver actually.
> * @priv: a pointer for the virtqueue implementation to use.
> */
> struct virtqueue {
> @@ -21,6 +22,7 @@ struct virtqueue {
> void (*callback)(struct virtqueue *vq);
> const char *name;
> struct virtio_device *vdev;
> + void *vdev_priv;
> void *priv;
The name is confusing: it seems to imply it's a device pointer.
Maybe we should rename priv to something like __priv and make
priv useful for devices?
> };
>
> --
> 1.7.9.3
next prev parent reply other threads:[~2012-04-18 14:21 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-18 13:33 [RFC PATCH] virtio_console: link vq to port with a private pointer in struct virtqueue Paolo Bonzini
2012-04-18 13:33 ` Paolo Bonzini
2012-04-18 14:21 ` Michael S. Tsirkin [this message]
2012-04-18 14:21 ` Michael S. Tsirkin
2012-04-18 14:34 ` Paolo Bonzini
2012-04-18 14:34 ` Paolo Bonzini
2012-04-18 16:10 ` Michael S. Tsirkin
2012-04-18 16:10 ` Michael S. Tsirkin
2012-04-18 18:38 ` Paolo Bonzini
2012-04-18 18:38 ` Paolo Bonzini
2012-04-18 18:48 ` Michael S. Tsirkin
2012-04-18 18:48 ` Michael S. Tsirkin
2012-04-19 6:21 ` Amit Shah
2012-04-19 6:21 ` Amit Shah
2012-05-08 2:11 ` Rusty Russell
2012-05-08 2:11 ` Rusty Russell
2012-05-08 6:43 ` Paolo Bonzini
2012-05-08 6:43 ` Paolo Bonzini
2012-05-08 9:45 ` Paolo Bonzini
2012-05-08 9:45 ` Paolo Bonzini
2012-05-08 10:18 ` Michael S. Tsirkin
2012-05-08 10:18 ` Michael S. Tsirkin
2012-05-10 1:26 ` Rusty Russell
2012-05-10 1:26 ` Rusty Russell
2012-05-10 6:02 ` Michael S. Tsirkin
2012-05-10 6:02 ` Michael S. Tsirkin
2012-05-08 10:56 ` [PATCH untested] virtio: allocate extra memory before the ring ( was Re: [RFC PATCH] virtio_console: link vq to port with a private) " Michael S. Tsirkin
2012-05-08 10:56 ` Michael S. Tsirkin
2012-05-08 11:06 ` Paolo Bonzini
2012-05-08 11:06 ` Paolo Bonzini
2012-05-08 11:53 ` Michael S. Tsirkin
2012-05-08 11:53 ` Michael S. Tsirkin
2012-05-08 11:34 ` Michael S. Tsirkin
2012-05-08 11: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=20120418142146.GB11801@redhat.com \
--to=mst@redhat.com \
--cc=amit.shah@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--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 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.