From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33330) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZoqYc-0001iG-At for qemu-devel@nongnu.org; Wed, 21 Oct 2015 06:23:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZoqYX-0005MT-DF for qemu-devel@nongnu.org; Wed, 21 Oct 2015 06:23:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56972) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZoqYX-0005MN-5F for qemu-devel@nongnu.org; Wed, 21 Oct 2015 06:23:41 -0400 Date: Wed, 21 Oct 2015 13:23:35 +0300 From: "Michael S. Tsirkin" Message-ID: <20151021132316-mutt-send-email-mst@redhat.com> References: <1445419154-19653-1-git-send-email-thibaut.collet@6wind.com> <1445419154-19653-2-git-send-email-thibaut.collet@6wind.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1445419154-19653-2-git-send-email-thibaut.collet@6wind.com> Subject: Re: [Qemu-devel] [PATCH v2 1/1] vhost: set the correct queue index in case of migration with multiqueue List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Thibaut Collet Cc: pbonzini@redhat.com, jasowang@redhat.com, marcandre.lureau@gmail.com, qemu-devel@nongnu.org, haifeng.lin@huawei.com On Wed, Oct 21, 2015 at 11:19:14AM +0200, Thibaut Collet wrote: > When a live migration is started the log address to mark dirty pages is provided > to the vhost backend through the vhost_dev_set_log function. > This function is called for each queue pairs but the queue index provided to the > vhost_virtqueue_set_addr function is wrongly set: always set to the first queue > pair. Then vhost backend lost descriptor addresses of the queue pairs greater > than 1 and behaviour of the vhost backend is unpredictable. > > The vhost_dev_set_log is modified to provide the correct queue index to the > vhost_virtqueue_set_addr function that calls internally the vhost_get_vq_index > to compute the expected vhost_vq_index for vhost kernel and vhost user. > This change implies a modification of the vhost_virtqueue_start function to > provide the index and not the vhost_vq_index. > > Signed-off-by: Thibaut Collet I applied v1 already, please post a patch on top. > --- > hw/virtio/vhost.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c > index feeaaa4..9311832 100644 > --- a/hw/virtio/vhost.c > +++ b/hw/virtio/vhost.c > @@ -628,8 +628,9 @@ static int vhost_virtqueue_set_addr(struct vhost_dev *dev, > struct vhost_virtqueue *vq, > unsigned idx, bool enable_log) > { > + int vhost_vq_index = dev->vhost_ops->vhost_get_vq_index(dev, idx); > struct vhost_vring_addr addr = { > - .index = idx, > + .index = vhost_vq_index, > .desc_user_addr = (uint64_t)(unsigned long)vq->desc, > .avail_user_addr = (uint64_t)(unsigned long)vq->avail, > .used_user_addr = (uint64_t)(unsigned long)vq->used, > @@ -662,7 +663,7 @@ static int vhost_dev_set_log(struct vhost_dev *dev, bool enable_log) > goto err_features; > } > for (i = 0; i < dev->nvqs; ++i) { > - r = vhost_virtqueue_set_addr(dev, dev->vqs + i, i, > + r = vhost_virtqueue_set_addr(dev, dev->vqs + i, dev->vq_index + i, > enable_log); > if (r < 0) { > goto err_vq; > @@ -671,7 +672,7 @@ static int vhost_dev_set_log(struct vhost_dev *dev, bool enable_log) > return 0; > err_vq: > for (; i >= 0; --i) { > - t = vhost_virtqueue_set_addr(dev, dev->vqs + i, i, > + t = vhost_virtqueue_set_addr(dev, dev->vqs + i, dev->vq_index + i, > dev->log_enabled); > assert(t >= 0); > } > @@ -836,7 +837,7 @@ static int vhost_virtqueue_start(struct vhost_dev *dev, > goto fail_alloc_ring; > } > > - r = vhost_virtqueue_set_addr(dev, vq, vhost_vq_index, dev->log_enabled); > + r = vhost_virtqueue_set_addr(dev, vq, idx, dev->log_enabled); > if (r < 0) { > r = -errno; > goto fail_alloc; > -- > 2.1.4