Re: [PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-09-02 Thread Jason Wang
On 09/02/2013 02:30 PM, Jason Wang wrote:
> On 09/02/2013 01:56 PM, Michael S. Tsirkin wrote:
>> > On Fri, Aug 30, 2013 at 12:29:22PM +0800, Jason Wang wrote:
>>> >> As Michael point out, We used to limit the max pending DMAs to get 
>>> >> better cache
>>> >> utilization. But it was not done correctly since it was one done when 
>>> >> there's no
>>> >> new buffers submitted from guest. Guest can easily exceeds the 
>>> >> limitation by
>>> >> keeping sending packets.
>>> >>
>>> >> So this patch moves the check into main loop. Tests shows about 5%-10%
>>> >> improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
>>> >> transaction rate for a single session TCP_RR.
>> > Any explanation for the drop? single session TCP_RR is unlikely to
>> > exceed VHOST_MAX_PEND, correct?
> Unlikely to exceed. Recheck the result, looks like it was not stable
> enough. Will re-test and report.

Re-tested with more iterations, result shows no difference on TCP_RR
test and 5%-10% improvement on per cpu throughput for guest tx.

Will post V3 soon.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-09-02 Thread Jason Wang
On 09/02/2013 01:56 PM, Michael S. Tsirkin wrote:
> On Fri, Aug 30, 2013 at 12:29:22PM +0800, Jason Wang wrote:
>> As Michael point out, We used to limit the max pending DMAs to get better 
>> cache
>> utilization. But it was not done correctly since it was one done when 
>> there's no
>> new buffers submitted from guest. Guest can easily exceeds the limitation by
>> keeping sending packets.
>>
>> So this patch moves the check into main loop. Tests shows about 5%-10%
>> improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
>> transaction rate for a single session TCP_RR.
> Any explanation for the drop? single session TCP_RR is unlikely to
> exceed VHOST_MAX_PEND, correct?

Unlikely to exceed. Recheck the result, looks like it was not stable
enough. Will re-test and report.
>
>> Signed-off-by: Jason Wang 
>> ---
>>  drivers/vhost/net.c |   15 ---
>>  1 files changed, 4 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
>> index d09c17c..592e1f2 100644
>> --- a/drivers/vhost/net.c
>> +++ b/drivers/vhost/net.c
>> @@ -363,6 +363,10 @@ static void handle_tx(struct vhost_net *net)
>>  if (zcopy)
>>  vhost_zerocopy_signal_used(net, vq);
>>  
>> +if ((nvq->upend_idx + vq->num - VHOST_MAX_PEND) % UIO_MAXIOV ==
>> +nvq->done_idx)
>> +break;
>> +
>>  head = vhost_get_vq_desc(>dev, vq, vq->iov,
>>   ARRAY_SIZE(vq->iov),
>>   , ,
>> @@ -372,17 +376,6 @@ static void handle_tx(struct vhost_net *net)
>>  break;
>>  /* Nothing new?  Wait for eventfd to tell us they refilled. */
>>  if (head == vq->num) {
>> -int num_pends;
>> -
>> -/* If more outstanding DMAs, queue the work.
>> - * Handle upend_idx wrap around
>> - */
>> -num_pends = likely(nvq->upend_idx >= nvq->done_idx) ?
>> -(nvq->upend_idx - nvq->done_idx) :
>> -(nvq->upend_idx + UIO_MAXIOV -
>> - nvq->done_idx);
>> -if (unlikely(num_pends > VHOST_MAX_PEND))
>> -break;
>>  if (unlikely(vhost_enable_notify(>dev, vq))) {
>>  vhost_disable_notify(>dev, vq);
>>  continue;
>> -- 
>> 1.7.1
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-09-02 Thread Jason Wang
On 09/02/2013 01:56 PM, Michael S. Tsirkin wrote:
 On Fri, Aug 30, 2013 at 12:29:22PM +0800, Jason Wang wrote:
 As Michael point out, We used to limit the max pending DMAs to get better 
 cache
 utilization. But it was not done correctly since it was one done when 
 there's no
 new buffers submitted from guest. Guest can easily exceeds the limitation by
 keeping sending packets.

 So this patch moves the check into main loop. Tests shows about 5%-10%
 improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
 transaction rate for a single session TCP_RR.
 Any explanation for the drop? single session TCP_RR is unlikely to
 exceed VHOST_MAX_PEND, correct?

Unlikely to exceed. Recheck the result, looks like it was not stable
enough. Will re-test and report.

 Signed-off-by: Jason Wang jasow...@redhat.com
 ---
  drivers/vhost/net.c |   15 ---
  1 files changed, 4 insertions(+), 11 deletions(-)

 diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
 index d09c17c..592e1f2 100644
 --- a/drivers/vhost/net.c
 +++ b/drivers/vhost/net.c
 @@ -363,6 +363,10 @@ static void handle_tx(struct vhost_net *net)
  if (zcopy)
  vhost_zerocopy_signal_used(net, vq);
  
 +if ((nvq-upend_idx + vq-num - VHOST_MAX_PEND) % UIO_MAXIOV ==
 +nvq-done_idx)
 +break;
 +
  head = vhost_get_vq_desc(net-dev, vq, vq-iov,
   ARRAY_SIZE(vq-iov),
   out, in,
 @@ -372,17 +376,6 @@ static void handle_tx(struct vhost_net *net)
  break;
  /* Nothing new?  Wait for eventfd to tell us they refilled. */
  if (head == vq-num) {
 -int num_pends;
 -
 -/* If more outstanding DMAs, queue the work.
 - * Handle upend_idx wrap around
 - */
 -num_pends = likely(nvq-upend_idx = nvq-done_idx) ?
 -(nvq-upend_idx - nvq-done_idx) :
 -(nvq-upend_idx + UIO_MAXIOV -
 - nvq-done_idx);
 -if (unlikely(num_pends  VHOST_MAX_PEND))
 -break;
  if (unlikely(vhost_enable_notify(net-dev, vq))) {
  vhost_disable_notify(net-dev, vq);
  continue;
 -- 
 1.7.1
 --
 To unsubscribe from this list: send the line unsubscribe linux-kernel in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 Please read the FAQ at  http://www.tux.org/lkml/

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-09-02 Thread Jason Wang
On 09/02/2013 02:30 PM, Jason Wang wrote:
 On 09/02/2013 01:56 PM, Michael S. Tsirkin wrote:
  On Fri, Aug 30, 2013 at 12:29:22PM +0800, Jason Wang wrote:
  As Michael point out, We used to limit the max pending DMAs to get 
  better cache
  utilization. But it was not done correctly since it was one done when 
  there's no
  new buffers submitted from guest. Guest can easily exceeds the 
  limitation by
  keeping sending packets.
 
  So this patch moves the check into main loop. Tests shows about 5%-10%
  improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
  transaction rate for a single session TCP_RR.
  Any explanation for the drop? single session TCP_RR is unlikely to
  exceed VHOST_MAX_PEND, correct?
 Unlikely to exceed. Recheck the result, looks like it was not stable
 enough. Will re-test and report.

Re-tested with more iterations, result shows no difference on TCP_RR
test and 5%-10% improvement on per cpu throughput for guest tx.

Will post V3 soon.
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-09-01 Thread Michael S. Tsirkin
On Fri, Aug 30, 2013 at 12:29:22PM +0800, Jason Wang wrote:
> As Michael point out, We used to limit the max pending DMAs to get better 
> cache
> utilization. But it was not done correctly since it was one done when there's 
> no
> new buffers submitted from guest. Guest can easily exceeds the limitation by
> keeping sending packets.
> 
> So this patch moves the check into main loop. Tests shows about 5%-10%
> improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
> transaction rate for a single session TCP_RR.

Any explanation for the drop? single session TCP_RR is unlikely to
exceed VHOST_MAX_PEND, correct?

> 
> Signed-off-by: Jason Wang 
> ---
>  drivers/vhost/net.c |   15 ---
>  1 files changed, 4 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
> index d09c17c..592e1f2 100644
> --- a/drivers/vhost/net.c
> +++ b/drivers/vhost/net.c
> @@ -363,6 +363,10 @@ static void handle_tx(struct vhost_net *net)
>   if (zcopy)
>   vhost_zerocopy_signal_used(net, vq);
>  
> + if ((nvq->upend_idx + vq->num - VHOST_MAX_PEND) % UIO_MAXIOV ==
> + nvq->done_idx)
> + break;
> +
>   head = vhost_get_vq_desc(>dev, vq, vq->iov,
>ARRAY_SIZE(vq->iov),
>, ,
> @@ -372,17 +376,6 @@ static void handle_tx(struct vhost_net *net)
>   break;
>   /* Nothing new?  Wait for eventfd to tell us they refilled. */
>   if (head == vq->num) {
> - int num_pends;
> -
> - /* If more outstanding DMAs, queue the work.
> -  * Handle upend_idx wrap around
> -  */
> - num_pends = likely(nvq->upend_idx >= nvq->done_idx) ?
> - (nvq->upend_idx - nvq->done_idx) :
> - (nvq->upend_idx + UIO_MAXIOV -
> -  nvq->done_idx);
> - if (unlikely(num_pends > VHOST_MAX_PEND))
> - break;
>   if (unlikely(vhost_enable_notify(>dev, vq))) {
>   vhost_disable_notify(>dev, vq);
>   continue;
> -- 
> 1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-09-01 Thread Michael S. Tsirkin
On Fri, Aug 30, 2013 at 12:29:22PM +0800, Jason Wang wrote:
 As Michael point out, We used to limit the max pending DMAs to get better 
 cache
 utilization. But it was not done correctly since it was one done when there's 
 no
 new buffers submitted from guest. Guest can easily exceeds the limitation by
 keeping sending packets.
 
 So this patch moves the check into main loop. Tests shows about 5%-10%
 improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
 transaction rate for a single session TCP_RR.

Any explanation for the drop? single session TCP_RR is unlikely to
exceed VHOST_MAX_PEND, correct?

 
 Signed-off-by: Jason Wang jasow...@redhat.com
 ---
  drivers/vhost/net.c |   15 ---
  1 files changed, 4 insertions(+), 11 deletions(-)
 
 diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
 index d09c17c..592e1f2 100644
 --- a/drivers/vhost/net.c
 +++ b/drivers/vhost/net.c
 @@ -363,6 +363,10 @@ static void handle_tx(struct vhost_net *net)
   if (zcopy)
   vhost_zerocopy_signal_used(net, vq);
  
 + if ((nvq-upend_idx + vq-num - VHOST_MAX_PEND) % UIO_MAXIOV ==
 + nvq-done_idx)
 + break;
 +
   head = vhost_get_vq_desc(net-dev, vq, vq-iov,
ARRAY_SIZE(vq-iov),
out, in,
 @@ -372,17 +376,6 @@ static void handle_tx(struct vhost_net *net)
   break;
   /* Nothing new?  Wait for eventfd to tell us they refilled. */
   if (head == vq-num) {
 - int num_pends;
 -
 - /* If more outstanding DMAs, queue the work.
 -  * Handle upend_idx wrap around
 -  */
 - num_pends = likely(nvq-upend_idx = nvq-done_idx) ?
 - (nvq-upend_idx - nvq-done_idx) :
 - (nvq-upend_idx + UIO_MAXIOV -
 -  nvq-done_idx);
 - if (unlikely(num_pends  VHOST_MAX_PEND))
 - break;
   if (unlikely(vhost_enable_notify(net-dev, vq))) {
   vhost_disable_notify(net-dev, vq);
   continue;
 -- 
 1.7.1
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-08-29 Thread Jason Wang
As Michael point out, We used to limit the max pending DMAs to get better cache
utilization. But it was not done correctly since it was one done when there's no
new buffers submitted from guest. Guest can easily exceeds the limitation by
keeping sending packets.

So this patch moves the check into main loop. Tests shows about 5%-10%
improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
transaction rate for a single session TCP_RR.

Signed-off-by: Jason Wang 
---
 drivers/vhost/net.c |   15 ---
 1 files changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index d09c17c..592e1f2 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -363,6 +363,10 @@ static void handle_tx(struct vhost_net *net)
if (zcopy)
vhost_zerocopy_signal_used(net, vq);
 
+   if ((nvq->upend_idx + vq->num - VHOST_MAX_PEND) % UIO_MAXIOV ==
+   nvq->done_idx)
+   break;
+
head = vhost_get_vq_desc(>dev, vq, vq->iov,
 ARRAY_SIZE(vq->iov),
 , ,
@@ -372,17 +376,6 @@ static void handle_tx(struct vhost_net *net)
break;
/* Nothing new?  Wait for eventfd to tell us they refilled. */
if (head == vq->num) {
-   int num_pends;
-
-   /* If more outstanding DMAs, queue the work.
-* Handle upend_idx wrap around
-*/
-   num_pends = likely(nvq->upend_idx >= nvq->done_idx) ?
-   (nvq->upend_idx - nvq->done_idx) :
-   (nvq->upend_idx + UIO_MAXIOV -
-nvq->done_idx);
-   if (unlikely(num_pends > VHOST_MAX_PEND))
-   break;
if (unlikely(vhost_enable_notify(>dev, vq))) {
vhost_disable_notify(>dev, vq);
continue;
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH V2 6/6] vhost_net: correctly limit the max pending buffers

2013-08-29 Thread Jason Wang
As Michael point out, We used to limit the max pending DMAs to get better cache
utilization. But it was not done correctly since it was one done when there's no
new buffers submitted from guest. Guest can easily exceeds the limitation by
keeping sending packets.

So this patch moves the check into main loop. Tests shows about 5%-10%
improvement on per cpu throughput for guest tx. But a 5% drop on per cpu
transaction rate for a single session TCP_RR.

Signed-off-by: Jason Wang jasow...@redhat.com
---
 drivers/vhost/net.c |   15 ---
 1 files changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index d09c17c..592e1f2 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -363,6 +363,10 @@ static void handle_tx(struct vhost_net *net)
if (zcopy)
vhost_zerocopy_signal_used(net, vq);
 
+   if ((nvq-upend_idx + vq-num - VHOST_MAX_PEND) % UIO_MAXIOV ==
+   nvq-done_idx)
+   break;
+
head = vhost_get_vq_desc(net-dev, vq, vq-iov,
 ARRAY_SIZE(vq-iov),
 out, in,
@@ -372,17 +376,6 @@ static void handle_tx(struct vhost_net *net)
break;
/* Nothing new?  Wait for eventfd to tell us they refilled. */
if (head == vq-num) {
-   int num_pends;
-
-   /* If more outstanding DMAs, queue the work.
-* Handle upend_idx wrap around
-*/
-   num_pends = likely(nvq-upend_idx = nvq-done_idx) ?
-   (nvq-upend_idx - nvq-done_idx) :
-   (nvq-upend_idx + UIO_MAXIOV -
-nvq-done_idx);
-   if (unlikely(num_pends  VHOST_MAX_PEND))
-   break;
if (unlikely(vhost_enable_notify(net-dev, vq))) {
vhost_disable_notify(net-dev, vq);
continue;
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/