From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O2jII-0005HF-H0 for qemu-devel@nongnu.org; Fri, 16 Apr 2010 07:01:06 -0400 Received: from [140.186.70.92] (port=51789 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O2jIE-0005Bz-0A for qemu-devel@nongnu.org; Fri, 16 Apr 2010 07:01:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O2jIA-0003se-2f for qemu-devel@nongnu.org; Fri, 16 Apr 2010 07:01:01 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56347) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O2jI9-0003s1-R4 for qemu-devel@nongnu.org; Fri, 16 Apr 2010 07:00:58 -0400 Date: Fri, 16 Apr 2010 12:00:48 +0100 From: "Daniel P. Berrange" Subject: Re: [Qemu-devel] [FOR 0.12][PATCH] monitor: Accept input only byte-wise Message-ID: <20100416110044.GC5048@redhat.com> References: <4B190919.9040602@siemens.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4B190919.9040602@siemens.com> Reply-To: "Daniel P. Berrange" List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jan Kiszka Cc: Anthony Liguori , qemu-devel On Fri, Dec 04, 2009 at 02:05:29PM +0100, Jan Kiszka wrote: > This allows to suspend command interpretation and execution > synchronously, e.g. during migration. > > Signed-off-by: Jan Kiszka > --- > > monitor.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/monitor.c b/monitor.c > index 3286ba2..a3be1c8 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -3418,7 +3418,7 @@ static int monitor_can_read(void *opaque) > { > Monitor *mon = opaque; > > - return (mon->suspend_cnt == 0) ? 128 : 0; > + return (mon->suspend_cnt == 0) ? 1 : 0; > } > > static void monitor_read(void *opaque, const uint8_t *buf, int size) FYI, this change seems to have broken the 'getfd' command in the monitor. Any attempt to use this command (in both text + json modes) is currently returning "No file descriptor supplied via SCM_RIGHTS" Reverting this change makes getfd work again for me. Strace of libvirtd shows it sending the command + FD in one message: sendmsg(18, {msg_name(0)=NULL, msg_iov(1)=[{"getfd fd-net2\r", 14}], msg_controllen=24, {cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, {16}}, msg_flags=0}, 0) = 14 Strace of qemu shows that it receives the FD ok, but immediately closes it before finishing reading the actual monitor command with which it is associated: [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"g", 1}], msg_controllen=24, {cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, {17}}, msg_flags=0}, 0) = 1 [pid 31941] close(17) = 0 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"e", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"t", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"f", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"d", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{" ", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"f", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"d", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"-", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"n", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"e", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"t", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"2", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 [pid 31941] recvmsg(16, {msg_name(0)=NULL, msg_iov(1)=[{"\r", 1}], msg_controllen=0, msg_flags=0}, 0) = 1 The QEMU code appears to be written to assume that it will recvmsg() a complete monitor command in one go + process that, because it closes the FD the moment the data from any recvmsg() is dealt with. Regards, Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|