From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=33427 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OnIUk-0007rO-Cz for qemu-devel@nongnu.org; Sun, 22 Aug 2010 17:54:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OnIUS-00005K-OI for qemu-devel@nongnu.org; Sun, 22 Aug 2010 17:54:09 -0400 Received: from mail-gy0-f173.google.com ([209.85.160.173]:58506) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OnIUS-00005D-Kb for qemu-devel@nongnu.org; Sun, 22 Aug 2010 17:54:08 -0400 Received: by gyh4 with SMTP id 4so2067589gyh.4 for ; Sun, 22 Aug 2010 14:54:07 -0700 (PDT) Message-ID: <4C719C7E.6030606@codemonkey.ws> Date: Sun, 22 Aug 2010 16:54:06 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH V2] balloon: Don't try fetching info if machine is stopped References: <8450ea8e785c9049f0b3edddc01650a8c4b9ffe7.1282265244.git.amit.shah@redhat.com> In-Reply-To: <8450ea8e785c9049f0b3edddc01650a8c4b9ffe7.1282265244.git.amit.shah@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Amit Shah Cc: Paolo Bonzini , agl@us.ibm.com, qemu list , Juan Quintela On 08/19/2010 07:48 PM, Amit Shah wrote: > If the machine is stopped and 'info balloon' is invoked, the monitor > process just hangs waiting for info from the guest. Return the most > recent balloon data in that case. > > See https://bugzilla.redhat.com/show_bug.cgi?id=623903 > > Reported-by: > Signed-off-by: Amit Shah > !vm_running is just a special case of an unresponsive guest. Even if the guest was running, if it was oops'd and the administrator didn't know, you would have the same issue. I'd suggest using a timeout based on rt_clock. If the stats request times out, print an appropriate message to the user. Regards, Anthony Liguori > --- > v2: simplify call to qemu_balloon_status - Paulo > > balloon.c | 11 +++++++---- > balloon.h | 6 ++++-- > hw/virtio-balloon.c | 9 +++++++-- > 3 files changed, 18 insertions(+), 8 deletions(-) > > diff --git a/balloon.c b/balloon.c > index 8e0b7f1..8b05d20 100644 > --- a/balloon.c > +++ b/balloon.c > @@ -43,17 +43,20 @@ void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque) > int qemu_balloon(ram_addr_t target, MonitorCompletion cb, void *opaque) > { > if (qemu_balloon_event) { > - qemu_balloon_event(qemu_balloon_event_opaque, target, cb, opaque); > + qemu_balloon_event(qemu_balloon_event_opaque, target, cb, opaque, > + false); > return 1; > } else { > return 0; > } > } > > -int qemu_balloon_status(MonitorCompletion cb, void *opaque) > +int qemu_balloon_status(MonitorCompletion cb, void *opaque, > + bool get_cached_data) > { > if (qemu_balloon_event) { > - qemu_balloon_event(qemu_balloon_event_opaque, 0, cb, opaque); > + qemu_balloon_event(qemu_balloon_event_opaque, 0, cb, opaque, > + get_cached_data); > return 1; > } else { > return 0; > @@ -113,7 +116,7 @@ int do_info_balloon(Monitor *mon, MonitorCompletion cb, void *opaque) > return -1; > } > > - ret = qemu_balloon_status(cb, opaque); > + ret = qemu_balloon_status(cb, opaque, !vm_running); > if (!ret) { > qerror_report(QERR_DEVICE_NOT_ACTIVE, "balloon"); > return -1; > diff --git a/balloon.h b/balloon.h > index d478e28..729631c 100644 > --- a/balloon.h > +++ b/balloon.h > @@ -17,13 +17,15 @@ > #include "monitor.h" > > typedef void (QEMUBalloonEvent)(void *opaque, ram_addr_t target, > - MonitorCompletion cb, void *cb_data); > + MonitorCompletion cb, void *cb_data, > + bool get_cached_data); > > void qemu_add_balloon_handler(QEMUBalloonEvent *func, void *opaque); > > int qemu_balloon(ram_addr_t target, MonitorCompletion cb, void *opaque); > > -int qemu_balloon_status(MonitorCompletion cb, void *opaque); > +int qemu_balloon_status(MonitorCompletion cb, void *opaque, > + bool get_cached_data); > > void monitor_print_balloon(Monitor *mon, const QObject *data); > int do_info_balloon(Monitor *mon, MonitorCompletion cb, void *opaque); > diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c > index 9fe3886..68df891 100644 > --- a/hw/virtio-balloon.c > +++ b/hw/virtio-balloon.c > @@ -195,7 +195,8 @@ static uint32_t virtio_balloon_get_features(VirtIODevice *vdev, uint32_t f) > } > > static void virtio_balloon_to_target(void *opaque, ram_addr_t target, > - MonitorCompletion cb, void *cb_data) > + MonitorCompletion cb, void *cb_data, > + bool get_cached_data) > { > VirtIOBalloon *dev = opaque; > > @@ -213,8 +214,12 @@ static void virtio_balloon_to_target(void *opaque, ram_addr_t target, > return; > } > dev->stats_callback = cb; > - dev->stats_opaque_callback_data = cb_data; > + dev->stats_opaque_callback_data = cb_data; > if (dev->vdev.guest_features& (1<< VIRTIO_BALLOON_F_STATS_VQ)) { > + if (get_cached_data) { > + complete_stats_request(dev); > + return; > + } > virtqueue_push(dev->svq,&dev->stats_vq_elem, dev->stats_vq_offset); > virtio_notify(&dev->vdev, dev->svq); > } else { >