From nobody Fri May 3 08:51:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500373149695475.8905752873969; Tue, 18 Jul 2017 03:19:09 -0700 (PDT) Received: from localhost ([::1]:55227 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXPau-0003O0-DR for importer@patchew.org; Tue, 18 Jul 2017 06:19:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37386) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXPYE-0001dE-TI for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXPYE-0006zg-1X for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:22 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38778) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dXPYD-0006y9-RS for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:21 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DF4D87A167 for ; Tue, 18 Jul 2017 10:16:20 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-190.brq.redhat.com [10.40.204.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3DC316A542; Tue, 18 Jul 2017 10:16:07 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DF4D87A167 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=apahim@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com DF4D87A167 From: Amador Pahim To: qemu-devel@nongnu.org Date: Tue, 18 Jul 2017 12:15:19 +0200 Message-Id: <20170718101521.1223-2-apahim@redhat.com> In-Reply-To: <20170718101521.1223-1-apahim@redhat.com> References: <20170718101521.1223-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 18 Jul 2017 10:16:21 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/3] qemu.py: fix is_running() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ldoktor@redhat.com, Amador Pahim , armbru@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Current implementation is broken. It does not really test if the child process is running. The Popen.returncode will only be set after by a poll(), wait() or communicate(). If the Popen fails to launch a VM, the Popen.returncode will not turn to None by itself. Instead of using Popen.returncode, let's use Popen.poll(), which actually checks if child process has terminated. Signed-off-by: Amador Pahim --- scripts/qemu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index 880e3e8219..f0fade32bd 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -86,7 +86,7 @@ class QEMUMachine(object): raise =20 def is_running(self): - return self._popen and (self._popen.returncode is None) + return self._popen and (self._popen.poll() is None) =20 def exitcode(self): if self._popen is None: --=20 2.13.3 From nobody Fri May 3 08:51:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500373116523179.3626066908164; Tue, 18 Jul 2017 03:18:36 -0700 (PDT) Received: from localhost ([::1]:55226 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXPaN-00030F-Be for importer@patchew.org; Tue, 18 Jul 2017 06:18:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37407) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXPYM-0001ha-0H for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXPYI-00070Q-S6 for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33780) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dXPYI-00070J-Im for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:26 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 96B1D356ED for ; Tue, 18 Jul 2017 10:16:25 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-190.brq.redhat.com [10.40.204.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA3A35C88F; Tue, 18 Jul 2017 10:16:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 96B1D356ED Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=apahim@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 96B1D356ED From: Amador Pahim To: qemu-devel@nongnu.org Date: Tue, 18 Jul 2017 12:15:20 +0200 Message-Id: <20170718101521.1223-3-apahim@redhat.com> In-Reply-To: <20170718101521.1223-1-apahim@redhat.com> References: <20170718101521.1223-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 18 Jul 2017 10:16:25 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 2/3] qemu.py: include debug information on launch error X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ldoktor@redhat.com, Amador Pahim , armbru@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When launching a VM, if an exception happens and the VM is not initiated, it is useful to see the qemu command line that was executed and the output of that command. Before the patch: >>> VM =3D qemu.QEMUMachine('../aarch64-softmmu/qemu-system-aarch64') >>> VM.launch() Traceback (most recent call last): File "", line 1, in File "qemu.py", line 137, in launch self._post_launch() File "qemu.py", line 121, in _post_launch self._qmp.accept() File "qmp/qmp.py", line 145, in accept self.__sock, _ =3D self.__sock.accept() File "/usr/lib64/python2.7/socket.py", line 206, in accept sock, addr =3D self._sock.accept() socket.timeout: timed out After the patch: >>> VM =3D qemu.QEMUMachine('../aarch64-softmmu/qemu-system-aarch64') >>> VM.launch() Traceback (most recent call last): File "", line 1, in File "qemu.py", line 156, in launch raise RuntimeError(msg) RuntimeError: Error launching VM. Original Exception: Traceback (most recent call last): File "qemu.py", line 138, in launch self._post_launch() File "qemu.py", line 122, in _post_launch self._qmp.accept() File "qmp/qmp.py", line 145, in accept self.__sock, _ =3D self.__sock.accept() File "/usr/lib64/python2.7/socket.py", line 206, in accept sock, addr =3D self._sock.accept() timeout: timed out Command: /usr/bin/qemu-system-aarch64 -chardev socket,id=3Dmon, path=3D/var/tmp/qemu-23958-monitor.sock -mon chardev=3Dmon,mode=3Dcontr= ol -display none -vga none Output: qemu-system-aarch64: No machine specified, and there is no default Use -machine help to list supported machines Also, if the launch() faces an exception, the 'except' now will use args to fill the debug information. So this patch assigns 'args' earlier, assuring it will be available for the 'except'. Signed-off-by: Amador Pahim --- scripts/qemu.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index f0fade32bd..cf47df4932 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -18,6 +18,7 @@ import os import sys import subprocess import qmp.qmp +import traceback =20 =20 class QEMUMachine(object): @@ -129,17 +130,30 @@ class QEMUMachine(object): '''Launch the VM and establish a QMP connection''' devnull =3D open('/dev/null', 'rb') qemulog =3D open(self._qemu_log_path, 'wb') + args =3D self._wrapper + [self._binary] + self._base_args() + self= .args try: self._pre_launch() - args =3D self._wrapper + [self._binary] + self._base_args() + = self._args self._popen =3D subprocess.Popen(args, stdin=3Ddevnull, stdout= =3Dqemulog, stderr=3Dsubprocess.STDOUT, she= ll=3DFalse) self._post_launch() except: + self._load_io_log() if self.is_running(): self._popen.kill() self._popen.wait() - self._load_io_log() + else: + exc_type, exc_value, exc_traceback =3D sys.exc_info() + msg =3D ("Error launching VM.\n" + "Original Exception: \n%s\n" + "Command:\n%s\n" + "Output:\n%s\n" % + (''.join(traceback.format_exception(exc_type, + exc_value, + exc_traceback)), + ' '.join(args), + self._iolog)) + self._post_shutdown() + raise RuntimeError(msg) self._post_shutdown() raise =20 --=20 2.13.3 From nobody Fri May 3 08:51:17 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1500373221441958.8291333234143; Tue, 18 Jul 2017 03:20:21 -0700 (PDT) Received: from localhost ([::1]:55230 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXPc2-00049Q-O5 for importer@patchew.org; Tue, 18 Jul 2017 06:20:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37425) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dXPYP-0001kI-LF for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dXPYO-000718-JJ for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53804) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dXPYO-00070z-9v for qemu-devel@nongnu.org; Tue, 18 Jul 2017 06:16:32 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 564A77CB8C for ; Tue, 18 Jul 2017 10:16:31 +0000 (UTC) Received: from t460p.pahim.org.com (ovpn-204-190.brq.redhat.com [10.40.204.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3423817538; Tue, 18 Jul 2017 10:16:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 564A77CB8C Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=apahim@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 564A77CB8C From: Amador Pahim To: qemu-devel@nongnu.org Date: Tue, 18 Jul 2017 12:15:21 +0200 Message-Id: <20170718101521.1223-4-apahim@redhat.com> In-Reply-To: <20170718101521.1223-1-apahim@redhat.com> References: <20170718101521.1223-1-apahim@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 18 Jul 2017 10:16:31 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/3] qemu.py: make 'args' public X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ldoktor@redhat.com, Amador Pahim , armbru@redhat.com, crosa@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Let's make args public so users can extend it without felling like abusing the internal API. Signed-off-by: Amador Pahim --- scripts/qemu.py | 12 ++++++------ tests/qemu-iotests/iotests.py | 18 +++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/scripts/qemu.py b/scripts/qemu.py index cf47df4932..d3e19ad695 100644 --- a/scripts/qemu.py +++ b/scripts/qemu.py @@ -34,7 +34,7 @@ class QEMUMachine(object): self._qemu_log_path =3D os.path.join(test_dir, name + ".log") self._popen =3D None self._binary =3D binary - self._args =3D list(args) # Force copy args in case we modify them + self.args =3D list(args) # Force copy args in case we modify them self._wrapper =3D wrapper self._events =3D [] self._iolog =3D None @@ -44,8 +44,8 @@ class QEMUMachine(object): # This can be used to add an unused monitor instance. def add_monitor_telnet(self, ip, port): args =3D 'tcp:%s:%d,server,nowait,telnet' % (ip, port) - self._args.append('-monitor') - self._args.append(args) + self.args.append('-monitor') + self.args.append(args) =20 def add_fd(self, fd, fdset, opaque, opts=3D''): '''Pass a file descriptor to the VM''' @@ -55,8 +55,8 @@ class QEMUMachine(object): if opts: options.append(opts) =20 - self._args.append('-add-fd') - self._args.append(','.join(options)) + self.args.append('-add-fd') + self.args.append(','.join(options)) return self =20 def send_fd_scm(self, fd_file_path): @@ -168,7 +168,7 @@ class QEMUMachine(object): =20 exitcode =3D self._popen.wait() if exitcode < 0: - sys.stderr.write('qemu received signal %i: %s\n' % (-exitc= ode, ' '.join(self._args))) + sys.stderr.write('qemu received signal %i: %s\n' % (-exitc= ode, ' '.join(self.args))) self._load_io_log() self._post_shutdown() =20 diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index abcf3c10e2..6925d8841e 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -150,13 +150,13 @@ class VM(qtest.QEMUQtestMachine): self._num_drives =3D 0 =20 def add_device(self, opts): - self._args.append('-device') - self._args.append(opts) + self.args.append('-device') + self.args.append(opts) return self =20 def add_drive_raw(self, opts): - self._args.append('-drive') - self._args.append(opts) + self.args.append('-drive') + self.args.append(opts) return self =20 def add_drive(self, path, opts=3D'', interface=3D'virtio', format=3Dim= gfmt): @@ -172,17 +172,17 @@ class VM(qtest.QEMUQtestMachine): if opts: options.append(opts) =20 - self._args.append('-drive') - self._args.append(','.join(options)) + self.args.append('-drive') + self.args.append(','.join(options)) self._num_drives +=3D 1 return self =20 def add_blockdev(self, opts): - self._args.append('-blockdev') + self.args.append('-blockdev') if isinstance(opts, str): - self._args.append(opts) + self.args.append(opts) else: - self._args.append(','.join(opts)) + self.args.append(','.join(opts)) return self =20 def pause_drive(self, drive, event=3DNone): --=20 2.13.3