Message ID | 20180808152323.9660-2-maxime.coquelin@redhat.com |
---|---|
State | Superseded, archived |
Delegated to: | Maxime Coquelin |
Headers | show |
Series |
|
Related | show |
Context | Check | Description |
---|---|---|
ci/Intel-compilation | success | Compilation OK |
On Wed, Aug 08, 2018 at 05:23:22PM +0200, Maxime Coquelin wrote: >For consistency with Vhost kernel backend, save the wrap >counter value into bit 31 of num's vring state field. > >Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> >--- > lib/librte_vhost/vhost_user.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > >diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c >index a2d4c9ffc..31cfdf163 100644 >--- a/lib/librte_vhost/vhost_user.c >+++ b/lib/librte_vhost/vhost_user.c >@@ -648,10 +648,15 @@ static int > vhost_user_set_vring_base(struct virtio_net *dev, > VhostUserMsg *msg) > { >- dev->virtqueue[msg->payload.state.index]->last_used_idx = >- msg->payload.state.num; >- dev->virtqueue[msg->payload.state.index]->last_avail_idx = >- msg->payload.state.num; >+ struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; >+ if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) { >+ vq->avail_wrap_counter = msg->payload.state.num >> 31; >+ vq->used_wrap_counter = vq->avail_wrap_counter; Maybe I don't understand when this is called, but the wrap counters could have different values, no? Apart from that: Reviewed-by: Jens Freimann <jfreimann@redhat.com> regards, Jens
Hi Jens, On 08/10/2018 09:09 AM, Jens Freimann wrote: > On Wed, Aug 08, 2018 at 05:23:22PM +0200, Maxime Coquelin wrote: >> For consistency with Vhost kernel backend, save the wrap >> counter value into bit 31 of num's vring state field. >> >> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> >> --- >> lib/librte_vhost/vhost_user.c | 16 ++++++++++++---- >> 1 file changed, 12 insertions(+), 4 deletions(-) >> >> diff --git a/lib/librte_vhost/vhost_user.c >> b/lib/librte_vhost/vhost_user.c >> index a2d4c9ffc..31cfdf163 100644 >> --- a/lib/librte_vhost/vhost_user.c >> +++ b/lib/librte_vhost/vhost_user.c >> @@ -648,10 +648,15 @@ static int >> vhost_user_set_vring_base(struct virtio_net *dev, >> VhostUserMsg *msg) >> { >> - dev->virtqueue[msg->payload.state.index]->last_used_idx = >> - msg->payload.state.num; >> - dev->virtqueue[msg->payload.state.index]->last_avail_idx = >> - msg->payload.state.num; >> + struct vhost_virtqueue *vq = >> dev->virtqueue[msg->payload.state.index]; >> + if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) { >> + vq->avail_wrap_counter = msg->payload.state.num >> 31; >> + vq->used_wrap_counter = vq->avail_wrap_counter; > > Maybe I don't understand when this is called, but the wrap counters > could have different values, no? No, because we set the used index to the saved avail index value, so wrap counters must be the same. > Apart from that: > > Reviewed-by: Jens Freimann <jfreimann@redhat.com> > regards, > Jens
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index a2d4c9ffc..31cfdf163 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -648,10 +648,15 @@ static int vhost_user_set_vring_base(struct virtio_net *dev, VhostUserMsg *msg) { - dev->virtqueue[msg->payload.state.index]->last_used_idx = - msg->payload.state.num; - dev->virtqueue[msg->payload.state.index]->last_avail_idx = - msg->payload.state.num; + struct vhost_virtqueue *vq = dev->virtqueue[msg->payload.state.index]; + if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) { + vq->avail_wrap_counter = msg->payload.state.num >> 31; + vq->used_wrap_counter = vq->avail_wrap_counter; + msg->payload.state.num &= ~(1 << 31); + } + + vq->last_used_idx = msg->payload.state.num; + vq->last_avail_idx = msg->payload.state.num; return 0; } @@ -1083,6 +1088,9 @@ vhost_user_get_vring_base(struct virtio_net *dev, /* Here we are safe to get the last avail index */ msg->payload.state.num = vq->last_avail_idx; + if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) + msg->payload.state.num |= vq->avail_wrap_counter << 31; + RTE_LOG(INFO, VHOST_CONFIG, "vring base idx:%d file:%d\n", msg->payload.state.index, msg->payload.state.num);
For consistency with Vhost kernel backend, save the wrap counter value into bit 31 of num's vring state field. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> --- lib/librte_vhost/vhost_user.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)