From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xensource.com
Cc: David Vrabel <david.vrabel@citrix.com>
Subject: [PATCH] xenconsoled: clean-up after all dead domains
Date: Tue, 21 Aug 2012 17:24:25 +0100 [thread overview]
Message-ID: <1345566265-11618-1-git-send-email-david.vrabel@citrix.com> (raw)
From: David Vrabel <david.vrabel@citrix.com>
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@citrix.com>
---
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;
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);
--
1.7.2.5
next reply other threads:[~2012-08-21 16:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-21 16:24 David Vrabel [this message]
2012-08-23 8:48 ` [PATCH] xenconsoled: clean-up after all dead domains Ian Campbell
2012-08-30 15:14 ` Ian Jackson
2012-08-31 9:43 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1345566265-11618-1-git-send-email-david.vrabel@citrix.com \
--to=david.vrabel@citrix.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).