* [Qemu-devel] [PATCH v2 0/1] vhost-user: support of live migration with multiqueue @ 2015-10-21 9:19 Thibaut Collet 2015-10-21 9:19 ` [Qemu-devel] [PATCH v2 1/1] vhost: set the correct queue index in case of " Thibaut Collet 0 siblings, 1 reply; 3+ messages in thread From: Thibaut Collet @ 2015-10-21 9:19 UTC (permalink / raw) To: thibaut.collet, qemu-devel, mst, marcandre.lureau, jasowang, pbonzini, haifeng.lin Patches serie for vhost-user live migration from Marc-Andre Lureau [PATCH v8 00/27] vhost-user: add migration support (http://lists.nongnu.org/archive/html/qemu-devel/2015-10/msg02452.html) does not work if multiqueue is set. This patch correct an issue of queue index when a migration is started with multiqueue v1->v2: - call vhost_get_vq_index internally in vhost_virtqueue_set_addr Thibaut Collet (1): vhost: set the correct queue index in case of migration with multiqueue hw/virtio/vhost.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) -- 2.1.4 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH v2 1/1] vhost: set the correct queue index in case of migration with multiqueue 2015-10-21 9:19 [Qemu-devel] [PATCH v2 0/1] vhost-user: support of live migration with multiqueue Thibaut Collet @ 2015-10-21 9:19 ` Thibaut Collet 2015-10-21 10:23 ` Michael S. Tsirkin 0 siblings, 1 reply; 3+ messages in thread From: Thibaut Collet @ 2015-10-21 9:19 UTC (permalink / raw) To: thibaut.collet, qemu-devel, mst, marcandre.lureau, jasowang, pbonzini, haifeng.lin 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 <thibaut.collet@6wind.com> --- 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 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/1] vhost: set the correct queue index in case of migration with multiqueue 2015-10-21 9:19 ` [Qemu-devel] [PATCH v2 1/1] vhost: set the correct queue index in case of " Thibaut Collet @ 2015-10-21 10:23 ` Michael S. Tsirkin 0 siblings, 0 replies; 3+ messages in thread From: Michael S. Tsirkin @ 2015-10-21 10:23 UTC (permalink / raw) To: Thibaut Collet Cc: pbonzini, jasowang, marcandre.lureau, qemu-devel, haifeng.lin 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 <thibaut.collet@6wind.com> 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 ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-10-21 10:23 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-10-21 9:19 [Qemu-devel] [PATCH v2 0/1] vhost-user: support of live migration with multiqueue Thibaut Collet 2015-10-21 9:19 ` [Qemu-devel] [PATCH v2 1/1] vhost: set the correct queue index in case of " Thibaut Collet 2015-10-21 10:23 ` Michael S. Tsirkin
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.