|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [Patch] Xen/migration: Add hvm resume support when migration fail
Just a little curious: why currently hvm guest resume not supported when it
migrate fail? I went through migration logic but didn't find obvious reason to
do so (not support hvm resume).
Thanks,
Jinsong
Liu, Jinsong wrote:
> Xen/migration: Add hvm resume support when migration fail
>
> Currently when hvm guest migrate fail, it cannot be resumed at sender
> side, under such case guest would run in neither sender nor target
> machine.
>
> This patch add hvm guest resume support, draft test shows it re-run
> fine
> at sender machine when hvm guest migrate fail.
>
> Signed-off-by: Liu, Jinsong <jinsong.liu@xxxxxxxxx>
>
> diff -r 0f47a60f9e6d tools/libxc/xc_resume.c
> --- a/tools/libxc/xc_resume.c Thu Jul 26 22:52:10 2012 +0800
> +++ b/tools/libxc/xc_resume.c Sat Jul 28 06:35:47 2012 +0800
> @@ -140,87 +140,84 @@
> /*
> * (x86 only) Rewrite store_mfn and console_mfn back to MFN
> (from PFN). */
> + if ( !info.hvm )
> + {
> #if defined(__i386__) || defined(__x86_64__)
> - if ( info.hvm )
> - {
> - ERROR("Cannot resume uncooperative HVM guests");
> - return rc;
> - }
> + dinfo->guest_width = pv_guest_width(xch, domid);
> + if ( dinfo->guest_width != sizeof(long) )
> + {
> + ERROR("Cannot resume uncooperative cross-address-size
> guests"); + return rc;
> + }
>
> - dinfo->guest_width = pv_guest_width(xch, domid);
> - if ( dinfo->guest_width != sizeof(long) )
> - {
> - ERROR("Cannot resume uncooperative cross-address-size
> guests");
> - return rc;
> - }
> + /* Map the shared info frame */
> + shinfo = xc_map_foreign_range(xch, domid, PAGE_SIZE,
> + PROT_READ,
> info.shared_info_frame); + if ( shinfo == NULL )
> + {
> + ERROR("Couldn't map shared info");
> + goto out;
> + }
>
> - /* Map the shared info frame */
> - shinfo = xc_map_foreign_range(xch, domid, PAGE_SIZE,
> - PROT_READ, info.shared_info_frame);
> - if ( shinfo == NULL )
> - {
> - ERROR("Couldn't map shared info");
> - goto out;
> - }
> + dinfo->p2m_size = shinfo->arch.max_pfn;
>
> - dinfo->p2m_size = shinfo->arch.max_pfn;
> + p2m_frame_list_list =
> + xc_map_foreign_range(xch, domid, PAGE_SIZE, PROT_READ,
> +
> shinfo->arch.pfn_to_mfn_frame_list_list); + if (
> p2m_frame_list_list == NULL ) + {
> + ERROR("Couldn't map p2m_frame_list_list");
> + goto out;
> + }
>
> - p2m_frame_list_list =
> - xc_map_foreign_range(xch, domid, PAGE_SIZE, PROT_READ,
> -
> shinfo->arch.pfn_to_mfn_frame_list_list);
> - if ( p2m_frame_list_list == NULL )
> - {
> - ERROR("Couldn't map p2m_frame_list_list");
> - goto out;
> - }
> + p2m_frame_list = xc_map_foreign_pages(xch, domid, PROT_READ,
> + p2m_frame_list_list,
> + P2M_FLL_ENTRIES);
> + if ( p2m_frame_list == NULL )
> + {
> + ERROR("Couldn't map p2m_frame_list");
> + goto out;
> + }
>
> - p2m_frame_list = xc_map_foreign_pages(xch, domid, PROT_READ,
> - p2m_frame_list_list,
> - P2M_FLL_ENTRIES);
> - if ( p2m_frame_list == NULL )
> - {
> - ERROR("Couldn't map p2m_frame_list");
> - goto out;
> - }
> + /* Map all the frames of the pfn->mfn table. For migrate to
> succeed, + the guest must not change which frames are used
> for this purpose. + (its not clear why it would want to
> change them, and we'll be OK + from a safety POV anyhow. */
> + p2m = xc_map_foreign_pages(xch, domid, PROT_READ,
> + p2m_frame_list,
> + P2M_FL_ENTRIES);
> + if ( p2m == NULL )
> + {
> + ERROR("Couldn't map p2m table");
> + goto out;
> + }
>
> - /* Map all the frames of the pfn->mfn table. For migrate to
> succeed,
> - the guest must not change which frames are used for this
> purpose.
> - (its not clear why it would want to change them, and we'll be
> OK
> - from a safety POV anyhow. */
> - p2m = xc_map_foreign_pages(xch, domid, PROT_READ,
> - p2m_frame_list,
> - P2M_FL_ENTRIES);
> - if ( p2m == NULL )
> - {
> - ERROR("Couldn't map p2m table");
> - goto out;
> - }
> + if ( xc_vcpu_getcontext(xch, domid, 0, &ctxt) )
> + {
> + ERROR("Could not get vcpu context");
> + goto out;
> + }
>
> - if ( xc_vcpu_getcontext(xch, domid, 0, &ctxt) )
> - {
> - ERROR("Could not get vcpu context");
> - goto out;
> - }
> + mfn = GET_FIELD(&ctxt, user_regs.edx);
>
> - mfn = GET_FIELD(&ctxt, user_regs.edx);
> + start_info = xc_map_foreign_range(xch, domid, PAGE_SIZE,
> + PROT_READ | PROT_WRITE,
> mfn); + if ( start_info == NULL )
> + {
> + ERROR("Couldn't map start_info");
> + goto out;
> + }
>
> - start_info = xc_map_foreign_range(xch, domid, PAGE_SIZE,
> - PROT_READ | PROT_WRITE, mfn);
> - if ( start_info == NULL )
> - {
> - ERROR("Couldn't map start_info");
> - goto out;
> - }
> + start_info->store_mfn = p2m[start_info->store_mfn];
> + start_info->console.domU.mfn =
> p2m[start_info->console.domU.mfn];
>
> - start_info->store_mfn = p2m[start_info->store_mfn];
> - start_info->console.domU.mfn = p2m[start_info->console.domU.mfn];
> -
> - munmap(start_info, PAGE_SIZE);
> + munmap(start_info, PAGE_SIZE);
> #endif /* defined(__i386__) || defined(__x86_64__) */
>
> - /* Reset all secondary CPU states. */
> - for ( i = 1; i <= info.max_vcpu_id; i++ )
> - xc_vcpu_setcontext(xch, domid, i, NULL);
> + /* Reset all secondary CPU states. */
> + for ( i = 1; i <= info.max_vcpu_id; i++ )
> + xc_vcpu_setcontext(xch, domid, i, NULL);
> + }
>
> /* Ready to resume domain execution now. */
> domctl.cmd = XEN_DOMCTL_resumedomain;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |