[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] device-dm: Use SIGHUP before SIGKILL
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |