]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
python/qemu: Kill QEMU process if 'quit' doesn't work
authorKevin Wolf <kwolf@redhat.com>
Fri, 13 Mar 2020 08:36:16 +0000 (09:36 +0100)
committerPeter Maydell <peter.maydell@linaro.org>
Sat, 21 Mar 2020 22:37:32 +0000 (22:37 +0000)
With a QEMU bug, it can happen that the QEMU process doesn't react to a
'quit' QMP command. If we got an exception during previous QMP
communication (e.g. iotests Timeout expiring), we could also be in an
inconsistent state where after sending 'quit' we immediately read an old
response and close the socket even though the 'quit' command wasn't
processed yet. Both cases would lead to a hanging test.

Fix this by waiting for the QEMU process to exit after sending 'quit'
with a timeout, and if it doesn't happen within three seconds, send
SIGKILL.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-id: 20200313083617.8326-3-kwolf@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
python/qemu/machine.py

index f53abfa4920dd38ff34e633ecdf0274e5be222e0..b9a98e2c862767a3e639fbb359cf9fa9b7b2d221 100644 (file)
@@ -359,6 +359,7 @@ class QEMUMachine(object):
                     if not has_quit:
                         self._qmp.cmd('quit')
                     self._qmp.close()
+                    self._popen.wait(timeout=3)
                 except:
                     self._popen.kill()
             self._popen.wait()