[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5/8] libxc, libxl, hvmloader: strip out outdated VM generation ID implementation
The VM generation ID support in libxc/libxl was based on a draft specification which subsequently changed considerably. Remove much of the code in anticipation of introducing something simpler that conforms to the current specification from Microsoft. Switch to using a HVM param (HVM_PARAM_VM_GENERATION_ID_ADDR) instead of the hvmloader/generation-id-address XenStore key. This simplifies save/restore since it only needs to transfer the value of this param. There are no changes to the migration stream format or the public libxl API. Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/firmware/hvmloader/acpi/build.c | 9 +++---- tools/libxc/xc_domain_restore.c | 44 +++------------------------------ tools/libxc/xc_domain_save.c | 5 ++-- tools/libxc/xenguest.h | 8 ++---- tools/libxl/libxl_create.c | 12 +++------ tools/libxl/libxl_dom.c | 25 ++----------------- tools/libxl/libxl_internal.h | 8 ++---- tools/libxl/libxl_save_callout.c | 10 +++----- tools/libxl/libxl_save_helper.c | 9 +++---- tools/libxl/libxl_save_msgs_gen.pl | 3 +-- 10 files changed, 26 insertions(+), 107 deletions(-) diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index 5c42d89..1431296 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -24,6 +24,7 @@ #include "../config.h" #include "../util.h" #include <xen/hvm/hvm_xs_strings.h> +#include <xen/hvm/params.h> #define ACPI_MAX_SECONDARY_TABLES 16 @@ -362,7 +363,6 @@ static int construct_secondary_tables(unsigned long *table_ptrs, static int new_vm_gid(struct acpi_info *acpi_info) { uint64_t vm_gid[2], *buf; - char addr[12]; const char * s; char *end; @@ -383,12 +383,9 @@ static int new_vm_gid(struct acpi_info *acpi_info) return 0; memcpy(buf, vm_gid, sizeof(vm_gid)); - /* set into ACPI table and XenStore the address */ + /* set into ACPI table and HVM param the address */ acpi_info->vm_gid_addr = virt_to_phys(buf); - if ( snprintf(addr, sizeof(addr), "0x%lx", virt_to_phys(buf)) - >= sizeof(addr) ) - return 0; - xenstore_write("hvmloader/generation-id-address", addr); + hvm_param_set(HVM_PARAM_VM_GENERATION_ID_ADDR, acpi_info->vm_gid_addr); return 1; } diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c index 6849712..dea41a0 100644 --- a/tools/libxc/xc_domain_restore.c +++ b/tools/libxc/xc_domain_restore.c @@ -1431,8 +1431,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, domid_t store_domid, unsigned int console_evtchn, unsigned long *console_mfn, domid_t console_domid, unsigned int hvm, unsigned int pae, int superpages, - int no_incr_generationid, int checkpointed_stream, - unsigned long *vm_generationid_addr, + int checkpointed_stream, struct restore_callbacks *callbacks) { DECLARE_DOMCTL; @@ -1657,44 +1656,9 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, xc_hvm_param_set(xch, dom, HVM_PARAM_VM86_TSS, pagebuf.vm86_tss); if ( pagebuf.console_pfn ) console_pfn = pagebuf.console_pfn; - if ( pagebuf.vm_generationid_addr ) { - if ( !no_incr_generationid ) { - unsigned int offset; - unsigned char *buf; - unsigned long long generationid; - - /* - * Map the VM generation id buffer and inject the new value. - */ - - pfn = pagebuf.vm_generationid_addr >> PAGE_SHIFT; - offset = pagebuf.vm_generationid_addr & (PAGE_SIZE - 1); - - if ( (pfn >= dinfo->p2m_size) || - (pfn_type[pfn] != XEN_DOMCTL_PFINFO_NOTAB) ) - { - ERROR("generation id buffer frame is bad"); - goto out; - } - - mfn = ctx->p2m[pfn]; - buf = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ | PROT_WRITE, mfn); - if ( buf == NULL ) - { - ERROR("xc_map_foreign_range for generation id" - " buffer failed"); - goto out; - } - - generationid = *(unsigned long long *)(buf + offset); - *(unsigned long long *)(buf + offset) = generationid + 1; - - munmap(buf, PAGE_SIZE); - } - - *vm_generationid_addr = pagebuf.vm_generationid_addr; - } + if ( pagebuf.vm_generationid_addr ) + xc_hvm_param_set(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR, + pagebuf.vm_generationid_addr); break; /* our work here is done */ } diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c index 14502c1..b5a772b 100644 --- a/tools/libxc/xc_domain_save.c +++ b/tools/libxc/xc_domain_save.c @@ -802,8 +802,7 @@ static int save_tsc_info(xc_interface *xch, uint32_t dom, int io_fd) int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters, uint32_t max_factor, uint32_t flags, - struct save_callbacks* callbacks, int hvm, - unsigned long vm_generationid_addr) + struct save_callbacks* callbacks, int hvm) { xc_dominfo_t info; DECLARE_DOMCTL; @@ -1634,7 +1633,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter } chunk = { 0, }; chunk.id = XC_SAVE_ID_HVM_GENERATION_ID_ADDR; - chunk.data = vm_generationid_addr; + xc_hvm_param_get(xch, dom, HVM_PARAM_VM_GENERATION_ID_ADDR, &chunk.data); if ( (chunk.data != 0) && wrexact(io_fd, &chunk, sizeof(chunk)) ) diff --git a/tools/libxc/xenguest.h b/tools/libxc/xenguest.h index 1f216cd..40bbac8 100644 --- a/tools/libxc/xenguest.h +++ b/tools/libxc/xenguest.h @@ -86,8 +86,7 @@ struct save_callbacks { */ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters, uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */, - struct save_callbacks* callbacks, int hvm, - unsigned long vm_generationid_addr); + struct save_callbacks* callbacks, int hvm); /* callbacks provided by xc_domain_restore */ @@ -113,9 +112,7 @@ struct restore_callbacks { * @parm hvm non-zero if this is a HVM restore * @parm pae non-zero if this HVM domain has PAE support enabled * @parm superpages non-zero to allocate guest memory with superpages - * @parm no_incr_generationid non-zero if generation id is NOT to be incremented * @parm checkpointed_stream non-zero if the far end of the stream is using checkpointing - * @parm vm_generationid_addr returned with the address of the generation id buffer * @parm callbacks non-NULL to receive a callback to restore toolstack * specific data * @return 0 on success, -1 on failure @@ -125,8 +122,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, domid_t store_domid, unsigned int console_evtchn, unsigned long *console_mfn, domid_t console_domid, unsigned int hvm, unsigned int pae, int superpages, - int no_incr_generationid, int checkpointed_stream, - unsigned long *vm_generationid_addr, + int checkpointed_stream, struct restore_callbacks *callbacks); /** * xc_domain_restore writes a file to disk that contains the device diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index d015cf4..cae6f53 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -584,12 +584,7 @@ retry_transaction: ARRAY_SIZE(rwperm)); } - if (info->type == LIBXL_DOMAIN_TYPE_HVM) - libxl__xs_mkdir(gc, t, - libxl__sprintf(gc, "%s/hvmloader/generation-id-address", dom_path), - rwperm, ARRAY_SIZE(rwperm)); - - vm_list = libxl_list_vm(ctx, &nb_vm); + vm_list = libxl_list_vm(ctx, &nb_vm); if (!vm_list) { LOG(ERROR, "cannot get number of running guests"); rc = ERROR_FAIL; @@ -903,7 +898,7 @@ static void domcreate_bootloader_done(libxl__egc *egc, goto out; } libxl__xc_domain_restore(egc, dcs, - hvm, pae, superpages, 1); + hvm, pae, superpages); return; out: @@ -911,7 +906,7 @@ static void domcreate_bootloader_done(libxl__egc *egc, } void libxl__srm_callout_callback_restore_results(unsigned long store_mfn, - unsigned long console_mfn, unsigned long genidad, void *user) + unsigned long console_mfn, void *user) { libxl__save_helper_state *shs = user; libxl__domain_create_state *dcs = CONTAINER_OF(shs, *dcs, shs); @@ -920,7 +915,6 @@ void libxl__srm_callout_callback_restore_results(unsigned long store_mfn, state->store_mfn = store_mfn; state->console_mfn = console_mfn; - state->vm_generationid_addr = genidad; shs->need_results = 0; } diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 8096d66..a63c31c 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -279,7 +279,6 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, state->store_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->store_domid); state->console_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->console_domid); - state->vm_generationid_addr = 0; if (info->type == LIBXL_DOMAIN_TYPE_HVM) hvm_set_conf_params(ctx->xch, domid, info); @@ -297,7 +296,7 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, libxl_ctx *ctx = libxl__gc_owner(gc); char *dom_path, *vm_path; xs_transaction_t t; - char **ents, **hvm_ents; + char **ents; int i, rc; rc = libxl_domain_sched_params_set(CTX, domid, &info->sched_params); @@ -334,13 +333,6 @@ int libxl__build_post(libxl__gc *gc, uint32_t domid, ? "online" : "offline"; } - hvm_ents = NULL; - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { - hvm_ents = libxl__calloc(gc, 3, sizeof(char *)); - hvm_ents[0] = "hvmloader/generation-id-address"; - hvm_ents[1] = GCSPRINTF("0x%lx", state->vm_generationid_addr); - } - dom_path = libxl__xs_get_dompath(gc, domid); if (!dom_path) { return ERROR_FAIL; @@ -351,9 +343,6 @@ retry_transaction: t = xs_transaction_start(ctx->xsh); libxl__xs_writev(gc, t, dom_path, ents); - if (info->type == LIBXL_DOMAIN_TYPE_HVM) - libxl__xs_writev(gc, t, dom_path, hvm_ents); - libxl__xs_writev(gc, t, dom_path, local_ents); libxl__xs_writev(gc, t, vm_path, vms_ents); @@ -1506,7 +1495,6 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss) STATE_AO_GC(dss->ao); int port; int rc = ERROR_FAIL; - unsigned long vm_generationid_addr; /* Convenience aliases */ const uint32_t domid = dss->domid; @@ -1525,19 +1513,10 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss) switch (type) { case LIBXL_DOMAIN_TYPE_HVM: { - char *path; - char *addr; - - path = GCSPRINTF("%s/hvmloader/generation-id-address", - libxl__xs_get_dompath(gc, domid)); - addr = libxl__xs_read(gc, XBT_NULL, path); - - vm_generationid_addr = (addr) ? strtoul(addr, NULL, 0) : 0; dss->hvm = 1; break; } case LIBXL_DOMAIN_TYPE_PV: - vm_generationid_addr = 0; dss->hvm = 0; break; default: @@ -1584,7 +1563,7 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss) callbacks->switch_qemu_logdirty = libxl__domain_suspend_common_switch_qemu_logdirty; dss->shs.callbacks.save.toolstack_save = libxl__toolstack_save; - libxl__xc_domain_save(egc, dss, vm_generationid_addr); + libxl__xc_domain_save(egc, dss); return; out: diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index a9343e8..d4f32a9 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -960,8 +960,6 @@ typedef struct { uint32_t console_domid; unsigned long console_mfn; - unsigned long vm_generationid_addr; - char *saved_state; libxl__file_reference pv_kernel; @@ -2791,8 +2789,7 @@ _hidden void libxl__domain_suspend(libxl__egc *egc, /* calls libxl__xc_domain_suspend_done when done */ -_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*, - unsigned long vm_generationid_addr); +_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*); /* If rc==0 then retval is the return value from xc_domain_save * and errnoval is the errno value it provided. * If rc!=0, retval and errnoval are undefined. */ @@ -2816,8 +2813,7 @@ _hidden int libxl__toolstack_save(uint32_t domid, uint8_t **buf, /* calls libxl__xc_domain_restore_done when done */ _hidden void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, - int hvm, int pae, int superpages, - int no_incr_generationid); + int hvm, int pae, int superpages); /* If rc==0 then retval is the return value from xc_domain_save * and errnoval is the errno value it provided. * If rc!=0, retval and errnoval are undefined. */ diff --git a/tools/libxl/libxl_save_callout.c b/tools/libxl/libxl_save_callout.c index c35da4d..1c9f806 100644 --- a/tools/libxl/libxl_save_callout.c +++ b/tools/libxl/libxl_save_callout.c @@ -41,8 +41,7 @@ static void helper_done(libxl__egc *egc, libxl__save_helper_state *shs); /*----- entrypoints -----*/ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, - int hvm, int pae, int superpages, - int no_incr_generationid) + int hvm, int pae, int superpages) { STATE_AO_GC(dcs->ao); @@ -59,7 +58,7 @@ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, state->store_port, state->store_domid, state->console_port, state->console_domid, - hvm, pae, superpages, no_incr_generationid, + hvm, pae, superpages, cbflags, dcs->checkpointed_stream, }; @@ -75,8 +74,7 @@ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, argnums, ARRAY_SIZE(argnums)); } -void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss, - unsigned long vm_generationid_addr) +void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss) { STATE_AO_GC(dss->ao); int r, rc, toolstack_data_fd = -1; @@ -112,7 +110,7 @@ void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss, } const unsigned long argnums[] = { - dss->domid, 0, 0, dss->xcflags, dss->hvm, vm_generationid_addr, + dss->domid, 0, 0, dss->xcflags, dss->hvm, toolstack_data_fd, toolstack_data_len, cbflags, }; diff --git a/tools/libxl/libxl_save_helper.c b/tools/libxl/libxl_save_helper.c index b259bd0..c760dd3 100644 --- a/tools/libxl/libxl_save_helper.c +++ b/tools/libxl/libxl_save_helper.c @@ -211,7 +211,6 @@ int main(int argc, char **argv) uint32_t max_factor = strtoul(NEXTARG,0,10); uint32_t flags = strtoul(NEXTARG,0,10); int hvm = atoi(NEXTARG); - unsigned long genidad = strtoul(NEXTARG,0,10); toolstack_save_fd = atoi(NEXTARG); toolstack_save_len = strtoul(NEXTARG,0,10); unsigned cbflags = strtoul(NEXTARG,0,10); @@ -224,7 +223,7 @@ int main(int argc, char **argv) startup("save"); r = xc_domain_save(xch, io_fd, dom, max_iters, max_factor, flags, - &helper_save_callbacks, hvm, genidad); + &helper_save_callbacks, hvm); complete(r); } else if (!strcmp(mode,"--restore-domain")) { @@ -238,7 +237,6 @@ int main(int argc, char **argv) unsigned int hvm = strtoul(NEXTARG,0,10); unsigned int pae = strtoul(NEXTARG,0,10); int superpages = strtoul(NEXTARG,0,10); - int no_incr_genidad = strtoul(NEXTARG,0,10); unsigned cbflags = strtoul(NEXTARG,0,10); int checkpointed = strtoul(NEXTARG,0,10); assert(!*++argv); @@ -247,15 +245,14 @@ int main(int argc, char **argv) unsigned long store_mfn = 0; unsigned long console_mfn = 0; - unsigned long genidad = 0; startup("restore"); r = xc_domain_restore(xch, io_fd, dom, store_evtchn, &store_mfn, store_domid, console_evtchn, &console_mfn, console_domid, hvm, pae, superpages, - no_incr_genidad, checkpointed, &genidad, + checkpointed, &helper_restore_callbacks); - helper_stub_restore_results(store_mfn,console_mfn,genidad,0); + helper_stub_restore_results(store_mfn,console_mfn,0); complete(r); } else { diff --git a/tools/libxl/libxl_save_msgs_gen.pl b/tools/libxl/libxl_save_msgs_gen.pl index 745e2ac..88f4921 100755 --- a/tools/libxl/libxl_save_msgs_gen.pl +++ b/tools/libxl/libxl_save_msgs_gen.pl @@ -32,8 +32,7 @@ our @msgs = ( [ 7, 'rcxW', "toolstack_restore", [qw(uint32_t domid BLOCK tsdata)] ], [ 8, 'r', "restore_results", ['unsigned long', 'store_mfn', - 'unsigned long', 'console_mfn', - 'unsigned long', 'genidad'] ], + 'unsigned long', 'console_mfn'] ], [ 9, 'srW', "complete", [qw(int retval int errnoval)] ], ); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |