All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wei Xu <wexu@redhat.com>
To: Maxime Coquelin <maxime.coquelin@redhat.com>
Cc: jasowang@redhat.com, qemu-devel@nongnu.org, mst@redhat.com,
	jfreimann@redhat.com, tiwei.bie@intel.com
Subject: Re: [Qemu-devel] [PATCH v1 13/16] virtio: add vhost-net migration of packed ring
Date: Thu, 17 Jan 2019 01:48:07 +0800	[thread overview]
Message-ID: <20190116174807.GB28579@wei-ubt> (raw)
In-Reply-To: <5b06d5dd-9aa4-ac2d-1be4-47aed98b5dfd@redhat.com>

On Wed, Nov 28, 2018 at 11:34:46AM +0100, Maxime Coquelin wrote:
> 
> 
> On 11/22/18 3:06 PM, wexu@redhat.com wrote:
> >From: Wei Xu <wexu@redhat.com>
> >
> >tweaked vhost-net code to test migration.
> >
> >@@ -1414,64 +1430,20 @@ long vhost_vring_ioctl(struct vhost_dev
> >             r = -EFAULT;
> >             break;
> >         }
> >+               vq->last_avail_idx = s.num & 0x7FFF;
> >+               /* Forget the cached index value. */
> >+               vq->avail_idx = vq->last_avail_idx;
> >+               if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
> >+                       vq->last_avail_wrap_counter = !!(s.num & 0x8000);
> >+                       vq->avail_wrap_counter = vq->last_avail_wrap_counter;
> >+
> >+                       vq->last_used_idx = (s.num & 0x7fFF0000) >> 16;
> >+                       vq->last_used_wrap_counter = !!(s.num & 0x80000000);
> >+               }
> >+               break;
> >+       case VHOST_GET_VRING_BASE:
> >+               s.index = idx;
> >+                s.num = vq->last_avail_idx;
> >+               if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
> >+                       s.num |= vq->last_avail_wrap_counter << 15;
> >+                       s.num |= vq->last_used_idx << 16;
> >+                       s.num |= vq->last_used_wrap_counter << 31;
> >+               }
> >+               if (copy_to_user(argp, &s, sizeof(s)))
> >+                       r = -EFAULT;
> >+               break;
> >
> >Signed-off-by: Wei Xu <wexu@redhat.com>
> >---
> >  hw/virtio/virtio.c         | 35 ++++++++++++++++++++++++++++++-----
> >  include/hw/virtio/virtio.h |  4 ++--
> >  2 files changed, 32 insertions(+), 7 deletions(-)
> >
> >diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> >index 64d5c04..7487d3d 100644
> >--- a/hw/virtio/virtio.c
> >+++ b/hw/virtio/virtio.c
> >@@ -2963,19 +2963,40 @@ hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n)
> >      }
> >  }
> >-uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n)
> >+int virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n)
> >  {
> >-    return vdev->vq[n].last_avail_idx;
> >+    int idx;
> >+
> >+    if (virtio_host_has_feature(vdev, VIRTIO_F_RING_PACKED)) {
> 
> Also, I think you want to use virtio_vdev_has_feature() here instead,
> else it will set wrap counter in the case ring_packed=on in the QEMU
> command line but the feature has not been negotiated.
> 
> 
> For example, with ring_packed=on and with stock Fedora 28 kernel, which
> does not support packed ring, I get this warning with DPDK vhost user
> backend:
> 
> VHOST_CONFIG: last_used_idx (32768) and vq->used->idx (0) mismatches;
> some packets maybe resent for Tx and dropped for Rx

Thanks, will fix it.

Wei

> 
> >+        idx = vdev->vq[n].last_avail_idx;
> >+        idx |= ((int)vdev->vq[n].avail_wrap_counter) << 15;
> >+        idx |= (vdev->vq[n].used_idx) << 16;
> >+        idx |= ((int)vdev->vq[n].used_wrap_counter) << 31;
> >+    } else {
> >+        idx = (int)vdev->vq[n].last_avail_idx;
> >+    }
> >+    return idx;
> >  }
> >-void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx)
> >+void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, int idx)
> >  {
> >-    vdev->vq[n].last_avail_idx = idx;
> >-    vdev->vq[n].shadow_avail_idx = idx;
> >+    if (virtio_vdev_has_feature(vdev, VIRTIO_F_RING_PACKED)) {
> >+        vdev->vq[n].last_avail_idx = idx & 0x7fff;
> >+        vdev->vq[n].avail_wrap_counter = !!(idx & 0x8000);
> >+        vdev->vq[n].used_idx = (idx & 0x7fff0000) >> 16;
> >+        vdev->vq[n].used_wrap_counter = !!(idx & 0x80000000);
> >+    } else {
> >+        vdev->vq[n].last_avail_idx = idx;
> >+        vdev->vq[n].shadow_avail_idx = idx;
> >+    }
> >  }
> >  void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n)
> >  {
> >+    if (virtio_vdev_has_feature(vdev, VIRTIO_F_RING_PACKED)) {
> >+        return;
> >+    }
> >+
> >      rcu_read_lock();
> >      if (vdev->vq[n].vring.desc) {
> >          vdev->vq[n].last_avail_idx = vring_used_idx(&vdev->vq[n]);
> >@@ -2986,6 +3007,10 @@ void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n)
> >  void virtio_queue_update_used_idx(VirtIODevice *vdev, int n)
> >  {
> >+    if (virtio_vdev_has_feature(vdev, VIRTIO_F_RING_PACKED)) {
> >+        return;
> >+    }
> >+
> >      rcu_read_lock();
> >      if (vdev->vq[n].vring.desc) {
> >          vdev->vq[n].used_idx = vring_used_idx(&vdev->vq[n]);
> >diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
> >index 9c1fa07..a6fdf3f 100644
> >--- a/include/hw/virtio/virtio.h
> >+++ b/include/hw/virtio/virtio.h
> >@@ -272,8 +272,8 @@ hwaddr virtio_queue_get_used_addr(VirtIODevice *vdev, int n);
> >  hwaddr virtio_queue_get_desc_size(VirtIODevice *vdev, int n);
> >  hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n);
> >  hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
> >-uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
> >-void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx);
> >+int virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
> >+void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, int idx);
> >  void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n);
> >  void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n);
> >  void virtio_queue_update_used_idx(VirtIODevice *vdev, int n);
> >

  reply	other threads:[~2019-01-16 18:00 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-22 14:06 [Qemu-devel] [PATCH v1 00/16] packed ring virtio-net backend support wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 01/16] Update version for v3.1.0-rc2 release wexu
2018-11-22 14:31   ` Wei Xu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 02/16] virtio: introduce packed ring definitions wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 03/16] virtio: redefine structure & memory cache for packed ring wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 04/16] virtio: expand offset calculation " wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 05/16] virtio: add memory region init " wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 06/16] virtio: init wrap counter " wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 07/16] virtio: init and desc empty check " wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 08/16] virtio: get avail bytes " wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 09/16] virtio: fill/flush/pop " wexu
2018-11-30 12:45   ` Maxime Coquelin
2019-01-16 17:46     ` Wei Xu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 10/16] virtio: event suppression support " wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 11/16] virtio-net: fill head desc after done all in a chain wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 12/16] virtio: add userspace migration of packed ring wexu
2018-11-22 14:45   ` Jason Wang
2019-01-16 17:50     ` Wei Xu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 13/16] virtio: add vhost-net " wexu
2018-11-28 10:05   ` Maxime Coquelin
2018-11-28 10:34   ` Maxime Coquelin
2019-01-16 17:48     ` Wei Xu [this message]
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 14/16] virtio: packed ring feature bit for userspace backend wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 15/16] vhost: enable packed ring wexu
2018-11-22 14:06 ` [Qemu-devel] [PATCH v1 16/16] virtio: enable packed ring via a new command line wexu
2018-11-22 17:57 ` [Qemu-devel] [PATCH v1 00/16] packed ring virtio-net backend support Maxime Coquelin
2018-11-23  5:57   ` Wei Xu
2018-11-25 13:59     ` Wei Xu
2018-11-23  6:45 ` no-reply
2018-11-23  6:45 ` no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190116174807.GB28579@wei-ubt \
    --to=wexu@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=jfreimann@redhat.com \
    --cc=maxime.coquelin@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=tiwei.bie@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.