[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 4/5] libxl: wait for stubdom to be ready



On Wed, Mar 18, 2015 at 01:35:15PM +0000, Ian Campbell wrote:
> On Fri, 2015-03-13 at 10:34 +0000, Wei Liu wrote:
> > Watch /local/domain/$dm_domid/device-model/$domid/state, wait until
> > state turns "running" then unpause guest.
> > 
> > LIBXL_STUBDOM_START_TIMEOUT is the timeout used wait for stubdom to be
> > ready. My test on a very old machine (Core 2 6400) showed that it might
> > need more than 20s before the stubdom is ready to serve DomU.
> > 
> > Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> > ---
> >  tools/libxl/libxl_dm.c       | 39 ++++++++++++++++++++++++++++++++++++++-
> >  tools/libxl/libxl_internal.h |  2 ++
> >  2 files changed, 40 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> > index 4a38455..ad2ef41 100644
> > --- a/tools/libxl/libxl_dm.c
> > +++ b/tools/libxl/libxl_dm.c
> > @@ -984,6 +984,8 @@ static void stubdom_pvqemu_cb(libxl__egc *egc,
> >  static void spawn_stubdom_pvqemu_destroy_cb(libxl__egc *egc,
> >                                              libxl__destroy_domid_state 
> > *dis,
> >                                              int rc);
> > +static void stubdom_xswait_cb(libxl__egc *egc, libxl__xswait_state *xswait,
> > +                              int rc, const char *p);
> >  
> >  char *libxl__stub_dm_name(libxl__gc *gc, const char *guest_name)
> >  {
> > @@ -1273,16 +1275,51 @@ static void stubdom_pvqemu_cb(libxl__egc *egc,
> >      rc = libxl_domain_unpause(CTX, dm_domid);
> >      if (rc) goto out;
> >  
> > +    libxl__xswait_init(&sdss->xswait);
> > +    sdss->xswait.ao = ao;
> > +    sdss->xswait.what = GCSPRINTF("Stubdom %d startup", dm_domid);
> 
> Maybe include the domid too, e.g. "Stubdom %d for dom %d startup"?
> 
> (And probably %u throughout?)
> 

Ack.

> > +static void stubdom_xswait_cb(libxl__egc *egc, libxl__xswait_state *xswait,
> > +                              int rc, const char *p)
> > +{
> > +    EGC_GC;
> > +    libxl__stub_dm_spawn_state *sdss = CONTAINER_OF(xswait, *sdss, xswait);
> > +    uint32_t dm_domid = sdss->pvqemu.guest_domid;
> > +
> > +    if (rc) {
> > +        if (rc == ERROR_TIMEDOUT)
> > +            LOG(ERROR, "%s: startup timed out", xswait->what);
> > +        goto out;
> > +    }
> > +
> > +    if (!p) return;
> > +
> > +    if (strcmp(p, "running"))
> > +        return;
> >   out:
> >      if (rc) {
> >          if (dm_domid) {
> > -            sdss->dis.ao = ao;
> > +            sdss->dis.ao = sdss->dm.spawn.ao;
> >              sdss->dis.domid = dm_domid;
> >              sdss->dis.callback = spawn_stubdom_pvqemu_destroy_cb;
> >              libxl__destroy_domid(egc, &sdss->dis);
> > +            libxl__xswait_stop(gc, xswait);
> 
> Can you do this once befire the if (rc)?
> 

I think so.

Wei.

> Ian.
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.