From patchwork Fri Aug 27 05:27:11 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Shah X-Patchwork-Id: 62828 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6EFEBB70E1 for ; Fri, 27 Aug 2010 15:34:00 +1000 (EST) Received: from localhost ([127.0.0.1]:60468 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OorZd-0006zr-HC for incoming@patchwork.ozlabs.org; Fri, 27 Aug 2010 01:33:57 -0400 Received: from [140.186.70.92] (port=42471 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OorW0-0005qI-50 for qemu-devel@nongnu.org; Fri, 27 Aug 2010 01:30:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OorVy-0001Mh-Qk for qemu-devel@nongnu.org; Fri, 27 Aug 2010 01:30:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:17043) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OorVy-0001Mc-Et for qemu-devel@nongnu.org; Fri, 27 Aug 2010 01:30:10 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o7R5U8RR005049 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 Aug 2010 01:30:08 -0400 Received: from localhost ([10.3.113.7]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o7R5SpbT005455; Fri, 27 Aug 2010 01:29:10 -0400 From: Amit Shah To: qemu list Date: Fri, 27 Aug 2010 10:57:11 +0530 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: Luiz Capitulino , agl@us.ibm.com, Amit Shah , Paolo Bonzini Subject: [Qemu-devel] [PATCH v3 3/3] balloon: Don't try fetching info if machine is stopped X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org If the machine is stopped and 'info balloon' is invoked, instead of querying the guest and waiting for a timeout, just display the most recent stats available in this case and log an error report. See https://bugzilla.redhat.com/show_bug.cgi?id=623903 Reported-by: Signed-off-by: Amit Shah --- 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 309c343..50a1a34 100644 --- a/hw/virtio-balloon.c +++ b/hw/virtio-balloon.c @@ -204,7 +204,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; @@ -222,8 +223,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) { + show_old_stats(dev); + return; + } 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);