qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V2] virtio-pci: fix queue_enable write
@ 2020-06-10  5:43 Jason Wang
  2020-06-10  8:57 ` Stefano Garzarella
  2020-06-11  8:41 ` Stefan Hajnoczi
  0 siblings, 2 replies; 6+ messages in thread
From: Jason Wang @ 2020-06-10  5:43 UTC (permalink / raw)
  To: mst, qemu-devel; +Cc: Jason Wang, stefanha

Spec said: The driver uses this to selectively prevent the device from
executing requests from this virtqueue. 1 - enabled; 0 - disabled.

Though write 0 to queue_enable is forbidden by the spec, we should not
assume that the value is 1.

Fix this by ignore the write value other than 1.

Signed-off-by: Jason Wang <jasowang@redhat.com>
---
Changes from V1:
- fix typo
- warn wrong value through virtio_error
---
 hw/virtio/virtio-pci.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index d028c17c24..7bc8c1c056 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1273,16 +1273,20 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
         virtio_queue_set_vector(vdev, vdev->queue_sel, val);
         break;
     case VIRTIO_PCI_COMMON_Q_ENABLE:
-        virtio_queue_set_num(vdev, vdev->queue_sel,
-                             proxy->vqs[vdev->queue_sel].num);
-        virtio_queue_set_rings(vdev, vdev->queue_sel,
+        if (val == 1) {
+            virtio_queue_set_num(vdev, vdev->queue_sel,
+                                 proxy->vqs[vdev->queue_sel].num);
+            virtio_queue_set_rings(vdev, vdev->queue_sel,
                        ((uint64_t)proxy->vqs[vdev->queue_sel].desc[1]) << 32 |
                        proxy->vqs[vdev->queue_sel].desc[0],
                        ((uint64_t)proxy->vqs[vdev->queue_sel].avail[1]) << 32 |
                        proxy->vqs[vdev->queue_sel].avail[0],
                        ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 |
                        proxy->vqs[vdev->queue_sel].used[0]);
-        proxy->vqs[vdev->queue_sel].enabled = 1;
+            proxy->vqs[vdev->queue_sel].enabled = 1;
+        } else {
+            virtio_error(vdev, "wrong value for queue_enable %"PRIx64, val);
+        }
         break;
     case VIRTIO_PCI_COMMON_Q_DESCLO:
         proxy->vqs[vdev->queue_sel].desc[0] = val;
-- 
2.20.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH V2] virtio-pci: fix queue_enable write
  2020-06-10  5:43 [PATCH V2] virtio-pci: fix queue_enable write Jason Wang
@ 2020-06-10  8:57 ` Stefano Garzarella
  2020-06-10  9:42   ` Michael S. Tsirkin
  2020-06-11  8:41 ` Stefan Hajnoczi
  1 sibling, 1 reply; 6+ messages in thread
From: Stefano Garzarella @ 2020-06-10  8:57 UTC (permalink / raw)
  To: Jason Wang; +Cc: qemu-devel, stefanha, mst

On Wed, Jun 10, 2020 at 01:43:51PM +0800, Jason Wang wrote:
> Spec said: The driver uses this to selectively prevent the device from
> executing requests from this virtqueue. 1 - enabled; 0 - disabled.
> 
> Though write 0 to queue_enable is forbidden by the spec, we should not
> assume that the value is 1.
> 
> Fix this by ignore the write value other than 1.
> 
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> Changes from V1:
> - fix typo
> - warn wrong value through virtio_error
> ---
>  hw/virtio/virtio-pci.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index d028c17c24..7bc8c1c056 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -1273,16 +1273,20 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
>          virtio_queue_set_vector(vdev, vdev->queue_sel, val);
>          break;
>      case VIRTIO_PCI_COMMON_Q_ENABLE:
> -        virtio_queue_set_num(vdev, vdev->queue_sel,
> -                             proxy->vqs[vdev->queue_sel].num);
> -        virtio_queue_set_rings(vdev, vdev->queue_sel,
> +        if (val == 1) {

Does it have to be 1 or can it be any value other than 0?

Thanks,
Stefano

> +            virtio_queue_set_num(vdev, vdev->queue_sel,
> +                                 proxy->vqs[vdev->queue_sel].num);
> +            virtio_queue_set_rings(vdev, vdev->queue_sel,
>                         ((uint64_t)proxy->vqs[vdev->queue_sel].desc[1]) << 32 |
>                         proxy->vqs[vdev->queue_sel].desc[0],
>                         ((uint64_t)proxy->vqs[vdev->queue_sel].avail[1]) << 32 |
>                         proxy->vqs[vdev->queue_sel].avail[0],
>                         ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 |
>                         proxy->vqs[vdev->queue_sel].used[0]);
> -        proxy->vqs[vdev->queue_sel].enabled = 1;
> +            proxy->vqs[vdev->queue_sel].enabled = 1;
> +        } else {
> +            virtio_error(vdev, "wrong value for queue_enable %"PRIx64, val);
> +        }
>          break;
>      case VIRTIO_PCI_COMMON_Q_DESCLO:
>          proxy->vqs[vdev->queue_sel].desc[0] = val;
> -- 
> 2.20.1
> 
> 



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V2] virtio-pci: fix queue_enable write
  2020-06-10  8:57 ` Stefano Garzarella
@ 2020-06-10  9:42   ` Michael S. Tsirkin
  2020-06-10  9:52     ` Stefano Garzarella
  0 siblings, 1 reply; 6+ messages in thread
From: Michael S. Tsirkin @ 2020-06-10  9:42 UTC (permalink / raw)
  To: Stefano Garzarella; +Cc: Jason Wang, qemu-devel, stefanha

On Wed, Jun 10, 2020 at 10:57:26AM +0200, Stefano Garzarella wrote:
> On Wed, Jun 10, 2020 at 01:43:51PM +0800, Jason Wang wrote:
> > Spec said: The driver uses this to selectively prevent the device from
> > executing requests from this virtqueue. 1 - enabled; 0 - disabled.
> > 
> > Though write 0 to queue_enable is forbidden by the spec, we should not
> > assume that the value is 1.
> > 
> > Fix this by ignore the write value other than 1.
> > 
> > Signed-off-by: Jason Wang <jasowang@redhat.com>
> > ---
> > Changes from V1:
> > - fix typo
> > - warn wrong value through virtio_error
> > ---
> >  hw/virtio/virtio-pci.c | 12 ++++++++----
> >  1 file changed, 8 insertions(+), 4 deletions(-)
> > 
> > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > index d028c17c24..7bc8c1c056 100644
> > --- a/hw/virtio/virtio-pci.c
> > +++ b/hw/virtio/virtio-pci.c
> > @@ -1273,16 +1273,20 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
> >          virtio_queue_set_vector(vdev, vdev->queue_sel, val);
> >          break;
> >      case VIRTIO_PCI_COMMON_Q_ENABLE:
> > -        virtio_queue_set_num(vdev, vdev->queue_sel,
> > -                             proxy->vqs[vdev->queue_sel].num);
> > -        virtio_queue_set_rings(vdev, vdev->queue_sel,
> > +        if (val == 1) {
> 
> Does it have to be 1 or can it be any value other than 0?
> 
> Thanks,
> Stefano

spec says 1

> > +            virtio_queue_set_num(vdev, vdev->queue_sel,
> > +                                 proxy->vqs[vdev->queue_sel].num);
> > +            virtio_queue_set_rings(vdev, vdev->queue_sel,
> >                         ((uint64_t)proxy->vqs[vdev->queue_sel].desc[1]) << 32 |
> >                         proxy->vqs[vdev->queue_sel].desc[0],
> >                         ((uint64_t)proxy->vqs[vdev->queue_sel].avail[1]) << 32 |
> >                         proxy->vqs[vdev->queue_sel].avail[0],
> >                         ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 |
> >                         proxy->vqs[vdev->queue_sel].used[0]);
> > -        proxy->vqs[vdev->queue_sel].enabled = 1;
> > +            proxy->vqs[vdev->queue_sel].enabled = 1;
> > +        } else {
> > +            virtio_error(vdev, "wrong value for queue_enable %"PRIx64, val);
> > +        }
> >          break;
> >      case VIRTIO_PCI_COMMON_Q_DESCLO:
> >          proxy->vqs[vdev->queue_sel].desc[0] = val;
> > -- 
> > 2.20.1
> > 
> > 



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V2] virtio-pci: fix queue_enable write
  2020-06-10  9:42   ` Michael S. Tsirkin
@ 2020-06-10  9:52     ` Stefano Garzarella
  2020-06-11  3:05       ` Jason Wang
  0 siblings, 1 reply; 6+ messages in thread
From: Stefano Garzarella @ 2020-06-10  9:52 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Jason Wang, qemu-devel, stefanha

On Wed, Jun 10, 2020 at 05:42:54AM -0400, Michael S. Tsirkin wrote:
> On Wed, Jun 10, 2020 at 10:57:26AM +0200, Stefano Garzarella wrote:
> > On Wed, Jun 10, 2020 at 01:43:51PM +0800, Jason Wang wrote:
> > > Spec said: The driver uses this to selectively prevent the device from
> > > executing requests from this virtqueue. 1 - enabled; 0 - disabled.
> > > 
> > > Though write 0 to queue_enable is forbidden by the spec, we should not
> > > assume that the value is 1.
> > > 
> > > Fix this by ignore the write value other than 1.
> > > 
> > > Signed-off-by: Jason Wang <jasowang@redhat.com>
> > > ---
> > > Changes from V1:
> > > - fix typo
> > > - warn wrong value through virtio_error
> > > ---
> > >  hw/virtio/virtio-pci.c | 12 ++++++++----
> > >  1 file changed, 8 insertions(+), 4 deletions(-)
> > > 
> > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > > index d028c17c24..7bc8c1c056 100644
> > > --- a/hw/virtio/virtio-pci.c
> > > +++ b/hw/virtio/virtio-pci.c
> > > @@ -1273,16 +1273,20 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
> > >          virtio_queue_set_vector(vdev, vdev->queue_sel, val);
> > >          break;
> > >      case VIRTIO_PCI_COMMON_Q_ENABLE:
> > > -        virtio_queue_set_num(vdev, vdev->queue_sel,
> > > -                             proxy->vqs[vdev->queue_sel].num);
> > > -        virtio_queue_set_rings(vdev, vdev->queue_sel,
> > > +        if (val == 1) {
> > 
> > Does it have to be 1 or can it be any value other than 0?
> > 
> > Thanks,
> > Stefano
> 
> spec says 1

I was confused by "The driver MUST NOT write a 0 to queue_enable.",
interpreting it as "can write anything other than 0".

But as Jason also wrote in the commit message, the driver should write
1 to enable, so

Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>

Thanks,
Stefano



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V2] virtio-pci: fix queue_enable write
  2020-06-10  9:52     ` Stefano Garzarella
@ 2020-06-11  3:05       ` Jason Wang
  0 siblings, 0 replies; 6+ messages in thread
From: Jason Wang @ 2020-06-11  3:05 UTC (permalink / raw)
  To: Stefano Garzarella, Michael S. Tsirkin; +Cc: qemu-devel, stefanha


On 2020/6/10 下午5:52, Stefano Garzarella wrote:
> On Wed, Jun 10, 2020 at 05:42:54AM -0400, Michael S. Tsirkin wrote:
>> On Wed, Jun 10, 2020 at 10:57:26AM +0200, Stefano Garzarella wrote:
>>> On Wed, Jun 10, 2020 at 01:43:51PM +0800, Jason Wang wrote:
>>>> Spec said: The driver uses this to selectively prevent the device from
>>>> executing requests from this virtqueue. 1 - enabled; 0 - disabled.
>>>>
>>>> Though write 0 to queue_enable is forbidden by the spec, we should not
>>>> assume that the value is 1.
>>>>
>>>> Fix this by ignore the write value other than 1.
>>>>
>>>> Signed-off-by: Jason Wang <jasowang@redhat.com>
>>>> ---
>>>> Changes from V1:
>>>> - fix typo
>>>> - warn wrong value through virtio_error
>>>> ---
>>>>   hw/virtio/virtio-pci.c | 12 ++++++++----
>>>>   1 file changed, 8 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
>>>> index d028c17c24..7bc8c1c056 100644
>>>> --- a/hw/virtio/virtio-pci.c
>>>> +++ b/hw/virtio/virtio-pci.c
>>>> @@ -1273,16 +1273,20 @@ static void virtio_pci_common_write(void *opaque, hwaddr addr,
>>>>           virtio_queue_set_vector(vdev, vdev->queue_sel, val);
>>>>           break;
>>>>       case VIRTIO_PCI_COMMON_Q_ENABLE:
>>>> -        virtio_queue_set_num(vdev, vdev->queue_sel,
>>>> -                             proxy->vqs[vdev->queue_sel].num);
>>>> -        virtio_queue_set_rings(vdev, vdev->queue_sel,
>>>> +        if (val == 1) {
>>> Does it have to be 1 or can it be any value other than 0?
>>>
>>> Thanks,
>>> Stefano
>> spec says 1
> I was confused by "The driver MUST NOT write a 0 to queue_enable.",
> interpreting it as "can write anything other than 0".


Yes, the spec is unclear about what happens if we write a value other 
than 0 or 1.

Maybe we should clarify that only 1 is allowed. Or writing value other 
than 1 may cause unexpected result.


>
> But as Jason also wrote in the commit message, the driver should write
> 1 to enable, so
>
> Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>


Thanks


>
> Thanks,
> Stefano
>



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V2] virtio-pci: fix queue_enable write
  2020-06-10  5:43 [PATCH V2] virtio-pci: fix queue_enable write Jason Wang
  2020-06-10  8:57 ` Stefano Garzarella
@ 2020-06-11  8:41 ` Stefan Hajnoczi
  1 sibling, 0 replies; 6+ messages in thread
From: Stefan Hajnoczi @ 2020-06-11  8:41 UTC (permalink / raw)
  To: Jason Wang; +Cc: qemu-devel, mst

[-- Attachment #1: Type: text/plain, Size: 667 bytes --]

On Wed, Jun 10, 2020 at 01:43:51PM +0800, Jason Wang wrote:
> Spec said: The driver uses this to selectively prevent the device from
> executing requests from this virtqueue. 1 - enabled; 0 - disabled.
> 
> Though write 0 to queue_enable is forbidden by the spec, we should not
> assume that the value is 1.
> 
> Fix this by ignore the write value other than 1.
> 
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> Changes from V1:
> - fix typo
> - warn wrong value through virtio_error
> ---
>  hw/virtio/virtio-pci.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-06-11  8:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-10  5:43 [PATCH V2] virtio-pci: fix queue_enable write Jason Wang
2020-06-10  8:57 ` Stefano Garzarella
2020-06-10  9:42   ` Michael S. Tsirkin
2020-06-10  9:52     ` Stefano Garzarella
2020-06-11  3:05       ` Jason Wang
2020-06-11  8:41 ` Stefan Hajnoczi

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).