diff mbox

[1/1] virtio: fix feature bit checks

Message ID 1418374906-16358-2-git-send-email-cornelia.huck@de.ibm.com
State New
Headers show

Commit Message

Cornelia Huck Dec. 12, 2014, 9:01 a.m. UTC
Several places check against the feature bit number instead of against
the feature bit. Fix them.

Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
---
 hw/scsi/virtio-scsi.c       | 2 +-
 hw/virtio/dataplane/vring.c | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

Comments

Michael S. Tsirkin Dec. 12, 2014, 9:08 a.m. UTC | #1
On Fri, Dec 12, 2014 at 10:01:46AM +0100, Cornelia Huck wrote:
> Several places check against the feature bit number instead of against
> the feature bit. Fix them.
> 
> Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>

Cc: stable?

> ---
>  hw/scsi/virtio-scsi.c       | 2 +-
>  hw/virtio/dataplane/vring.c | 4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index ef48550..a44c410 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -144,7 +144,7 @@ static int virtio_scsi_parse_req(VirtIOSCSIReq *req,
>       *
>       * TODO: always disable this workaround for virtio 1.0 devices.
>       */
> -    if ((vdev->guest_features & VIRTIO_F_ANY_LAYOUT) == 0) {
> +    if ((vdev->guest_features & (1 << VIRTIO_F_ANY_LAYOUT)) == 0) {
>          req_size = req->elem.out_sg[0].iov_len;
>          resp_size = req->elem.in_sg[0].iov_len;
>      }
> diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
> index 61f6d83..78c6f45 100644
> --- a/hw/virtio/dataplane/vring.c
> +++ b/hw/virtio/dataplane/vring.c
> @@ -133,12 +133,12 @@ bool vring_should_notify(VirtIODevice *vdev, Vring *vring)
>       * interrupts. */
>      smp_mb();
>  
> -    if ((vdev->guest_features & VIRTIO_F_NOTIFY_ON_EMPTY) &&
> +    if ((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) &&
>          unlikely(vring->vr.avail->idx == vring->last_avail_idx)) {
>          return true;
>      }
>  
> -    if (!(vdev->guest_features & VIRTIO_RING_F_EVENT_IDX)) {
> +    if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) {
>          return !(vring->vr.avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
>      }
>      old = vring->signalled_used;
> -- 
> 1.8.5.5
Cornelia Huck Dec. 12, 2014, 9:13 a.m. UTC | #2
On Fri, 12 Dec 2014 11:08:21 +0200
"Michael S. Tsirkin" <mst@redhat.com> wrote:

> On Fri, Dec 12, 2014 at 10:01:46AM +0100, Cornelia Huck wrote:
> > Several places check against the feature bit number instead of against
> > the feature bit. Fix them.
> > 
> > Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> 
> Cc: stable?

Hm, yeah. Can you add it?

> 
> > ---
> >  hw/scsi/virtio-scsi.c       | 2 +-
> >  hw/virtio/dataplane/vring.c | 4 ++--
> >  2 files changed, 3 insertions(+), 3 deletions(-)
Fam Zheng Dec. 15, 2014, 4:44 a.m. UTC | #3
On Fri, 12/12 10:13, Cornelia Huck wrote:
> On Fri, 12 Dec 2014 11:08:21 +0200
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > On Fri, Dec 12, 2014 at 10:01:46AM +0100, Cornelia Huck wrote:
> > > Several places check against the feature bit number instead of against
> > > the feature bit. Fix them.
> > > 
> > > Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> > > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> > 
> > Cc: stable?
> 
> Hm, yeah. Can you add it?

Ccing qemu-stable@nongnu.org

Fam
Thomas Huth Jan. 21, 2015, 12:07 p.m. UTC | #4
On Fri, 12 Dec 2014 10:01:46 +0100
Cornelia Huck <cornelia.huck@de.ibm.com> wrote:

> Several places check against the feature bit number instead of against
> the feature bit. Fix them.
> 
> Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> ---
>  hw/scsi/virtio-scsi.c       | 2 +-
>  hw/virtio/dataplane/vring.c | 4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index ef48550..a44c410 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -144,7 +144,7 @@ static int virtio_scsi_parse_req(VirtIOSCSIReq *req,
>       *
>       * TODO: always disable this workaround for virtio 1.0 devices.
>       */
> -    if ((vdev->guest_features & VIRTIO_F_ANY_LAYOUT) == 0) {
> +    if ((vdev->guest_features & (1 << VIRTIO_F_ANY_LAYOUT)) == 0) {
>          req_size = req->elem.out_sg[0].iov_len;
>          resp_size = req->elem.in_sg[0].iov_len;
>      }
> diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
> index 61f6d83..78c6f45 100644
> --- a/hw/virtio/dataplane/vring.c
> +++ b/hw/virtio/dataplane/vring.c
> @@ -133,12 +133,12 @@ bool vring_should_notify(VirtIODevice *vdev, Vring *vring)
>       * interrupts. */
>      smp_mb();
> 
> -    if ((vdev->guest_features & VIRTIO_F_NOTIFY_ON_EMPTY) &&
> +    if ((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) &&
>          unlikely(vring->vr.avail->idx == vring->last_avail_idx)) {
>          return true;
>      }
> 
> -    if (!(vdev->guest_features & VIRTIO_RING_F_EVENT_IDX)) {
> +    if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) {
>          return !(vring->vr.avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
>      }
>      old = vring->signalled_used;

Ping ... somebody taking care of this? It's a bug fix for current
code, so IMHO this patch should not wait for the inclusion of the
other virtio-1 stuff...

 Thomas
Michael S. Tsirkin Jan. 21, 2015, 2:05 p.m. UTC | #5
On Wed, Jan 21, 2015 at 01:07:59PM +0100, Thomas Huth wrote:
> On Fri, 12 Dec 2014 10:01:46 +0100
> Cornelia Huck <cornelia.huck@de.ibm.com> wrote:
> 
> > Several places check against the feature bit number instead of against
> > the feature bit. Fix them.
> > 
> > Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> > Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
> > ---
> >  hw/scsi/virtio-scsi.c       | 2 +-
> >  hw/virtio/dataplane/vring.c | 4 ++--
> >  2 files changed, 3 insertions(+), 3 deletions(-)
> > 
> > diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> > index ef48550..a44c410 100644
> > --- a/hw/scsi/virtio-scsi.c
> > +++ b/hw/scsi/virtio-scsi.c
> > @@ -144,7 +144,7 @@ static int virtio_scsi_parse_req(VirtIOSCSIReq *req,
> >       *
> >       * TODO: always disable this workaround for virtio 1.0 devices.
> >       */
> > -    if ((vdev->guest_features & VIRTIO_F_ANY_LAYOUT) == 0) {
> > +    if ((vdev->guest_features & (1 << VIRTIO_F_ANY_LAYOUT)) == 0) {
> >          req_size = req->elem.out_sg[0].iov_len;
> >          resp_size = req->elem.in_sg[0].iov_len;
> >      }
> > diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
> > index 61f6d83..78c6f45 100644
> > --- a/hw/virtio/dataplane/vring.c
> > +++ b/hw/virtio/dataplane/vring.c
> > @@ -133,12 +133,12 @@ bool vring_should_notify(VirtIODevice *vdev, Vring *vring)
> >       * interrupts. */
> >      smp_mb();
> > 
> > -    if ((vdev->guest_features & VIRTIO_F_NOTIFY_ON_EMPTY) &&
> > +    if ((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) &&
> >          unlikely(vring->vr.avail->idx == vring->last_avail_idx)) {
> >          return true;
> >      }
> > 
> > -    if (!(vdev->guest_features & VIRTIO_RING_F_EVENT_IDX)) {
> > +    if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) {
> >          return !(vring->vr.avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
> >      }
> >      old = vring->signalled_used;
> 
> Ping ... somebody taking care of this? It's a bug fix for current
> code, so IMHO this patch should not wait for the inclusion of the
> other virtio-1 stuff...
> 
>  Thomas

It's in my queue.
diff mbox

Patch

diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index ef48550..a44c410 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -144,7 +144,7 @@  static int virtio_scsi_parse_req(VirtIOSCSIReq *req,
      *
      * TODO: always disable this workaround for virtio 1.0 devices.
      */
-    if ((vdev->guest_features & VIRTIO_F_ANY_LAYOUT) == 0) {
+    if ((vdev->guest_features & (1 << VIRTIO_F_ANY_LAYOUT)) == 0) {
         req_size = req->elem.out_sg[0].iov_len;
         resp_size = req->elem.in_sg[0].iov_len;
     }
diff --git a/hw/virtio/dataplane/vring.c b/hw/virtio/dataplane/vring.c
index 61f6d83..78c6f45 100644
--- a/hw/virtio/dataplane/vring.c
+++ b/hw/virtio/dataplane/vring.c
@@ -133,12 +133,12 @@  bool vring_should_notify(VirtIODevice *vdev, Vring *vring)
      * interrupts. */
     smp_mb();
 
-    if ((vdev->guest_features & VIRTIO_F_NOTIFY_ON_EMPTY) &&
+    if ((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) &&
         unlikely(vring->vr.avail->idx == vring->last_avail_idx)) {
         return true;
     }
 
-    if (!(vdev->guest_features & VIRTIO_RING_F_EVENT_IDX)) {
+    if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) {
         return !(vring->vr.avail->flags & VRING_AVAIL_F_NO_INTERRUPT);
     }
     old = vring->signalled_used;