[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xenconsoled: clean-up after all dead domains
On Tue, 2012-08-21 at 17:24 +0100, David Vrabel wrote: > From: David Vrabel <david.vrabel@xxxxxxxxxx> > > xenconsoled expected domains that are being shutdown to end up in the > the DYING state and would only clean-up such domains. HVM domains > either didn't enter the DYING state or weren't in long enough for > xenconsoled to notice. > > For every shutdown HVM domain, xenconsoled would leak memory, grow its > list of domains and (if guest console logging was enabled) leak the > log file descriptor. If the file descriptors were leaked and enough > HVM domains were shutdown, no more console connections would work as > the evtchn device could not be opened. Guests would then block > waiting to send console output. > > Fix this by tagging domains that exist in enum_domains(). Afterwards, > all untagged domains are assumed to be dead and are shutdown and > cleaned up. > > Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> > --- > tools/console/daemon/io.c | 12 +++++++++++- > 1 files changed, 11 insertions(+), 1 deletions(-) > > diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c > index f09d63a..592085f 100644 > --- a/tools/console/daemon/io.c > +++ b/tools/console/daemon/io.c > @@ -84,6 +84,7 @@ struct domain { > int slave_fd; > int log_fd; > bool is_dead; > + unsigned last_seen; > struct buffer buffer; > struct domain *next; > char *conspath; > @@ -727,12 +728,16 @@ static void shutdown_domain(struct domain *d) > d->xce_handle = NULL; > } > > +static unsigned enum_pass = 0; > + > void enum_domains(void) > { > int domid = 1; > xc_dominfo_t dominfo; > struct domain *dom; > > + enum_pass++; > + > while (xc_domain_getinfo(xc, domid, 1, &dominfo) == 1) { > dom = lookup_domain(dominfo.domid); > if (dominfo.dying) { > @@ -740,8 +745,10 @@ void enum_domains(void) > shutdown_domain(dom); > } else { > if (dom == NULL) > - create_domain(dominfo.domid); > + dom = create_domain(dominfo.domid); > } > + if (dom) > + dom->last_seen = enum_pass; Dereferencing dom here safe if you took the dominfo.dying => shutdown_domain path above because that doesn't free dom, it sets is_dead which is picked up by the cleanup_domain below. Setting last_seen in this case avoids calling shutdown_domain twice, which is good, if a little subtle. I also had a look for threading since that would cause this to break down but this function is only every called from the same thread as is running handle_io, I was concerned because xs watches are involved but it's ok. So: Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > domid = dominfo.domid + 1; > } > } > @@ -1068,6 +1075,9 @@ void handle_io(void) > if (d->master_fd != -1 && FD_ISSET(d->master_fd, > &writefds)) > handle_tty_write(d); > + > + if (d->last_seen != enum_pass) > + shutdown_domain(d); > > if (d->is_dead) > cleanup_domain(d); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |