Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-26 Thread Greg Kurz
On Tue, 26 Jan 2016 11:53:21 +0100
Laurent Vivier  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 
> >>> ---
> >>>  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   
> 
> 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




Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-26 Thread Laurent Vivier


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

Thanks Jason.

Who can pick this in his tree ?

Laurent



Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-21 Thread Jason Wang


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




Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-21 Thread Laurent Vivier
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 
> ---
>  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;
>  }
>  
> 



Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-14 Thread Cornelia Huck
On Thu, 14 Jan 2016 09:01:49 +0100
Greg Kurz  wrote:

> On Wed, 13 Jan 2016 20:26:25 +0100
> 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 
> > ---
> 
> 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 
> 
> >  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 




Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-14 Thread Greg Kurz
On Wed, 13 Jan 2016 20:26:25 +0100
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 
> ---

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 

>  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;
>  }
> 




[Qemu-devel] [PATCH] net: set endianness on all backend devices

2016-01-13 Thread Laurent Vivier
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 
---
 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;
 }
 
-- 
1.8.3.1