[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


 


Rackspace

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