# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1202813869 0
# Node ID bd09d9692bda873687662c321c426169db164eed
# Parent c3fd43049492d039302a7285579e1acf08c60f73
device-dm: Use SIGHUP before SIGKILL
Make qemu unblock SIGHUP and make sure the default handler is in
place. Have the domain killer send SIGHUP to the device-model script,
allow the script 10s to clean up, and if still not dead, send
SIGKILL.
Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx>
---
tools/ioemu/vl.c | 6 ++++--
tools/python/xen/xend/image.py | 17 ++++++++++++++---
2 files changed, 18 insertions(+), 5 deletions(-)
diff -r c3fd43049492 -r bd09d9692bda tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Tue Feb 12 10:19:12 2008 +0000
+++ b/tools/ioemu/vl.c Tue Feb 12 10:57:49 2008 +0000
@@ -7928,11 +7928,13 @@ int main(int argc, char **argv)
}
#endif
- /* Unblock SIGTERM, which may have been blocked by the caller */
+ /* Unblock SIGTERM and SIGHUP, which may have been blocked by the caller */
+ signal(SIGHUP, SIG_DFL);
sigemptyset(&set);
sigaddset(&set, SIGTERM);
+ sigaddset(&set, SIGHUP);
if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1)
- fprintf(stderr, "Failed to unblock SIGTERM\n");
+ fprintf(stderr, "Failed to unblock SIGTERM and SIGHUP\n");
main_loop();
quit_timers();
diff -r c3fd43049492 -r bd09d9692bda tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Tue Feb 12 10:19:12 2008 +0000
+++ b/tools/python/xen/xend/image.py Tue Feb 12 10:57:49 2008 +0000
@@ -335,16 +335,27 @@ class ImageHandler:
return
if self.pid:
try:
- os.kill(self.pid, signal.SIGKILL)
+ os.kill(self.pid, signal.SIGHUP)
except OSError, exn:
log.exception(exn)
try:
- os.waitpid(self.pid, 0)
+ # Try to reap the child every 100ms for 10s. Then SIGKILL it.
+ for i in xrange(100):
+ (p, rv) = os.waitpid(self.pid, os.WNOHANG)
+ if p == self.pid:
+ break
+ time.sleep(0.1)
+ else:
+ log.warning("DeviceModel %d took more than 10s "
+ "to terminate: sending SIGKILL" % self.pid)
+ os.kill(self.pid, signal.SIGKILL)
+ os.waitpid(self.pid, 0)
except OSError, exn:
# This is expected if Xend has been restarted within the
# life of this domain. In this case, we can kill the process,
# but we can't wait for it because it's not our child.
- pass
+ # We just make really sure it's going away (SIGKILL) first.
+ os.kill(self.pid, signal.SIGKILL)
self.pid = None
state = xstransact.Remove("/local/domain/0/device-model/%i"
% self.vm.getDomid())
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|