Message ID | 1452713185-23517-1-git-send-email-lvivier@redhat.com |
---|---|
State | New |
Headers | show |
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; > } >
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>
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; > } > >
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>
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
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 --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; }
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(-)