[RFC,1/2] vhost: add packed ring support to vring base requests
Checks
Commit Message
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(-)
Comments
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
@@ -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);