From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59084) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bIWZ4-0000ox-1G for qemu-devel@nongnu.org; Thu, 30 Jun 2016 03:39:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bIWYx-00009P-4P for qemu-devel@nongnu.org; Thu, 30 Jun 2016 03:39:08 -0400 Received: from mga03.intel.com ([134.134.136.65]:32064) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bIWYw-00009L-Ul for qemu-devel@nongnu.org; Thu, 30 Jun 2016 03:39:03 -0400 From: Liang Li Date: Thu, 30 Jun 2016 15:31:43 +0800 Message-Id: <1467271903-23812-1-git-send-email-liang.z.li@intel.com> Subject: [Qemu-devel] [PATCH] balloon: Fix failure of updating guest memory status List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Liang Li , "Michael S. Tsirkin" , Ladi Prosek , Paolo Bonzini After live migration, 'guest-stats' can't get the expected memory status in the guest. This issue is caused by commit 4eae2a657d. The value of 's->stats_vq_elem' will be NULL after live migration, and the check in the function 'balloon_stats_poll_cb()' will prevent the 'virtio_notify()' from executing. So guest will not update the memory status. Signed-off-by: Liang Li Cc: Michael S. Tsirkin Cc: Ladi Prosek Cc: Paolo Bonzini --- hw/virtio/virtio-balloon.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index 557d3f9..cc6947f 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -98,13 +98,19 @@ static void balloon_stats_poll_cb(void *opaque) { VirtIOBalloon *s = opaque; VirtIODevice *vdev = VIRTIO_DEVICE(s); + VirtQueueElement elem = {0}; - if (s->stats_vq_elem == NULL || !balloon_stats_supported(s)) { + if (!balloon_stats_supported(s)) { /* re-schedule */ balloon_stats_change_timer(s, s->stats_poll_interval); return; } + if (s->stats_vq_elem == NULL) { + virtqueue_push(s->svq, &elem, 0); + virtio_notify(vdev, s->svq); + return; + } virtqueue_push(s->svq, s->stats_vq_elem, s->stats_vq_offset); virtio_notify(vdev, s->svq); g_free(s->stats_vq_elem); -- 1.9.1