diff mbox

net: set endianness on all backend devices

Message ID 1452713185-23517-1-git-send-email-lvivier@redhat.com
State New
Headers show

Commit Message

Laurent Vivier Jan. 13, 2016, 7:26 p.m. UTC
commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
       vhost-net: tell tap backend about the vnet endianness

makes vhost net to set the endianness of the device, but only for
the first device.

In case of multiqueue, we have multiple devices... This patch sets the
endianness for all the devices of the interface.

Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
 hw/net/vhost_net.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

Comments

Greg Kurz Jan. 14, 2016, 8:01 a.m. UTC | #1
On Wed, 13 Jan 2016 20:26:25 +0100
Laurent Vivier <lvivier@redhat.com> wrote:

> commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
>        vhost-net: tell tap backend about the vnet endianness
> 
> makes vhost net to set the endianness of the device, but only for
> the first device.
> 
> In case of multiqueue, we have multiple devices... This patch sets the
> endianness for all the devices of the interface.
> 
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---

Thanks for fixing this bug... it's been there since 2.4.0. I guess we
should backport this to 2.4 and 2.5. Cc'ing stable.

Reviewed-by: Greg Kurz <gkurz@linux.vnet.ibm.com>

>  hw/net/vhost_net.c | 23 +++++++++++------------
>  1 file changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index 318c3e6..10e233a 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -300,21 +300,19 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
>      VirtioBusState *vbus = VIRTIO_BUS(qbus);
>      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> -    int r, e, i;
> +    int r, e, i, j;
> 
>      if (!k->set_guest_notifiers) {
>          error_report("binding does not support guest notifiers");
> -        r = -ENOSYS;
> -        goto err;
> +        return -ENOSYS;
>      }
> 
> -    r = vhost_net_set_vnet_endian(dev, ncs[0].peer, true);
> -    if (r < 0) {
> -        goto err;
> -    }
> -
> -    for (i = 0; i < total_queues; i++) {
> -        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
> +    for (j = 0; j < total_queues; j++) {
> +        r = vhost_net_set_vnet_endian(dev, ncs[j].peer, true);
> +        if (r < 0) {
> +            goto err_endian;
> +        }
> +        vhost_net_set_vq_index(get_vhost_net(ncs[j].peer), j * 2);
>      }
> 
>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
> @@ -343,8 +341,9 @@ err_start:
>          fflush(stderr);
>      }
>  err_endian:
> -    vhost_net_set_vnet_endian(dev, ncs[0].peer, false);
> -err:
> +    while (--j >= 0) {
> +        vhost_net_set_vnet_endian(dev, ncs[j].peer, false);
> +    }
>      return r;
>  }
>
Cornelia Huck Jan. 14, 2016, 10:06 a.m. UTC | #2
On Thu, 14 Jan 2016 09:01:49 +0100
Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:

> On Wed, 13 Jan 2016 20:26:25 +0100
> Laurent Vivier <lvivier@redhat.com> wrote:
> 
> > commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
> >        vhost-net: tell tap backend about the vnet endianness
> > 
> > makes vhost net to set the endianness of the device, but only for
> > the first device.
> > 
> > In case of multiqueue, we have multiple devices... This patch sets the
> > endianness for all the devices of the interface.
> > 
> > Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> > ---
> 
> Thanks for fixing this bug... it's been there since 2.4.0. I guess we
> should backport this to 2.4 and 2.5. Cc'ing stable.

Agree on backporting this.

> Reviewed-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> 
> >  hw/net/vhost_net.c | 23 +++++++++++------------
> >  1 file changed, 11 insertions(+), 12 deletions(-)
> > 
> > diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> > index 318c3e6..10e233a 100644
> > --- a/hw/net/vhost_net.c
> > +++ b/hw/net/vhost_net.c
> > @@ -300,21 +300,19 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> >      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
> >      VirtioBusState *vbus = VIRTIO_BUS(qbus);
> >      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> > -    int r, e, i;
> > +    int r, e, i, j;

Nice alphabet soup ;)

Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Laurent Vivier Jan. 21, 2016, 8:42 a.m. UTC | #3
ping

[added Jason in cc:]

On 13/01/2016 20:26, Laurent Vivier wrote:
> commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
>        vhost-net: tell tap backend about the vnet endianness
> 
> makes vhost net to set the endianness of the device, but only for
> the first device.
> 
> In case of multiqueue, we have multiple devices... This patch sets the
> endianness for all the devices of the interface.
> 
> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> ---
>  hw/net/vhost_net.c | 23 +++++++++++------------
>  1 file changed, 11 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index 318c3e6..10e233a 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -300,21 +300,19 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
>      VirtioBusState *vbus = VIRTIO_BUS(qbus);
>      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> -    int r, e, i;
> +    int r, e, i, j;
>  
>      if (!k->set_guest_notifiers) {
>          error_report("binding does not support guest notifiers");
> -        r = -ENOSYS;
> -        goto err;
> +        return -ENOSYS;
>      }
>  
> -    r = vhost_net_set_vnet_endian(dev, ncs[0].peer, true);
> -    if (r < 0) {
> -        goto err;
> -    }
> -
> -    for (i = 0; i < total_queues; i++) {
> -        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
> +    for (j = 0; j < total_queues; j++) {
> +        r = vhost_net_set_vnet_endian(dev, ncs[j].peer, true);
> +        if (r < 0) {
> +            goto err_endian;
> +        }
> +        vhost_net_set_vq_index(get_vhost_net(ncs[j].peer), j * 2);
>      }
>  
>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
> @@ -343,8 +341,9 @@ err_start:
>          fflush(stderr);
>      }
>  err_endian:
> -    vhost_net_set_vnet_endian(dev, ncs[0].peer, false);
> -err:
> +    while (--j >= 0) {
> +        vhost_net_set_vnet_endian(dev, ncs[j].peer, false);
> +    }
>      return r;
>  }
>  
>
Jason Wang Jan. 22, 2016, 6:44 a.m. UTC | #4
On 01/21/2016 04:42 PM, Laurent Vivier wrote:
> ping
>
> [added Jason in cc:]
>
> On 13/01/2016 20:26, Laurent Vivier wrote:
>> commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
>>        vhost-net: tell tap backend about the vnet endianness
>>
>> makes vhost net to set the endianness of the device, but only for
>> the first device.
>>
>> In case of multiqueue, we have multiple devices... This patch sets the
>> endianness for all the devices of the interface.
>>
>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>> ---
>>  hw/net/vhost_net.c | 23 +++++++++++------------
>>  1 file changed, 11 insertions(+), 12 deletions(-)
>>
>> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
>> index 318c3e6..10e233a 100644
>> --- a/hw/net/vhost_net.c
>> +++ b/hw/net/vhost_net.c
>> @@ -300,21 +300,19 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>>      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
>>      VirtioBusState *vbus = VIRTIO_BUS(qbus);
>>      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
>> -    int r, e, i;
>> +    int r, e, i, j;
>>  
>>      if (!k->set_guest_notifiers) {
>>          error_report("binding does not support guest notifiers");
>> -        r = -ENOSYS;
>> -        goto err;
>> +        return -ENOSYS;
>>      }
>>  
>> -    r = vhost_net_set_vnet_endian(dev, ncs[0].peer, true);
>> -    if (r < 0) {
>> -        goto err;
>> -    }
>> -
>> -    for (i = 0; i < total_queues; i++) {
>> -        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
>> +    for (j = 0; j < total_queues; j++) {
>> +        r = vhost_net_set_vnet_endian(dev, ncs[j].peer, true);
>> +        if (r < 0) {
>> +            goto err_endian;
>> +        }
>> +        vhost_net_set_vq_index(get_vhost_net(ncs[j].peer), j * 2);
>>      }
>>  
>>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
>> @@ -343,8 +341,9 @@ err_start:
>>          fflush(stderr);
>>      }
>>  err_endian:
>> -    vhost_net_set_vnet_endian(dev, ncs[0].peer, false);
>> -err:
>> +    while (--j >= 0) {
>> +        vhost_net_set_vnet_endian(dev, ncs[j].peer, false);
>> +    }
>>      return r;
>>  }
>>  

Reviewed-by: Jason Wang <jasowang@redhat.com>
Laurent Vivier Jan. 26, 2016, 10:53 a.m. UTC | #5
On 22/01/2016 07:44, Jason Wang wrote:
> 
> 
> On 01/21/2016 04:42 PM, Laurent Vivier wrote:
>> ping
>>
>> [added Jason in cc:]
>>
>> On 13/01/2016 20:26, Laurent Vivier wrote:
>>> commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
>>>        vhost-net: tell tap backend about the vnet endianness
>>>
>>> makes vhost net to set the endianness of the device, but only for
>>> the first device.
>>>
>>> In case of multiqueue, we have multiple devices... This patch sets the
>>> endianness for all the devices of the interface.
>>>
>>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
>>> ---
>>>  hw/net/vhost_net.c | 23 +++++++++++------------
>>>  1 file changed, 11 insertions(+), 12 deletions(-)
>>>
>>> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
>>> index 318c3e6..10e233a 100644
>>> --- a/hw/net/vhost_net.c
>>> +++ b/hw/net/vhost_net.c
>>> @@ -300,21 +300,19 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
>>>      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
>>>      VirtioBusState *vbus = VIRTIO_BUS(qbus);
>>>      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
>>> -    int r, e, i;
>>> +    int r, e, i, j;
>>>  
>>>      if (!k->set_guest_notifiers) {
>>>          error_report("binding does not support guest notifiers");
>>> -        r = -ENOSYS;
>>> -        goto err;
>>> +        return -ENOSYS;
>>>      }
>>>  
>>> -    r = vhost_net_set_vnet_endian(dev, ncs[0].peer, true);
>>> -    if (r < 0) {
>>> -        goto err;
>>> -    }
>>> -
>>> -    for (i = 0; i < total_queues; i++) {
>>> -        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
>>> +    for (j = 0; j < total_queues; j++) {
>>> +        r = vhost_net_set_vnet_endian(dev, ncs[j].peer, true);
>>> +        if (r < 0) {
>>> +            goto err_endian;
>>> +        }
>>> +        vhost_net_set_vq_index(get_vhost_net(ncs[j].peer), j * 2);
>>>      }
>>>  
>>>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
>>> @@ -343,8 +341,9 @@ err_start:
>>>          fflush(stderr);
>>>      }
>>>  err_endian:
>>> -    vhost_net_set_vnet_endian(dev, ncs[0].peer, false);
>>> -err:
>>> +    while (--j >= 0) {
>>> +        vhost_net_set_vnet_endian(dev, ncs[j].peer, false);
>>> +    }
>>>      return r;
>>>  }
>>>  
> 
> Reviewed-by: Jason Wang <jasowang@redhat.com>

Thanks Jason.

Who can pick this in his tree ?

Laurent
Greg Kurz Jan. 26, 2016, 1:15 p.m. UTC | #6
On Tue, 26 Jan 2016 11:53:21 +0100
Laurent Vivier <lvivier@redhat.com> wrote:

> On 22/01/2016 07:44, Jason Wang wrote:
> > 
> > 
> > On 01/21/2016 04:42 PM, Laurent Vivier wrote:  
> >> ping
> >>
> >> [added Jason in cc:]
> >>
> >> On 13/01/2016 20:26, Laurent Vivier wrote:  
> >>> commit 5be7d9f1b1452613b95c6ba70b8d7ad3d0797991
> >>>        vhost-net: tell tap backend about the vnet endianness
> >>>
> >>> makes vhost net to set the endianness of the device, but only for
> >>> the first device.
> >>>
> >>> In case of multiqueue, we have multiple devices... This patch sets the
> >>> endianness for all the devices of the interface.
> >>>
> >>> Signed-off-by: Laurent Vivier <lvivier@redhat.com>
> >>> ---
> >>>  hw/net/vhost_net.c | 23 +++++++++++------------
> >>>  1 file changed, 11 insertions(+), 12 deletions(-)
> >>>
> >>> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> >>> index 318c3e6..10e233a 100644
> >>> --- a/hw/net/vhost_net.c
> >>> +++ b/hw/net/vhost_net.c
> >>> @@ -300,21 +300,19 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
> >>>      BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
> >>>      VirtioBusState *vbus = VIRTIO_BUS(qbus);
> >>>      VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
> >>> -    int r, e, i;
> >>> +    int r, e, i, j;
> >>>  
> >>>      if (!k->set_guest_notifiers) {
> >>>          error_report("binding does not support guest notifiers");
> >>> -        r = -ENOSYS;
> >>> -        goto err;
> >>> +        return -ENOSYS;
> >>>      }
> >>>  
> >>> -    r = vhost_net_set_vnet_endian(dev, ncs[0].peer, true);
> >>> -    if (r < 0) {
> >>> -        goto err;
> >>> -    }
> >>> -
> >>> -    for (i = 0; i < total_queues; i++) {
> >>> -        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
> >>> +    for (j = 0; j < total_queues; j++) {
> >>> +        r = vhost_net_set_vnet_endian(dev, ncs[j].peer, true);
> >>> +        if (r < 0) {
> >>> +            goto err_endian;
> >>> +        }
> >>> +        vhost_net_set_vq_index(get_vhost_net(ncs[j].peer), j * 2);
> >>>      }
> >>>  
> >>>      r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
> >>> @@ -343,8 +341,9 @@ err_start:
> >>>          fflush(stderr);
> >>>      }
> >>>  err_endian:
> >>> -    vhost_net_set_vnet_endian(dev, ncs[0].peer, false);
> >>> -err:
> >>> +    while (--j >= 0) {
> >>> +        vhost_net_set_vnet_endian(dev, ncs[j].peer, false);
> >>> +    }
> >>>      return r;
> >>>  }
> >>>    
> > 
> > Reviewed-by: Jason Wang <jasowang@redhat.com>  
> 
> Thanks Jason.
> 
> Who can pick this in his tree ?
> 

According to MAINTAINERS, this must go through Michael's tree, but it
looks like he is very busy reworking memory barriers in the kernel...

> Laurent
> 

--
Greg
diff mbox

Patch

diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index 318c3e6..10e233a 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -300,21 +300,19 @@  int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
     VirtioBusState *vbus = VIRTIO_BUS(qbus);
     VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
-    int r, e, i;
+    int r, e, i, j;
 
     if (!k->set_guest_notifiers) {
         error_report("binding does not support guest notifiers");
-        r = -ENOSYS;
-        goto err;
+        return -ENOSYS;
     }
 
-    r = vhost_net_set_vnet_endian(dev, ncs[0].peer, true);
-    if (r < 0) {
-        goto err;
-    }
-
-    for (i = 0; i < total_queues; i++) {
-        vhost_net_set_vq_index(get_vhost_net(ncs[i].peer), i * 2);
+    for (j = 0; j < total_queues; j++) {
+        r = vhost_net_set_vnet_endian(dev, ncs[j].peer, true);
+        if (r < 0) {
+            goto err_endian;
+        }
+        vhost_net_set_vq_index(get_vhost_net(ncs[j].peer), j * 2);
     }
 
     r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
@@ -343,8 +341,9 @@  err_start:
         fflush(stderr);
     }
 err_endian:
-    vhost_net_set_vnet_endian(dev, ncs[0].peer, false);
-err:
+    while (--j >= 0) {
+        vhost_net_set_vnet_endian(dev, ncs[j].peer, false);
+    }
     return r;
 }