Răsfoiți Sursa

vfio/migration: Use BE byte order for device state wire packets

Wire data commonly use BE byte order (including in the existing migration
protocol), use it also for for VFIO device state packets.

This will allow VFIO multifd device state transfer between hosts with
different endianness.
Although currently there is no such use case, it's good to have it now
for completeness.

Reviewed-by: Avihai Horon <avihaih@nvidia.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Link: https://lore.kernel.org/qemu-devel/dcfc04cc1a50655650dbac8398e2742ada84ee39.1741611079.git.maciej.szmigiero@oracle.com
Signed-off-by: Cédric Le Goater <clg@redhat.com>
Maciej S. Szmigiero 5 luni în urmă
părinte
comite
cbb2e10526
1 a modificat fișierele cu 10 adăugiri și 5 ștergeri
  1. 10 5
      hw/vfio/migration-multifd.c

+ 10 - 5
hw/vfio/migration-multifd.c

@@ -13,6 +13,7 @@
 #include "hw/vfio/vfio-common.h"
 #include "hw/vfio/vfio-common.h"
 #include "migration/misc.h"
 #include "migration/misc.h"
 #include "qapi/error.h"
 #include "qapi/error.h"
+#include "qemu/bswap.h"
 #include "qemu/error-report.h"
 #include "qemu/error-report.h"
 #include "qemu/lockable.h"
 #include "qemu/lockable.h"
 #include "qemu/main-loop.h"
 #include "qemu/main-loop.h"
@@ -155,12 +156,16 @@ bool vfio_multifd_load_state_buffer(void *opaque, char *data, size_t data_size,
         return false;
         return false;
     }
     }
 
 
+    packet->version = be32_to_cpu(packet->version);
     if (packet->version != VFIO_DEVICE_STATE_PACKET_VER_CURRENT) {
     if (packet->version != VFIO_DEVICE_STATE_PACKET_VER_CURRENT) {
         error_setg(errp, "%s: packet has unknown version %" PRIu32,
         error_setg(errp, "%s: packet has unknown version %" PRIu32,
                    vbasedev->name, packet->version);
                    vbasedev->name, packet->version);
         return false;
         return false;
     }
     }
 
 
+    packet->idx = be32_to_cpu(packet->idx);
+    packet->flags = be32_to_cpu(packet->flags);
+
     if (packet->idx == UINT32_MAX) {
     if (packet->idx == UINT32_MAX) {
         error_setg(errp, "%s: packet index is invalid", vbasedev->name);
         error_setg(errp, "%s: packet index is invalid", vbasedev->name);
         return false;
         return false;
@@ -558,9 +563,9 @@ vfio_save_complete_precopy_thread_config_state(VFIODevice *vbasedev,
 
 
     packet_len = sizeof(*packet) + bioc->usage;
     packet_len = sizeof(*packet) + bioc->usage;
     packet = g_malloc0(packet_len);
     packet = g_malloc0(packet_len);
-    packet->version = VFIO_DEVICE_STATE_PACKET_VER_CURRENT;
-    packet->idx = idx;
-    packet->flags = VFIO_DEVICE_STATE_CONFIG_STATE;
+    packet->version = cpu_to_be32(VFIO_DEVICE_STATE_PACKET_VER_CURRENT);
+    packet->idx = cpu_to_be32(idx);
+    packet->flags = cpu_to_be32(VFIO_DEVICE_STATE_CONFIG_STATE);
     memcpy(&packet->data, bioc->data, bioc->usage);
     memcpy(&packet->data, bioc->data, bioc->usage);
 
 
     if (!multifd_queue_device_state(idstr, instance_id,
     if (!multifd_queue_device_state(idstr, instance_id,
@@ -610,7 +615,7 @@ vfio_multifd_save_complete_precopy_thread(SaveLiveCompletePrecopyThreadData *d,
     }
     }
 
 
     packet = g_malloc0(sizeof(*packet) + migration->data_buffer_size);
     packet = g_malloc0(sizeof(*packet) + migration->data_buffer_size);
-    packet->version = VFIO_DEVICE_STATE_PACKET_VER_CURRENT;
+    packet->version = cpu_to_be32(VFIO_DEVICE_STATE_PACKET_VER_CURRENT);
 
 
     for (idx = 0; ; idx++) {
     for (idx = 0; ; idx++) {
         ssize_t data_size;
         ssize_t data_size;
@@ -631,7 +636,7 @@ vfio_multifd_save_complete_precopy_thread(SaveLiveCompletePrecopyThreadData *d,
             break;
             break;
         }
         }
 
 
-        packet->idx = idx;
+        packet->idx = cpu_to_be32(idx);
         packet_size = sizeof(*packet) + data_size;
         packet_size = sizeof(*packet) + data_size;
 
 
         if (!multifd_queue_device_state(d->idstr, d->instance_id,
         if (!multifd_queue_device_state(d->idstr, d->instance_id,