* [PATCH v2] vfio/migration: Use BE byte order for device state wire packets
@ 2025-03-10 12:53 Maciej S. Szmigiero
2025-03-10 13:14 ` Cédric Le Goater
0 siblings, 1 reply; 2+ messages in thread
From: Maciej S. Szmigiero @ 2025-03-10 12:53 UTC (permalink / raw)
To: Peter Xu, Fabiano Rosas
Cc: Alex Williamson, Cédric Le Goater, Eric Blake,
Markus Armbruster, Daniel P . Berrangé, Avihai Horon,
Joao Martins, qemu-devel
From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
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>
---
hw/vfio/migration-multifd.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/hw/vfio/migration-multifd.c b/hw/vfio/migration-multifd.c
index a9d41b9f1cb1..e816461e1652 100644
--- a/hw/vfio/migration-multifd.c
+++ b/hw/vfio/migration-multifd.c
@@ -13,6 +13,7 @@
#include "hw/vfio/vfio-common.h"
#include "migration/misc.h"
#include "qapi/error.h"
+#include "qemu/bswap.h"
#include "qemu/error-report.h"
#include "qemu/lockable.h"
#include "qemu/main-loop.h"
@@ -208,12 +209,16 @@ bool vfio_multifd_load_state_buffer(void *opaque, char *data, size_t data_size,
return false;
}
+ packet->version = be32_to_cpu(packet->version);
if (packet->version != VFIO_DEVICE_STATE_PACKET_VER_CURRENT) {
error_setg(errp, "%s: packet has unknown version %" PRIu32,
vbasedev->name, packet->version);
return false;
}
+ packet->idx = be32_to_cpu(packet->idx);
+ packet->flags = be32_to_cpu(packet->flags);
+
if (packet->idx == UINT32_MAX) {
error_setg(errp, "%s: packet index is invalid", vbasedev->name);
return false;
@@ -682,9 +687,9 @@ vfio_save_complete_precopy_thread_config_state(VFIODevice *vbasedev,
packet_len = sizeof(*packet) + bioc->usage;
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);
if (!multifd_queue_device_state(idstr, instance_id,
@@ -734,7 +739,7 @@ vfio_multifd_save_complete_precopy_thread(SaveLiveCompletePrecopyThreadData *d,
}
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++) {
ssize_t data_size;
@@ -755,7 +760,7 @@ vfio_multifd_save_complete_precopy_thread(SaveLiveCompletePrecopyThreadData *d,
break;
}
- packet->idx = idx;
+ packet->idx = cpu_to_be32(idx);
packet_size = sizeof(*packet) + data_size;
if (!multifd_queue_device_state(d->idstr, d->instance_id,
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] vfio/migration: Use BE byte order for device state wire packets
2025-03-10 12:53 [PATCH v2] vfio/migration: Use BE byte order for device state wire packets Maciej S. Szmigiero
@ 2025-03-10 13:14 ` Cédric Le Goater
0 siblings, 0 replies; 2+ messages in thread
From: Cédric Le Goater @ 2025-03-10 13:14 UTC (permalink / raw)
To: Maciej S. Szmigiero, Peter Xu, Fabiano Rosas
Cc: Alex Williamson, Eric Blake, Markus Armbruster,
Daniel P . Berrangé, Avihai Horon, Joao Martins, qemu-devel
On 3/10/25 13:53, Maciej S. Szmigiero wrote:
> From: "Maciej S. Szmigiero" <maciej.szmigiero@oracle.com>
>
> 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>
> ---> hw/vfio/migration-multifd.c | 15 ++++++++++-----
> 1 file changed, 10 insertions(+), 5 deletions(-)
Applied to vfio-next.
Thanks,
C.
> diff --git a/hw/vfio/migration-multifd.c b/hw/vfio/migration-multifd.c
> index a9d41b9f1cb1..e816461e1652 100644
> --- a/hw/vfio/migration-multifd.c
> +++ b/hw/vfio/migration-multifd.c
> @@ -13,6 +13,7 @@
> #include "hw/vfio/vfio-common.h"
> #include "migration/misc.h"
> #include "qapi/error.h"
> +#include "qemu/bswap.h"
> #include "qemu/error-report.h"
> #include "qemu/lockable.h"
> #include "qemu/main-loop.h"
> @@ -208,12 +209,16 @@ bool vfio_multifd_load_state_buffer(void *opaque, char *data, size_t data_size,
> return false;
> }
>
> + packet->version = be32_to_cpu(packet->version);
> if (packet->version != VFIO_DEVICE_STATE_PACKET_VER_CURRENT) {
> error_setg(errp, "%s: packet has unknown version %" PRIu32,
> vbasedev->name, packet->version);
> return false;
> }
>
> + packet->idx = be32_to_cpu(packet->idx);
> + packet->flags = be32_to_cpu(packet->flags);
> +
> if (packet->idx == UINT32_MAX) {
> error_setg(errp, "%s: packet index is invalid", vbasedev->name);
> return false;
> @@ -682,9 +687,9 @@ vfio_save_complete_precopy_thread_config_state(VFIODevice *vbasedev,
>
> packet_len = sizeof(*packet) + bioc->usage;
> 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);
>
> if (!multifd_queue_device_state(idstr, instance_id,
> @@ -734,7 +739,7 @@ vfio_multifd_save_complete_precopy_thread(SaveLiveCompletePrecopyThreadData *d,
> }
>
> 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++) {
> ssize_t data_size;
> @@ -755,7 +760,7 @@ vfio_multifd_save_complete_precopy_thread(SaveLiveCompletePrecopyThreadData *d,
> break;
> }
>
> - packet->idx = idx;
> + packet->idx = cpu_to_be32(idx);
> packet_size = sizeof(*packet) + data_size;
>
> if (!multifd_queue_device_state(d->idstr, d->instance_id,
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-03-10 13:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-10 12:53 [PATCH v2] vfio/migration: Use BE byte order for device state wire packets Maciej S. Szmigiero
2025-03-10 13:14 ` Cédric Le Goater
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).