|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] libxl: introduce QEMU_HEADER
On Thu, 2012-01-19 at 12:13 +0000, Stefano Stabellini wrote:
> Introduce a new QEMU_HEADER stored in the Qemu chunk right after the
> QEMU_SIGNATURE and record length, before the Qemu state, to preserve the
> physmap informations written by Qemu on xenstore.
I'm still of the opinion that this should be a new XC_SAVE_ID_*
(possibly from a new range reserved for toolstakc use) and
saved/restored via a separate callback from libxc.
The mess that is the tail of the save/restore protocol is pure
historical and for backwards compat, we should not be making it any
worse. An XC_SAVE_ID is exactly equivalent to adding something to the
tail but uses the extensibility mechanism which we have now built into
the protocol.
Ian.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> ---
> tools/libxl/libxl_dom.c | 104
> ++++++++++++++++++++++++++++++++++++++++--
> tools/libxl/libxl_internal.h | 1 +
> 2 files changed, 100 insertions(+), 5 deletions(-)
>
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index f33e572..0f3d0c3 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -359,9 +359,47 @@ static int libxl__domain_restore_device_model(uint8_t
> *buf, uint32_t size,
> libxl__gc *gc = (libxl__gc *)arg->gc;
> libxl_ctx *ctx = libxl__gc_owner(gc);
> uint32_t domid = arg->domid;
> - int fd2 = -1, ret = 0;
> + int fd2 = -1, ret = 0, i = 0;
> const char *filename;
> + uint8_t *ptr = buf;
> + uint32_t count = 0;
> + uint64_t phys_offset_v = 0, start_addr_v = 0, size_v = 0;
> + uint32_t header_size = 0;
> +
> + if (strncmp((char *)ptr, QEMU_HEADER, size))
> + goto no_header;
> +
> + ptr += sizeof(QEMU_HEADER);
> + memcpy(&count, ptr, sizeof(count));
> + ptr += sizeof(count);
> + header_size = sizeof(QEMU_HEADER) + sizeof(count) + count *
> sizeof(uint64_t) * 3;
> + size -= header_size;
> +
> + for (i = 0; i < count; i++) {
> + memcpy(&phys_offset_v, ptr, sizeof(uint64_t));
> + ptr += sizeof(uint64_t);
> + memcpy(&start_addr_v, ptr, sizeof(uint64_t));
> + ptr += sizeof(uint64_t);
> + memcpy(&size_v, ptr, sizeof(uint64_t));
> + ptr += sizeof(uint64_t);
> +
> + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc,
> +
> "/local/domain/0/device-model/%d/physmap/%"PRIx64"/start_addr",
> + domid, phys_offset_v), "%"PRIx64, start_addr_v);
> + if (ret) {
> + ptr = buf + header_size;
> + break;
> + }
> + ret = libxl__xs_write(gc, 0, libxl__sprintf(gc,
> + "/local/domain/0/device-model/%d/physmap/%"PRIx64"/size",
> + domid, phys_offset_v), "%"PRIx64, size_v);
> + if (ret) {
> + ptr = buf + header_size;
> + break;
> + }
> + }
>
> +no_header:
> filename = libxl__device_model_restorefile(gc, domid);
> fd2 = open(filename, O_WRONLY|O_CREAT);
> if (fd2 < 0) {
> @@ -370,7 +408,7 @@ static int libxl__domain_restore_device_model(uint8_t
> *buf, uint32_t size,
> }
>
> ret = libxl_write_exactly(
> - ctx, fd2, buf, size, "saved-state file", "qemu state");
> + ctx, fd2, ptr, size, "saved-state file", "qemu state");
> if (ret)
> goto out;
> ret = 0;
> @@ -642,11 +680,61 @@ out:
> return rc;
> }
>
> +static int libxl__domain_save_qemu_header(libxl__gc *gc, uint32_t domid,
> + int fd, char **buf)
> +{
> + char *start_addr = NULL, *size = NULL, *phys_offset = NULL;
> + int len = 0, i = 0;
> + unsigned int num = 0;
> + uint32_t count = 0;
> + char *ptr = NULL, **entries = NULL;
> + uint64_t val = 0;
> +
> + entries = libxl__xs_directory(gc, 0, libxl__sprintf(gc,
> + "/local/domain/0/device-model/%d/physmap", domid), &num);
> + count = num;
> +
> + len = sizeof(QEMU_HEADER) + sizeof(count) + count * (sizeof(val) * 3);
> + *buf = libxl__calloc(gc, 1, len);
> + ptr = *buf;
> +
> + strcpy(ptr, QEMU_HEADER);
> + ptr += sizeof(QEMU_HEADER);
> +
> + memcpy(ptr, &count, sizeof(count));
> + ptr += sizeof(count);
> +
> + for (i = 0; i < count; i++) {
> + phys_offset = entries[i];
> + start_addr = libxl__xs_read(gc, 0, libxl__sprintf(gc,
> + "/local/domain/0/device-model/%d/physmap/%s/start_addr",
> + domid, phys_offset));
> + size = libxl__xs_read(gc, 0, libxl__sprintf(gc,
> + "/local/domain/0/device-model/%d/physmap/%s/size",
> + domid, phys_offset));
> +
> + if (start_addr == NULL || size == NULL || phys_offset == NULL)
> + return 0;
> +
> + val = strtoll(phys_offset, NULL, 16);
> + memcpy(ptr, &val, sizeof(val));
> + ptr += sizeof(val);
> + val = strtoll(start_addr, NULL, 16);
> + memcpy(ptr, &val, sizeof(val));
> + ptr += sizeof(val);
> + val = strtoll(size, NULL, 16);
> + memcpy(ptr, &val, sizeof(val));
> + ptr += sizeof(val);
> + }
> +
> + return len;
> +}
> +
> int libxl__domain_save_device_model(libxl__gc *gc, uint32_t domid, int fd)
> {
> libxl_ctx *ctx = libxl__gc_owner(gc);
> - int ret, fd2 = -1, c;
> - char buf[1024];
> + int ret, fd2 = -1, c, len;
> + char buf[1024], *buf2;
> const char *filename = libxl__device_model_savefile(gc, domid);
> struct stat st;
> uint32_t qemu_state_len;
> @@ -687,7 +775,8 @@ int libxl__domain_save_device_model(libxl__gc *gc,
> uint32_t domid, int fd)
> goto out;
> }
>
> - qemu_state_len = st.st_size;
> + len = libxl__domain_save_qemu_header(gc, domid, fd, &buf2);
> + qemu_state_len = st.st_size + len;
> LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Qemu state is %d bytes\n",
> qemu_state_len);
>
> ret = libxl_write_exactly(ctx, fd, QEMU_SIGNATURE,
> strlen(QEMU_SIGNATURE),
> @@ -700,6 +789,11 @@ int libxl__domain_save_device_model(libxl__gc *gc,
> uint32_t domid, int fd)
> if (ret)
> goto out;
>
> + ret = libxl_write_exactly(ctx, fd, buf2, len,
> + "saved-state file", "saved-state qemu header");
> + if (ret)
> + goto out;
> +
> fd2 = open(filename, O_RDONLY);
> if (fd2 < 0) {
> LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Unable to open qemu save
> file\n");
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 7f7578a..01f866f 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -57,6 +57,7 @@
> #define LIBXL_HVM_EXTRA_MEMORY 2048
> #define LIBXL_MIN_DOM0_MEM (128*1024)
> #define QEMU_SIGNATURE "DeviceModelRecord0002"
> +#define QEMU_HEADER "DeviceModelHeader0001"
> #define STUBDOM_CONSOLE_LOGGING 0
> #define STUBDOM_CONSOLE_SAVE 1
> #define STUBDOM_CONSOLE_RESTORE 2
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |