From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Nicholas A. Bellinger" <nab@linux-iscsi.org>
Cc: target-devel <target-devel@vger.kernel.org>,
lf-virt <virtualization@lists.linux-foundation.org>,
kvm-devel <kvm@vger.kernel.org>,
qemu-devel <qemu-devel@nongnu.org>,
Stefan Hajnoczi <stefanha@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>, Asias He <asias@redhat.com>,
Anthony Liguori <aliguori@linux.vnet.ibm.com>
Subject: Re: [PATCH 2/3] virtio-pci: Add virtio_queue_valid checks ahead of virtio_queue_get_num
Date: Sun, 31 Mar 2013 10:37:27 +0300 [thread overview]
Message-ID: <20130331073727.GB23484@redhat.com> (raw)
In-Reply-To: <1364531592-8368-3-git-send-email-nab@linux-iscsi.org>
On Fri, Mar 29, 2013 at 04:33:11AM +0000, Nicholas A. Bellinger wrote:
> From: Nicholas Bellinger <nab@linux-iscsi.org>
>
> This patch adds a number of virtio_queue_valid() checks to virtio-pci
> ahead of virtio_queue_get_num() usage in order to skip operation upon
> the detection of an uninitialized VQ.
>
> There is one exception in virtio_ioport_read():VIRTIO_PCI_QUEUE_NUM,
> where virtio_queue_get_num() may still be called without a valid
> vdev->vq[n].vring.desc physical address.
>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Asias He <asias@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Makes sense. Minor nit: virtio_queue_valid calls virtio_queue_get_num
internally, so we can drop it everywhere we know queue is valid.
> ---
> hw/virtio-pci.c | 27 +++++++++++++++++++++++++++
> 1 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
> index 0d67b84..231ca0c 100644
> --- a/hw/virtio-pci.c
> +++ b/hw/virtio-pci.c
> @@ -211,6 +211,9 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
> }
>
> for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
> + if (!virtio_queue_valid(proxy->vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(proxy->vdev, n)) {
> continue;
> }
> @@ -225,6 +228,9 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
>
> assign_error:
> while (--n >= 0) {
> + if (!virtio_queue_valid(proxy->vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(proxy->vdev, n)) {
> continue;
> }
> @@ -246,6 +252,9 @@ static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
> }
>
> for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
> + if (!virtio_queue_valid(proxy->vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(proxy->vdev, n)) {
> continue;
> }
> @@ -546,6 +555,9 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs)
> MSIMessage msg;
>
> for (queue_no = 0; queue_no < nvqs; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -593,6 +605,9 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs)
> int queue_no;
>
> for (queue_no = 0; queue_no < nvqs; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -665,6 +680,9 @@ static int kvm_virtio_pci_vector_unmask(PCIDevice *dev, unsigned vector,
> int ret, queue_no;
>
> for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -695,6 +713,9 @@ static void kvm_virtio_pci_vector_mask(PCIDevice *dev, unsigned vector)
> int queue_no;
>
> for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -717,6 +738,9 @@ static void kvm_virtio_pci_vector_poll(PCIDevice *dev,
> VirtQueue *vq;
>
> for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -790,6 +814,9 @@ static int virtio_pci_set_guest_notifiers(DeviceState *d, int nvqs, bool assign)
> }
>
> for (n = 0; n < nvqs; n++) {
> + if (!virtio_queue_valid(vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, n)) {
> break;
> }
> --
> 1.7.2.5
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Nicholas A. Bellinger" <nab@linux-iscsi.org>
Cc: kvm-devel <kvm@vger.kernel.org>,
qemu-devel <qemu-devel@nongnu.org>,
lf-virt <virtualization@lists.linux-foundation.org>,
Anthony Liguori <aliguori@linux.vnet.ibm.com>,
target-devel <target-devel@vger.kernel.org>,
Stefan Hajnoczi <stefanha@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>, Asias He <asias@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 2/3] virtio-pci: Add virtio_queue_valid checks ahead of virtio_queue_get_num
Date: Sun, 31 Mar 2013 10:37:27 +0300 [thread overview]
Message-ID: <20130331073727.GB23484@redhat.com> (raw)
In-Reply-To: <1364531592-8368-3-git-send-email-nab@linux-iscsi.org>
On Fri, Mar 29, 2013 at 04:33:11AM +0000, Nicholas A. Bellinger wrote:
> From: Nicholas Bellinger <nab@linux-iscsi.org>
>
> This patch adds a number of virtio_queue_valid() checks to virtio-pci
> ahead of virtio_queue_get_num() usage in order to skip operation upon
> the detection of an uninitialized VQ.
>
> There is one exception in virtio_ioport_read():VIRTIO_PCI_QUEUE_NUM,
> where virtio_queue_get_num() may still be called without a valid
> vdev->vq[n].vring.desc physical address.
>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Asias He <asias@redhat.com>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Makes sense. Minor nit: virtio_queue_valid calls virtio_queue_get_num
internally, so we can drop it everywhere we know queue is valid.
> ---
> hw/virtio-pci.c | 27 +++++++++++++++++++++++++++
> 1 files changed, 27 insertions(+), 0 deletions(-)
>
> diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
> index 0d67b84..231ca0c 100644
> --- a/hw/virtio-pci.c
> +++ b/hw/virtio-pci.c
> @@ -211,6 +211,9 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
> }
>
> for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
> + if (!virtio_queue_valid(proxy->vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(proxy->vdev, n)) {
> continue;
> }
> @@ -225,6 +228,9 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
>
> assign_error:
> while (--n >= 0) {
> + if (!virtio_queue_valid(proxy->vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(proxy->vdev, n)) {
> continue;
> }
> @@ -246,6 +252,9 @@ static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
> }
>
> for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
> + if (!virtio_queue_valid(proxy->vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(proxy->vdev, n)) {
> continue;
> }
> @@ -546,6 +555,9 @@ static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs)
> MSIMessage msg;
>
> for (queue_no = 0; queue_no < nvqs; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -593,6 +605,9 @@ static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs)
> int queue_no;
>
> for (queue_no = 0; queue_no < nvqs; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -665,6 +680,9 @@ static int kvm_virtio_pci_vector_unmask(PCIDevice *dev, unsigned vector,
> int ret, queue_no;
>
> for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -695,6 +713,9 @@ static void kvm_virtio_pci_vector_mask(PCIDevice *dev, unsigned vector)
> int queue_no;
>
> for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -717,6 +738,9 @@ static void kvm_virtio_pci_vector_poll(PCIDevice *dev,
> VirtQueue *vq;
>
> for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
> + if (!virtio_queue_valid(vdev, queue_no)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, queue_no)) {
> break;
> }
> @@ -790,6 +814,9 @@ static int virtio_pci_set_guest_notifiers(DeviceState *d, int nvqs, bool assign)
> }
>
> for (n = 0; n < nvqs; n++) {
> + if (!virtio_queue_valid(vdev, n)) {
> + continue;
> + }
> if (!virtio_queue_get_num(vdev, n)) {
> break;
> }
> --
> 1.7.2.5
next prev parent reply other threads:[~2013-03-31 7:37 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-29 4:33 [PATCH 0/3] virtio/vhost: Add checks for uninitialized VQs Nicholas A. Bellinger
2013-03-29 4:33 ` [Qemu-devel] " Nicholas A. Bellinger
2013-03-29 4:33 ` [PATCH 1/3] virtio: add API to check that ring is setup Nicholas A. Bellinger
2013-03-29 4:33 ` [Qemu-devel] " Nicholas A. Bellinger
2013-03-29 4:33 ` Nicholas A. Bellinger
2013-03-29 4:33 ` [PATCH 2/3] virtio-pci: Add virtio_queue_valid checks ahead of virtio_queue_get_num Nicholas A. Bellinger
2013-03-29 4:33 ` [Qemu-devel] " Nicholas A. Bellinger
2013-03-31 7:37 ` Michael S. Tsirkin
2013-03-31 7:37 ` Michael S. Tsirkin [this message]
2013-03-31 7:37 ` [Qemu-devel] " Michael S. Tsirkin
2013-04-01 23:16 ` Nicholas A. Bellinger
2013-04-01 23:16 ` [Qemu-devel] " Nicholas A. Bellinger
2013-04-01 23:16 ` Nicholas A. Bellinger
2013-03-29 4:33 ` [PATCH 3/3] vhost: Check+skip uninitialized VQs in vhost_verify_ring_mappings Nicholas A. Bellinger
2013-03-29 4:33 ` [Qemu-devel] " Nicholas A. Bellinger
2013-03-31 7:45 ` Michael S. Tsirkin
2013-03-31 7:45 ` [Qemu-devel] " Michael S. Tsirkin
2013-04-01 23:49 ` Nicholas A. Bellinger
2013-04-01 23:49 ` Nicholas A. Bellinger
2013-04-01 23:49 ` [Qemu-devel] " Nicholas A. Bellinger
2013-03-29 4:33 ` Nicholas A. Bellinger
2013-03-31 7:46 ` [PATCH 0/3] virtio/vhost: Add checks for uninitialized VQs Michael S. Tsirkin
2013-03-31 7:46 ` Michael S. Tsirkin
2013-03-31 7:46 ` [Qemu-devel] " Michael S. Tsirkin
2013-04-01 23:51 ` Nicholas A. Bellinger
2013-04-01 23:51 ` [Qemu-devel] " Nicholas A. Bellinger
2013-04-01 23:51 ` Nicholas A. Bellinger
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=20130331073727.GB23484@redhat.com \
--to=mst@redhat.com \
--cc=aliguori@linux.vnet.ibm.com \
--cc=asias@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=nab@linux-iscsi.org \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=target-devel@vger.kernel.org \
--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.