From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=42261 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OorTr-0004dr-1I for qemu-devel@nongnu.org; Fri, 27 Aug 2010 01:28:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OorTp-0000zp-To for qemu-devel@nongnu.org; Fri, 27 Aug 2010 01:27:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39344) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OorTp-0000zi-LD for qemu-devel@nongnu.org; Fri, 27 Aug 2010 01:27:57 -0400 From: Amit Shah Date: Fri, 27 Aug 2010 10:57:09 +0530 Message-Id: In-Reply-To: References: In-Reply-To: References: Subject: [Qemu-devel] [PATCH v3 1/3] balloon: Don't try fetching info if guest is unresponsive List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu list Cc: Luiz Capitulino , agl@us.ibm.com, Amit Shah , Paolo Bonzini If the guest is unresponsive 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. A new timer is added, which on expiry, just presents the old data to the monitor callback functions. See https://bugzilla.redhat.com/show_bug.cgi?id=623903 Reported-by: Signed-off-by: Amit Shah --- hw/virtio-balloon.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/hw/virtio-balloon.c b/hw/virtio-balloon.c index 9fe3886..d6c66cf 100644 --- a/hw/virtio-balloon.c +++ b/hw/virtio-balloon.c @@ -40,6 +40,7 @@ typedef struct VirtIOBalloon size_t stats_vq_offset; MonitorCompletion *stats_callback; void *stats_opaque_callback_data; + QEMUTimer *timer; } VirtIOBalloon; static VirtIOBalloon *to_virtio_balloon(VirtIODevice *vdev) @@ -137,6 +138,11 @@ static void complete_stats_request(VirtIOBalloon *vb) vb->stats_callback = NULL; } +static void show_old_stats(void *opaque) +{ + complete_stats_request(opaque); +} + static void virtio_balloon_receive_stats(VirtIODevice *vdev, VirtQueue *vq) { VirtIOBalloon *s = DO_UPCAST(VirtIOBalloon, vdev, vdev); @@ -148,6 +154,8 @@ static void virtio_balloon_receive_stats(VirtIODevice *vdev, VirtQueue *vq) return; } + qemu_del_timer(s->timer); + /* Initialize the stats to get rid of any stale values. This is only * needed to handle the case where a guest supports fewer stats than it * used to (ie. it has booted into an old kernel). @@ -215,6 +223,7 @@ static void virtio_balloon_to_target(void *opaque, ram_addr_t target, dev->stats_callback = cb; dev->stats_opaque_callback_data = cb_data; if (dev->vdev.guest_features & (1 << VIRTIO_BALLOON_F_STATS_VQ)) { + qemu_mod_timer(dev->timer, qemu_get_clock(rt_clock) + 5000); virtqueue_push(dev->svq, &dev->stats_vq_elem, dev->stats_vq_offset); virtio_notify(&dev->vdev, dev->svq); } else { @@ -267,6 +276,8 @@ VirtIODevice *virtio_balloon_init(DeviceState *dev) s->dvq = virtio_add_queue(&s->vdev, 128, virtio_balloon_handle_output); s->svq = virtio_add_queue(&s->vdev, 128, virtio_balloon_receive_stats); + s->timer = qemu_new_timer(rt_clock, show_old_stats, s); + reset_stats(s); qemu_add_balloon_handler(virtio_balloon_to_target, s); -- 1.7.2.2