On 2/12/2025 12:07, Philippe Mathieu-Daudé wrote:
On 12/2/25 18:24, Konstantin Shkolnyy wrote:
On 2/12/2025 08:52, Philippe Mathieu-Daudé wrote:
On 11/2/25 17:19, Konstantin Shkolnyy wrote:
Add .set_vnet_le() function that always returns success, assuming that
vDPA h/w always implements LE data format. Otherwise, QEMU disables vDPA and
outputs the message:
"backend does not support LE vnet headers; falling back on userspace virtio"

Signed-off-by: Konstantin Shkolnyy <k...@linux.ibm.com>
---
  net/vhost-vdpa.c | 6 ++++++
  1 file changed, 6 insertions(+)

diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
index 231b45246c..7219aa2eee 100644
--- a/net/vhost-vdpa.c
+++ b/net/vhost-vdpa.c
@@ -270,6 +270,11 @@ static bool vhost_vdpa_has_ufo(NetClientState *nc)
  }
+static int vhost_vdpa_set_vnet_le(NetClientState *nc, bool is_le)
+{
+    return 0;
+}
+
  static bool vhost_vdpa_check_peer_type(NetClientState *nc, ObjectClass *oc,
                                         Error **errp)
  {
@@ -437,6 +442,7 @@ static NetClientInfo net_vhost_vdpa_info = {
          .cleanup = vhost_vdpa_cleanup,
          .has_vnet_hdr = vhost_vdpa_has_vnet_hdr,
          .has_ufo = vhost_vdpa_has_ufo,
+        .set_vnet_le = vhost_vdpa_set_vnet_le,

Dubious mismatch with set_vnet_be handler.

I'm not sure what you are suggesting...

Implement set_vnet_le for parity?

To my (very limited) knowledge, kernel's vhost_vdpa that QEMU talks to doesn't have an API to "change h/w endianness". If so, vDPA's .set_vnet_le/be(), as well as qemu_set_vnet_le/be() have very limited choices. qemu_set_vnet_le/be() behavior with vDPA was to simply assume that h/w endianness by default matches host's. This assumption is valid for other types of "NetClients" which are implemented in s/w. However, I suspect, vDPA h/w might all be going to be LE, to match virtio 1.0. Such is the NIC I'm dealing with.

My patch is only fixing a specific use case. Perhaps, for a complete fix, qemu_set_vnet_be() also shouldn't unconditionally return success on big endian machines, but always call .set_vnet_be() so that vDPA could fail it? But then it would start calling .set_vnet_be() on other "NetClients" where it didn't before.

That's why I don't want to just add a .set_vnet_be(), before someone here even confirms that vDPA h/w is indeed assumed LE, and, hence, what the right path is to a complete solution...

int qemu_set_vnet_be(NetClientState *nc, bool is_be)
{
#if HOST_BIG_ENDIAN
    return 0;
#else
    if (!nc || !nc->info->set_vnet_be)
        return -ENOSYS;

    return nc->info->set_vnet_be(nc, is_be);
#endif
}


Reply via email to