From: Rusty Russell <rusty@rustcorp.com.au>
To: "Michael S. Tsirkin" <mst@redhat.com>,
virtualization@lists.linux-foundation.org, kvm@vger.kernel.org
Cc: David Howells <dhowells@redhat.com>,
Dave Jones <davej@redhat.com>,
"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] virtio_pci: fix capability format, comments
Date: Thu, 30 May 2013 11:03:38 +0930 [thread overview]
Message-ID: <8738t5metp.fsf@rustcorp.com.au> (raw)
In-Reply-To: <20130528080816.GA23399@redhat.com>
"Michael S. Tsirkin" <mst@redhat.com> writes:
> - queue size can actually be 0 which is not a power of 2
Actually, that points to a flaw in the code. When we shut down the
queue, we should ideally reset it to what the device started with,
rather than 0.
See below.
> - fix capability format. PCI spec says:
> The layout of the information is vendor specific, except that the byte
> immediately following the “Next” pointer in the capability structure is
> defined to be a length field.
> This length field provides the number of bytes in the capability
> structure (including the ID and Next pointer bytes).
That part's definitely correct: applied.
Thanks,
Rusty.
Subjet: virtio_pci: save the desired ringsize.
MST points out that 0 isn't a power of 2. This means we can't re-open
a virtio device once we write 0 into the queue length.
We should restore the amount the device originally asked for.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
diff --git a/drivers/virtio/virtio_pci-common.h b/drivers/virtio/virtio_pci-common.h
index ba1bf81..0e3143b 100644
--- a/drivers/virtio/virtio_pci-common.h
+++ b/drivers/virtio/virtio_pci-common.h
@@ -82,6 +82,9 @@ struct virtio_pci_vq_info {
/* MSI-X vector (or none) */
unsigned msix_vector;
+
+ /* What size did the device *want* this to be? */
+ u16 desired_num;
};
/* the notify function used when creating a virt queue */
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
index 0f0e3a6..8b35c2e 100644
--- a/drivers/virtio/virtio_pci.c
+++ b/drivers/virtio/virtio_pci.c
@@ -230,6 +230,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
return ERR_PTR(-ENOMEM);
info->msix_vector = msix_vec;
+ info->desired_num = num;
/* get offset of notification word for this vq (shouldn't wrap) */
off = ioread16(&vp_dev->common->queue_notify_off);
@@ -350,7 +351,7 @@ static void del_vq(struct virtqueue *vq)
vring_del_virtqueue(vq);
/* This is for our own benefit, not the device's! */
- iowrite16(0, &vp_dev->common->queue_size);
+ iowrite16(info->desired_num, &vp_dev->common->queue_size);
iowrite64_twopart(0, &vp_dev->common->queue_desc);
iowrite64_twopart(0, &vp_dev->common->queue_avail);
iowrite64_twopart(0, &vp_dev->common->queue_used);
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
WARNING: multiple messages have this Message-ID (diff)
From: Rusty Russell <rusty@rustcorp.com.au>
To: "Michael S. Tsirkin" <mst@redhat.com>,
virtualization@lists.linux-foundation.org, kvm@vger.kernel.org
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
David Howells <dhowells@redhat.com>,
Dave Jones <davej@redhat.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] virtio_pci: fix capability format, comments
Date: Thu, 30 May 2013 11:03:38 +0930 [thread overview]
Message-ID: <8738t5metp.fsf@rustcorp.com.au> (raw)
In-Reply-To: <20130528080816.GA23399@redhat.com>
"Michael S. Tsirkin" <mst@redhat.com> writes:
> - queue size can actually be 0 which is not a power of 2
Actually, that points to a flaw in the code. When we shut down the
queue, we should ideally reset it to what the device started with,
rather than 0.
See below.
> - fix capability format. PCI spec says:
> The layout of the information is vendor specific, except that the byte
> immediately following the “Next” pointer in the capability structure is
> defined to be a length field.
> This length field provides the number of bytes in the capability
> structure (including the ID and Next pointer bytes).
That part's definitely correct: applied.
Thanks,
Rusty.
Subjet: virtio_pci: save the desired ringsize.
MST points out that 0 isn't a power of 2. This means we can't re-open
a virtio device once we write 0 into the queue length.
We should restore the amount the device originally asked for.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
diff --git a/drivers/virtio/virtio_pci-common.h b/drivers/virtio/virtio_pci-common.h
index ba1bf81..0e3143b 100644
--- a/drivers/virtio/virtio_pci-common.h
+++ b/drivers/virtio/virtio_pci-common.h
@@ -82,6 +82,9 @@ struct virtio_pci_vq_info {
/* MSI-X vector (or none) */
unsigned msix_vector;
+
+ /* What size did the device *want* this to be? */
+ u16 desired_num;
};
/* the notify function used when creating a virt queue */
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
index 0f0e3a6..8b35c2e 100644
--- a/drivers/virtio/virtio_pci.c
+++ b/drivers/virtio/virtio_pci.c
@@ -230,6 +230,7 @@ static struct virtqueue *setup_vq(struct virtio_pci_device *vp_dev,
return ERR_PTR(-ENOMEM);
info->msix_vector = msix_vec;
+ info->desired_num = num;
/* get offset of notification word for this vq (shouldn't wrap) */
off = ioread16(&vp_dev->common->queue_notify_off);
@@ -350,7 +351,7 @@ static void del_vq(struct virtqueue *vq)
vring_del_virtqueue(vq);
/* This is for our own benefit, not the device's! */
- iowrite16(0, &vp_dev->common->queue_size);
+ iowrite16(info->desired_num, &vp_dev->common->queue_size);
iowrite64_twopart(0, &vp_dev->common->queue_desc);
iowrite64_twopart(0, &vp_dev->common->queue_avail);
iowrite64_twopart(0, &vp_dev->common->queue_used);
next prev parent reply other threads:[~2013-05-30 1:33 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-28 8:08 [PATCH] virtio_pci: fix capability format, comments Michael S. Tsirkin
2013-05-28 8:08 ` Michael S. Tsirkin
2013-05-30 1:33 ` Rusty Russell [this message]
2013-05-30 1:33 ` Rusty Russell
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=8738t5metp.fsf@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=davej@redhat.com \
--cc=dhowells@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=paulmck@linux.vnet.ibm.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.