diff mbox

virtio: make udp more efficient by avoiding indirect desc

Message ID 52FA3AAC.2050003@huawei.com (mailing list archive)
State New, archived
Headers show

Commit Message

Qinchuanyu Feb. 11, 2014, 2:58 p.m. UTC
udp packet use 2 buffers at least, one for vnet_hdr and
one for skb->data.
we could change the threshold from 2 to 3, so the udp packet
which data buff only using single desc will gain from this.
the guest would avoid from allocating memory dynamically.
the host would avoid from translating indirect desc.

Signed-off-by: Chuanyu Qin <qinchuanyu@huawei.com>
---
  drivers/virtio/virtio_ring.c |    2 +-
  1 files changed, 1 insertions(+), 1 deletions(-)

Comments

Michael S. Tsirkin Feb. 11, 2014, 3:43 p.m. UTC | #1
On Tue, Feb 11, 2014 at 10:58:52PM +0800, Qin Chuanyu wrote:
> udp packet use 2 buffers at least, one for vnet_hdr and
> one for skb->data.

Not really, we use 1 buffer now with vnet_hdr inline with data.

> we could change the threshold from 2 to 3, so the udp packet
> which data buff only using single desc will gain from this.
> the guest would avoid from allocating memory dynamically.
> the host would avoid from translating indirect desc.
> 
> Signed-off-by: Chuanyu Qin <qinchuanyu@huawei.com>

Optimization patch without any performance data?
Such a change would need much more testing than that:
would have to try various workloads with -net and -blk at least.

> ---
>  drivers/virtio/virtio_ring.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index 28b5338..88d008f 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -220,7 +220,7 @@ static inline int virtqueue_add(struct virtqueue *_vq,
> 
>  	/* If the host supports indirect descriptor tables, and we have multiple
>  	 * buffers, then go indirect. FIXME: tune this threshold */
> -	if (vq->indirect && total_sg > 1 && vq->vq.num_free) {
> +	if (vq->indirect && total_sg > 2 && vq->vq.num_free) {
>  		head = vring_add_indirect(vq, sgs, next, total_sg, total_out,
>  					  total_in,
>  					  out_sgs, in_sgs, gfp);
> -- 
> 1.7.3.1.msysgit.0
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Qinchuanyu Feb. 12, 2014, 1:51 a.m. UTC | #2
On 2014/2/11 23:43, Michael S. Tsirkin wrote:
> On Tue, Feb 11, 2014 at 10:58:52PM +0800, Qin Chuanyu wrote:
>> udp packet use 2 buffers at least, one for vnet_hdr and
>> one for skb->data.
>
> Not really, we use 1 buffer now with vnet_hdr inline with data.
>
I would use it, Thanks.

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Paolo Bonzini Feb. 12, 2014, 8:59 a.m. UTC | #3
Il 11/02/2014 16:43, Michael S. Tsirkin ha scritto:
>> > Signed-off-by: Chuanyu Qin <qinchuanyu@huawei.com>
> Optimization patch without any performance data?
> Such a change would need much more testing than that:
> would have to try various workloads with -net and -blk at least.
>

-blk and -scsi never use 2 descriptors except for flushes (which go all 
the way to the platters or flash, and are not as frequent as other I/O). 
  So the patch is in all likelihood a no-op there.

Of course, virtio-net does need data.

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rusty Russell Feb. 13, 2014, 2:57 a.m. UTC | #4
Qin Chuanyu <qinchuanyu@huawei.com> writes:
> udp packet use 2 buffers at least, one for vnet_hdr and
> one for skb->data.
> we could change the threshold from 2 to 3, so the udp packet
> which data buff only using single desc will gain from this.
> the guest would avoid from allocating memory dynamically.
> the host would avoid from translating indirect desc.
>
> Signed-off-by: Chuanyu Qin <qinchuanyu@huawei.com>

We should really adapt the threshold depending on how full the ring is.
If it's gotten cramped recently, prefer indirect.  See linux/average.h.

Such a change would have to be benchmarked carefully though!
Cheers,
Rusty.
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Qinchuanyu March 3, 2014, 11:22 a.m. UTC | #5
On 2014/2/11 23:43, Michael S. Tsirkin wrote:
> On Tue, Feb 11, 2014 at 10:58:52PM +0800, Qin Chuanyu wrote:
>> udp packet use 2 buffers at least, one for vnet_hdr and
>> one for skb->data.
>
> Not really, we use 1 buffer now with vnet_hdr inline with data.
>
I have found that there are related patch in Qemu,
Is there patch suit for vhost_net right now,
Or should I implement it myself ?

>> we could change the threshold from 2 to 3, so the udp packet
>> which data buff only using single desc will gain from this.
>> the guest would avoid from allocating memory dynamically.
>> the host would avoid from translating indirect desc.
>>
>> Signed-off-by: Chuanyu Qin <qinchuanyu@huawei.com>
>
> Optimization patch without any performance data?
> Such a change would need much more testing than that:
> would have to try various workloads with -net and -blk at least.
>
>> ---
>>   drivers/virtio/virtio_ring.c |    2 +-
>>   1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
>> index 28b5338..88d008f 100644
>> --- a/drivers/virtio/virtio_ring.c
>> +++ b/drivers/virtio/virtio_ring.c
>> @@ -220,7 +220,7 @@ static inline int virtqueue_add(struct virtqueue *_vq,
>>
>>   	/* If the host supports indirect descriptor tables, and we have multiple
>>   	 * buffers, then go indirect. FIXME: tune this threshold */
>> -	if (vq->indirect && total_sg > 1 && vq->vq.num_free) {
>> +	if (vq->indirect && total_sg > 2 && vq->vq.num_free) {
>>   		head = vring_add_indirect(vq, sgs, next, total_sg, total_out,
>>   					  total_in,
>>   					  out_sgs, in_sgs, gfp);
>> --
>> 1.7.3.1.msysgit.0
>
>


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 28b5338..88d008f 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -220,7 +220,7 @@  static inline int virtqueue_add(struct virtqueue *_vq,

  	/* If the host supports indirect descriptor tables, and we have multiple
  	 * buffers, then go indirect. FIXME: tune this threshold */
-	if (vq->indirect && total_sg > 1 && vq->vq.num_free) {
+	if (vq->indirect && total_sg > 2 && vq->vq.num_free) {
  		head = vring_add_indirect(vq, sgs, next, total_sg, total_out,
  					  total_in,
  					  out_sgs, in_sgs, gfp);