diff mbox

virtio-net: fix ring handling in receive

Message ID 1466422360-25151-1-git-send-email-nikunj@linux.vnet.ibm.com
State Accepted
Headers show

Commit Message

Nikunj A Dadhania June 20, 2016, 11:32 a.m. UTC
A bug crept in while doing the virtio 1.0 enablement in
commit 6e4d62c2 (virtio-net: enable virtio 1.0)

+       idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.used->idx);

[...]

-       vq_rx.avail->ring[vq_rx.avail->idx % vq_rx.size] = id - 1;
+       vq_rx.avail->ring[idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
        sync();
-       vq_rx.avail->idx += 1;
+       vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, idx + 1);

Should be using avail->idx in place of used->idx.

Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
---
 lib/libvirtio/virtio-net.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Thomas Huth June 21, 2016, 7:41 p.m. UTC | #1
On 20.06.2016 13:32, Nikunj A Dadhania wrote:
> A bug crept in while doing the virtio 1.0 enablement in
> commit 6e4d62c2 (virtio-net: enable virtio 1.0)
> 
> +       idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.used->idx);
> 
> [...]
> 
> -       vq_rx.avail->ring[vq_rx.avail->idx % vq_rx.size] = id - 1;
> +       vq_rx.avail->ring[idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
>         sync();
> -       vq_rx.avail->idx += 1;
> +       vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, idx + 1);
> 
> Should be using avail->idx in place of used->idx.
> 
> Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
> ---
>  lib/libvirtio/virtio-net.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/libvirtio/virtio-net.c b/lib/libvirtio/virtio-net.c
> index fc620a2..2573031 100644
> --- a/lib/libvirtio/virtio-net.c
> +++ b/lib/libvirtio/virtio-net.c
> @@ -266,6 +266,7 @@ static int virtionet_receive(char *buf, int maxlen)
>  {
>  	uint32_t len = 0;
>  	uint32_t id, idx;
> +	uint16_t avail_idx;
>  
>  	idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.used->idx);
>  
> @@ -304,9 +305,10 @@ static int virtionet_receive(char *buf, int maxlen)
>  	/* Move indices to next entries */
>  	last_rx_idx = last_rx_idx + 1;
>  
> -	vq_rx.avail->ring[idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
> +	avail_idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.avail->idx);
> +	vq_rx.avail->ring[avail_idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
>  	sync();
> -	vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, idx + 1);
> +	vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, avail_idx + 1);
>  
>  	/* Tell HV that RX queue entry is ready */
>  	virtio_queue_notify(&virtiodev, VQ_RX);
> 

You're right, that looks better this way!

Reviewed-by: Thomas Huth <thuth@redhat.com>
Alexey Kardashevskiy June 27, 2016, 3:04 a.m. UTC | #2
On 22/06/16 05:41, Thomas Huth wrote:
> On 20.06.2016 13:32, Nikunj A Dadhania wrote:
>> A bug crept in while doing the virtio 1.0 enablement in
>> commit 6e4d62c2 (virtio-net: enable virtio 1.0)
>>
>> +       idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.used->idx);
>>
>> [...]
>>
>> -       vq_rx.avail->ring[vq_rx.avail->idx % vq_rx.size] = id - 1;
>> +       vq_rx.avail->ring[idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
>>         sync();
>> -       vq_rx.avail->idx += 1;
>> +       vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, idx + 1);
>>
>> Should be using avail->idx in place of used->idx.

Thanks, applied.

>>
>> Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
>> ---
>>  lib/libvirtio/virtio-net.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/lib/libvirtio/virtio-net.c b/lib/libvirtio/virtio-net.c
>> index fc620a2..2573031 100644
>> --- a/lib/libvirtio/virtio-net.c
>> +++ b/lib/libvirtio/virtio-net.c
>> @@ -266,6 +266,7 @@ static int virtionet_receive(char *buf, int maxlen)
>>  {
>>  	uint32_t len = 0;
>>  	uint32_t id, idx;
>> +	uint16_t avail_idx;
>>  
>>  	idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.used->idx);
>>  
>> @@ -304,9 +305,10 @@ static int virtionet_receive(char *buf, int maxlen)
>>  	/* Move indices to next entries */
>>  	last_rx_idx = last_rx_idx + 1;
>>  
>> -	vq_rx.avail->ring[idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
>> +	avail_idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.avail->idx);
>> +	vq_rx.avail->ring[avail_idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
>>  	sync();
>> -	vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, idx + 1);
>> +	vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, avail_idx + 1);
>>  
>>  	/* Tell HV that RX queue entry is ready */
>>  	virtio_queue_notify(&virtiodev, VQ_RX);
>>
> 
> You're right, that looks better this way!
> 
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> 
> _______________________________________________
> SLOF mailing list
> SLOF@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/slof
>
diff mbox

Patch

diff --git a/lib/libvirtio/virtio-net.c b/lib/libvirtio/virtio-net.c
index fc620a2..2573031 100644
--- a/lib/libvirtio/virtio-net.c
+++ b/lib/libvirtio/virtio-net.c
@@ -266,6 +266,7 @@  static int virtionet_receive(char *buf, int maxlen)
 {
 	uint32_t len = 0;
 	uint32_t id, idx;
+	uint16_t avail_idx;
 
 	idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.used->idx);
 
@@ -304,9 +305,10 @@  static int virtionet_receive(char *buf, int maxlen)
 	/* Move indices to next entries */
 	last_rx_idx = last_rx_idx + 1;
 
-	vq_rx.avail->ring[idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
+	avail_idx = virtio_modern16_to_cpu(&virtiodev, vq_rx.avail->idx);
+	vq_rx.avail->ring[avail_idx % vq_rx.size] = virtio_cpu_to_modern16(&virtiodev, id - 1);
 	sync();
-	vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, idx + 1);
+	vq_rx.avail->idx = virtio_cpu_to_modern16(&virtiodev, avail_idx + 1);
 
 	/* Tell HV that RX queue entry is ready */
 	virtio_queue_notify(&virtiodev, VQ_RX);