From mboxrd@z Thu Jan 1 00:00:00 1970 From: Liang Li Subject: [QEMU v2 6/9] balloon: migrate vq elem to destination Date: Fri, 15 Jul 2016 10:47:26 +0800 Message-ID: <1468550849-22172-7-git-send-email-liang.z.li@intel.com> References: <1468550849-22172-1-git-send-email-liang.z.li@intel.com> Cc: mst@redhat.com, pbonzini@redhat.com, quintela@redhat.com, amit.shah@redhat.com, kvm@vger.kernel.org, dgilbert@redhat.com, thuth@redhat.com, Liang Li To: qemu-devel@nongnu.org Return-path: Received: from mga11.intel.com ([192.55.52.93]:2710 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752146AbcGOCz6 (ORCPT ); Thu, 14 Jul 2016 22:55:58 -0400 In-Reply-To: <1468550849-22172-1-git-send-email-liang.z.li@intel.com> Sender: kvm-owner@vger.kernel.org List-ID: 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. Commit 4eae2a657d is doing the right thing, but 's->stats_vq_elem' should be treated as part of balloon device state and migrated to destination if it's not NULL to make everything works well. For the same reason, 's->misc_vq_elem' should be migrated to destination too. Michael has other idea to solve this issue, but he is busy at the moment, this patch can be used for test before his patch is ready. Signed-off-by: Liang Li --- hw/virtio/virtio-balloon.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index b0c09a7..f9bf26d 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -31,6 +31,7 @@ #include "hw/virtio/virtio-access.h" #define BALLOON_PAGE_SIZE (1 << VIRTIO_BALLOON_PFN_SHIFT) +#define BALLOON_VERSION 2 static void balloon_page(void *addr, int deflate) { @@ -610,15 +611,33 @@ static void virtio_balloon_save(QEMUFile *f, void *opaque) static void virtio_balloon_save_device(VirtIODevice *vdev, QEMUFile *f) { VirtIOBalloon *s = VIRTIO_BALLOON(vdev); + uint16_t elem_num = 0; qemu_put_be32(f, s->num_pages); qemu_put_be32(f, s->actual); + if (s->stats_vq_elem != NULL) { + elem_num = 1; + } + qemu_put_be16(f, elem_num); + if (elem_num) { + qemu_put_virtqueue_element(f, s->stats_vq_elem); + } + + elem_num = 0; + if (s->misc_vq_elem != NULL) { + elem_num = 1; + } + qemu_put_be16(f, elem_num); + if (elem_num) { + qemu_put_virtqueue_element(f, s->misc_vq_elem); + } } static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) { - if (version_id != 1) + if (version_id < 1 || version_id > BALLOON_VERSION) { return -EINVAL; + } return virtio_load(VIRTIO_DEVICE(opaque), f, version_id); } @@ -627,9 +646,22 @@ static int virtio_balloon_load_device(VirtIODevice *vdev, QEMUFile *f, int version_id) { VirtIOBalloon *s = VIRTIO_BALLOON(vdev); + uint16_t elem_num = 0; s->num_pages = qemu_get_be32(f); s->actual = qemu_get_be32(f); + if (version_id == BALLOON_VERSION) { + elem_num = qemu_get_be16(f); + if (elem_num == 1) { + s->stats_vq_elem = + qemu_get_virtqueue_element(f, sizeof(VirtQueueElement)); + } + elem_num = qemu_get_be16(f); + if (elem_num == 1) { + s->misc_vq_elem = + qemu_get_virtqueue_element(f, sizeof(VirtQueueElement)); + } + } if (balloon_stats_enabled(s)) { balloon_stats_change_timer(s, s->stats_poll_interval); @@ -665,7 +697,7 @@ static void virtio_balloon_device_realize(DeviceState *dev, Error **errp) reset_stats(s); s->req_status = REQ_INIT; - register_savevm(dev, "virtio-balloon", -1, 1, + register_savevm(dev, "virtio-balloon", -1, BALLOON_VERSION, virtio_balloon_save, virtio_balloon_load, s); } -- 1.9.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56500) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNtIG-0007CM-H5 for qemu-devel@nongnu.org; Thu, 14 Jul 2016 22:56:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNtIE-0006jz-IJ for qemu-devel@nongnu.org; Thu, 14 Jul 2016 22:55:59 -0400 Received: from mga01.intel.com ([192.55.52.88]:34559) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNtIE-0006jt-9p for qemu-devel@nongnu.org; Thu, 14 Jul 2016 22:55:58 -0400 From: Liang Li Date: Fri, 15 Jul 2016 10:47:26 +0800 Message-Id: <1468550849-22172-7-git-send-email-liang.z.li@intel.com> In-Reply-To: <1468550849-22172-1-git-send-email-liang.z.li@intel.com> References: <1468550849-22172-1-git-send-email-liang.z.li@intel.com> Subject: [Qemu-devel] [QEMU v2 6/9] balloon: migrate vq elem to destination List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: mst@redhat.com, pbonzini@redhat.com, quintela@redhat.com, amit.shah@redhat.com, kvm@vger.kernel.org, dgilbert@redhat.com, thuth@redhat.com, Liang Li 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. Commit 4eae2a657d is doing the right thing, but 's->stats_vq_elem' should be treated as part of balloon device state and migrated to destination if it's not NULL to make everything works well. For the same reason, 's->misc_vq_elem' should be migrated to destination too. Michael has other idea to solve this issue, but he is busy at the moment, this patch can be used for test before his patch is ready. Signed-off-by: Liang Li --- hw/virtio/virtio-balloon.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index b0c09a7..f9bf26d 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -31,6 +31,7 @@ #include "hw/virtio/virtio-access.h" #define BALLOON_PAGE_SIZE (1 << VIRTIO_BALLOON_PFN_SHIFT) +#define BALLOON_VERSION 2 static void balloon_page(void *addr, int deflate) { @@ -610,15 +611,33 @@ static void virtio_balloon_save(QEMUFile *f, void *opaque) static void virtio_balloon_save_device(VirtIODevice *vdev, QEMUFile *f) { VirtIOBalloon *s = VIRTIO_BALLOON(vdev); + uint16_t elem_num = 0; qemu_put_be32(f, s->num_pages); qemu_put_be32(f, s->actual); + if (s->stats_vq_elem != NULL) { + elem_num = 1; + } + qemu_put_be16(f, elem_num); + if (elem_num) { + qemu_put_virtqueue_element(f, s->stats_vq_elem); + } + + elem_num = 0; + if (s->misc_vq_elem != NULL) { + elem_num = 1; + } + qemu_put_be16(f, elem_num); + if (elem_num) { + qemu_put_virtqueue_element(f, s->misc_vq_elem); + } } static int virtio_balloon_load(QEMUFile *f, void *opaque, int version_id) { - if (version_id != 1) + if (version_id < 1 || version_id > BALLOON_VERSION) { return -EINVAL; + } return virtio_load(VIRTIO_DEVICE(opaque), f, version_id); } @@ -627,9 +646,22 @@ static int virtio_balloon_load_device(VirtIODevice *vdev, QEMUFile *f, int version_id) { VirtIOBalloon *s = VIRTIO_BALLOON(vdev); + uint16_t elem_num = 0; s->num_pages = qemu_get_be32(f); s->actual = qemu_get_be32(f); + if (version_id == BALLOON_VERSION) { + elem_num = qemu_get_be16(f); + if (elem_num == 1) { + s->stats_vq_elem = + qemu_get_virtqueue_element(f, sizeof(VirtQueueElement)); + } + elem_num = qemu_get_be16(f); + if (elem_num == 1) { + s->misc_vq_elem = + qemu_get_virtqueue_element(f, sizeof(VirtQueueElement)); + } + } if (balloon_stats_enabled(s)) { balloon_stats_change_timer(s, s->stats_poll_interval); @@ -665,7 +697,7 @@ static void virtio_balloon_device_realize(DeviceState *dev, Error **errp) reset_stats(s); s->req_status = REQ_INIT; - register_savevm(dev, "virtio-balloon", -1, 1, + register_savevm(dev, "virtio-balloon", -1, BALLOON_VERSION, virtio_balloon_save, virtio_balloon_load, s); } -- 1.9.1