|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 04/18] libxl/save: Refactor libxl__domain_suspend_state
On Tue, Jan 26, 2016 at 10:23:52AM +0800, Wen Congyang wrote:
> On 01/26/2016 01:29 AM, Konrad Rzeszutek Wilk wrote:
> > .snip..
> >> --- a/tools/libxl/libxl_dom_suspend.c
> >> +++ b/tools/libxl/libxl_dom_suspend.c
> >> @@ -19,14 +19,71 @@
> >>
> >> /*====================== Domain suspend =======================*/
> >>
> >> +int libxl__domain_suspend_init(libxl__egc *egc,
> >> + libxl__domain_suspend_state *dsps)
> >> +{
> >> + STATE_AO_GC(dsps->ao);
> >> + int rc = ERROR_FAIL;
> >> + int port;
> >> + libxl_domain_type type;
> >> +
> >> + /* Convenience aliases */
> >> + const uint32_t domid = dsps->domid;
> >> +
> >> + type = libxl__domain_type(gc, domid);
> >> + switch (type) {
> >> + case LIBXL_DOMAIN_TYPE_HVM: {
> >> + dsps->hvm = 1;
> >> + break;
> >> + }
> >> + case LIBXL_DOMAIN_TYPE_PV:
> >> + dsps->hvm = 0;
> >> + break;
> >> + default:
> >> + goto out;
> >
> > This will mean we return back to libxl__domain_save which will goto out
> > which calls:
> > domain_save_done. And that will try to use the dsps->guestevtchn leading to
> > a crash since:
>
> Yes, thanks for pointing it out. In which case, the type is not HVM or PV?
If you call those init routines before the switch statemet - such as the
libxl__xswait_init, etc, then you can still goto out
>
> >> + }
> >> +
> >> + libxl__xswait_init(&dsps->pvcontrol);
> >> + libxl__ev_evtchn_init(&dsps->guest_evtchn);
> >
> > we initialize them here.
> >> + libxl__ev_xswatch_init(&dsps->guest_watch);
> >> + libxl__ev_time_init(&dsps->guest_timeout);
> >
> > I would instead recommend you move these initialization routines above the
> > 'type' check.
>
> I think we should not return ERROR_FAIL when the type is not PV or HVM. We
> should abort the program
> like what we do in libxl__domain_save().
I would rather return - this is a library after all - so the controlling
program should
do such drastic measures - not an library.
>
> >
> >> +
> >> + dsps->guest_evtchn.port = -1;
> >> + dsps->guest_evtchn_lockfd = -1;
> >> + dsps->guest_responded = 0;
> >> + dsps->dm_savefile = libxl__device_model_savefile(gc, domid);
> >> +
> >> + port = xs_suspend_evtchn_port(domid);
> >> +
> >> + if (port >= 0) {
> >> + rc = libxl__ctx_evtchn_init(gc);
> >> + if (rc) goto out;
> >> +
> >> + dsps->guest_evtchn.port =
> >> + xc_suspend_evtchn_init_exclusive(CTX->xch, CTX->xce,
> >> + domid, port,
> >> &dsps->guest_evtchn_lockfd);
> >> +
> >> + if (dsps->guest_evtchn.port < 0) {
> >> + LOG(WARN, "Suspend event channel initialization failed");
> >> + rc = ERROR_FAIL;
> >> + goto out;
> >> + }
> >> + }
> >> +
> >> + rc = 0;
> >> +
> >> +out:
> >> + return rc;
> >> +}
> >> +
> >
> > .. snip..
> >> struct libxl__domain_suspend_state {
> >> + /* set by caller of libxl__domain_suspend_init */
> >> + libxl__ao *ao;
> >> + uint32_t domid;
> >> +
> >> + /* private */
> >> + int hvm;
> >
> > How about 'is_hvm' and just use 'libxl_domain_type' type?
> > instead of having an int? You can just do:
>
> In dss, it is 'int hvm'.
> Before this patch:
> if (dss->hvm) ...
> After this patch:
> if (dsps->hvm) ...
Right..
>
> Thanks
> Wen Congyang
>
> >
> > if (type == LIBXL_DOMAIN_TYPE_HVM) ..
But what if you use that? As in dsps->type == LIBXL_DOMAIAN_TYPE_HVM for
example?
> >
> > And to check for non-conforming types - you can make
> > libxl__domain_suspend_init
> > do this:
> >
> > if (type == LIBXL_DOMAIN_TYPE_INVALID) {
> > rc = ERROR_FAIL;
> > goto out;
> > }
> >
> > ?
> >
> >
> > .
> >
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |