[RFC v3 3/5] virtio_ring: add packed ring support

Jason Wang
2018-05-10T07:34:50Z

On 2018?05?10? 15:32, Jason Wang wrote:
>
>
> On 2018?04?25? 13:15, Tiwei Bie wrote:
>> +??? /* We're using some buffers from the free list. */
>> +??? vq->vq.num_free -= descs_used;
>> +
>> +??? /* Update free pointer */
>> +??? if (indirect) {
>> +??????? n = head + 1;
>> +??????? if (n >= vq->vring_packed.num) {
>> +??????????? n = 0;
>> +??????????? vq->wrap_counter ^= 1;
>> +??????? }
>> +??????? vq->next_avail_idx = n;
>> +??? } else
>> +??????? vq->next_avail_idx = i;
>
> During testing zerocopy (out of order completion), I found driver may
> submit two identical buffer id to vhost. So the above code may not
> work well.
>
> Consider the case that driver adds 3 buffer and virtqueue size is 8.
>
> a) id = 0,count = 2,next_avail = 2
>
> b) id = 2,count = 4,next_avail = 2

next_avail should be 6 here.

>
> c) id = 4,count = 2,next_avail = 0
>

id should be 6 here.

Thanks

> if packet b is done before packet a, driver may think buffer id 0 is
> available and try to use it if even if the real buffer 0 was not done.
>
> Thanks
> _______________________________________________
> Virtualization mailing list
> Virtualization at lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/virtualization