On 04/10/2011 11:09 PM, Daniel Veillard wrote:
On Sat, Apr 09, 2011 at 11:48:41AM -0400, Stefan Berger wrote:
> This patch enables the migration of Qemu VMs between hosts of
> different endianess. I tested this by migrating a i686 VM between a
> x86 and ppc64 host.
OMG, there is really a use case for this :-) ?
:-) There may be other
architectures that run more efficiently than an
x86 one.
Btw, my use case is 'testing'.
> I am converting the 'int's in the VM's state header
to uint32_t
> assuming this doesn't break compatibility with existing deployments
> other than Linux.
>
> Signed-off-by: Stefan Berger<stefanb(a)linux.vnet.ibm.com>
>
> ---
> src/qemu/qemu_driver.c | 25 ++++++++++++++++++++-----
> 1 file changed, 20 insertions(+), 5 deletions(-)
>
> Index: libvirt-acl/src/qemu/qemu_driver.c
> ===================================================================
> --- libvirt-acl.orig/src/qemu/qemu_driver.c
> +++ libvirt-acl/src/qemu/qemu_driver.c
> @@ -43,6 +43,7 @@
> #include<sys/wait.h>
> #include<sys/ioctl.h>
> #include<sys/un.h>
> +#include<byteswap.h>
>
>
> #include "qemu_driver.h"
> @@ -1881,13 +1882,22 @@ VIR_ENUM_IMPL(qemudSaveCompression, QEMU
>
> struct qemud_save_header {
> char magic[sizeof(QEMUD_SAVE_MAGIC)-1];
> - int version;
> - int xml_len;
> - int was_running;
> - int compressed;
> - int unused[15];
> + uint32_t version;
> + uint32_t xml_len;
> + uint32_t was_running;
> + uint32_t compressed;
> + uint32_t unused[15];
> };
>
> +static inline void
> +bswap_header(struct qemud_save_header *hdr) {
> + hdr->version = bswap_32(hdr->version);
> + hdr->xml_len = bswap_32(hdr->xml_len);
> + hdr->was_running = bswap_32(hdr->was_running);
> + hdr->compressed = bswap_32(hdr->compressed);
> +}
> +
> +
> /* return -errno on failure, or 0 on success */
> static int
> qemuDomainSaveHeader(int fd, const char *path, char *xml,
> @@ -3097,6 +3107,11 @@ qemuDomainSaveImageOpen(struct qemud_dri
> }
>
> if (header.version> QEMUD_SAVE_VERSION) {
> + /* convert endianess and try again */
> + bswap_header(&header);
> + }
Hum, isn't there a more reliable way to detect the change of
endianness ? That's a bit fishy IMHO :-)
The problem is that the header should
not have been written in a hosts'
native format. So what can go wrong? QEMUD_SAVE_VERSION is '2'. Either
we find 1 or 2 here and go ahead and accept it 'as-is'. Otherwise
anything bigger than 3 is not accepted and swapped. 3 then becomes 0x03
00 00 00 and is discarded. 0x 02 00 00 00 would be swapped to '2' and
accepted.
Stefan
> + if (header.version> QEMUD_SAVE_VERSION) {
> qemuReportError(VIR_ERR_OPERATION_FAILED,
> _("image version is not supported (%d>
%d)"),
> header.version, QEMUD_SAVE_VERSION);
Daniel