Re: [Qemu-devel] [PATCH] net: set endianness on all backend devices
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
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
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
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
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
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
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