On 30/06/2016 09:31, Liang Li wrote: > 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 <liang.z...@intel.com> > Cc: Michael S. Tsirkin <m...@redhat.com> > Cc: Ladi Prosek <lpro...@redhat.com> > Cc: Paolo Bonzini <pbonz...@redhat.com> > --- > 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); >
Hi, the right fix is to migrate s->stats_vq_elem if it is not NULL. See how it's done in hw/char/virtio-serial.c's virtio_serial_save_device (save) and fetch_active_ports_list (load). Paolo