[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian
From: |
Cornelia Huck |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities |
Date: |
Mon, 11 Jan 2016 19:16:38 +0100 |
On Mon, 11 Jan 2016 17:12:21 +0100
Greg Kurz <address@hidden> wrote:
> When running a fully emulated device in cross-endian conditions, including
> a virtio 1.0 device offered to a big endian guest, we need to fix the vnet
> headers. This is currently handled by the virtio_net_hdr_swap() function
> in the core virtio-net code but it should actually be handled by the net
> backend.
>
> With this patch, virtio-net now tries to configure the backend to do the
> endian fixing when the device starts (i.e. drivers sets the CONFIG_OK bit).
> If the backend cannot support the requested endiannes, we have to fallback
> onto virtio_net_hdr_swap(): this is recorded in the needs_vnet_hdr_swap flag,
> to be used in the TX and RX paths.
>
> Note that we reset the backend to the default behaviour (guest native
> endianness) when the device stops (i.e. device status had CONFIG_OK bit and
> driver unsets it). This is needed, with the linux tap backend at least,
> otherwise the guest may loose network connectivity if rebooted into a
s/loose/lose/
> different endianness.
>
> The current vhost-net code also tries to configure net backends. This will
> be no more needed and will be reverted in a subsequent patch.
>
> Signed-off-by: Greg Kurz <address@hidden>
(...)
> +static void virtio_net_vnet_status(VirtIONet *n, uint8_t status)
> +{
> + VirtIODevice *vdev = VIRTIO_DEVICE(n);
> + NetClientState *peer = qemu_get_queue(n->nic)->peer;
> +
> + if (virtio_net_started(n, status)) {
> + int r;
> +
> + /* Before using the device, we tell the network backend about the
> + * endianness to use when parsing vnet headers. If the backend can't
> + * do it, we fallback onto fixing the headers in the core virtio-net
> + * code.
> + */
> + if (virtio_is_big_endian(vdev)) {
> + r = qemu_set_vnet_be(peer, true);
> + } else {
> + r = qemu_set_vnet_le(peer, true);
> + }
> +
> + n->needs_vnet_hdr_swap = !!r;
> + } else if (virtio_net_started(n, vdev->status)) {
> + /* After using the device, we need to reset the network backend to
> + * the default (guest native endianness), otherwise the guest may
> + * loose network connectivity if it is rebooted into a different
here again
> + * endianness.
> + */
> + if (virtio_is_big_endian(vdev)) {
> + qemu_set_vnet_be(peer, false);
> + } else {
> + qemu_set_vnet_le(peer, false);
> + }
> + }
> +}
> +
Reviewed-by: Cornelia Huck <address@hidden>
- [Qemu-devel] [PATCH v2 0/5] virtio/vhost cross-endian cleanup, Greg Kurz, 2016/01/11
- [Qemu-devel] [PATCH v2 0/5] virtio/vhost cross-endian cleanup, Greg Kurz, 2016/01/11
- [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities, Greg Kurz, 2016/01/11
- Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities,
Cornelia Huck <=
- Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities, Laurent Vivier, 2016/01/11
- Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities, Laurent Vivier, 2016/01/12
- Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities, Greg Kurz, 2016/01/13
- Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities, Laurent Vivier, 2016/01/13
- Re: [Qemu-devel] [PATCH v2 1/5] virtio-net: use the backend cross-endian capabilities, Greg Kurz, 2016/01/13
[Qemu-devel] [PATCH v2 2/5] Revert "vhost-net: tell tap backend about the vnet endianness", Greg Kurz, 2016/01/11
[Qemu-devel] [PATCH v2 3/5] virtio: move cross-endian helper to vhost, Greg Kurz, 2016/01/11
[Qemu-devel] [PATCH v2 4/5] vhost: move virtio 1.0 check to cross-endian helper, Greg Kurz, 2016/01/11