linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] netdev: pktgen xmit packet through vlan interface
@ 2014-05-02  7:18 Zhouyi Zhou
  2014-05-02 13:19 ` Jesper Dangaard Brouer
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Zhouyi Zhou @ 2014-05-02  7:18 UTC (permalink / raw)
  To: davem, steffen.klassert, fan.du, dborkman, minipli, tgraf,
	netdev, linux-kernel
  Cc: Zhouyi Zhou, Zhouyi Zhou

As http://www.spinics.net/lists/netdev/msg165015.html
pktgen generates shared packet through vlan interface will cause
oops because of duplicate entering tc queue.

Try to solve this problem by means of packet clone instead of sharing.

Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
---
 net/core/pktgen.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 0304f98..ced07fc 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -3297,6 +3297,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
 	netdev_tx_t (*xmit)(struct sk_buff *, struct net_device *)
 		= odev->netdev_ops->ndo_start_xmit;
 	struct netdev_queue *txq;
+	struct sk_buff *nskb = NULL;
 	u16 queue_map;
 	int ret;
 
@@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
 		pkt_dev->last_ok = 0;
 		goto unlock;
 	}
-	atomic_inc(&(pkt_dev->skb->users));
-	ret = (*xmit)(pkt_dev->skb, odev);
+
+	if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
+		nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
+		ret = -ENOMEM;
+		if (nskb)
+			ret = (*xmit)(nskb, odev);
+		else
+			nskb = ERR_PTR(ret);
+	} else {
+		atomic_inc(&(pkt_dev->skb->users));
+		ret = (*xmit)(pkt_dev->skb, odev);
+	}
 
 	switch (ret) {
 	case NETDEV_TX_OK:
@@ -3372,7 +3383,10 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
 	case NETDEV_TX_LOCKED:
 	case NETDEV_TX_BUSY:
 		/* Retry it next time */
-		atomic_dec(&(pkt_dev->skb->users));
+		if (nskb && !IS_ERR(nskb))
+			kfree_skb(nskb);
+		else
+			atomic_dec(&(pkt_dev->skb->users));
 		pkt_dev->last_ok = 0;
 	}
 unlock:
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02  7:18 [PATCH] netdev: pktgen xmit packet through vlan interface Zhouyi Zhou
@ 2014-05-02 13:19 ` Jesper Dangaard Brouer
  2014-05-02 14:00   ` John Fastabend
  2014-05-02 16:18 ` Sergei Shtylyov
  2014-05-05 15:43 ` Jiri Pirko
  2 siblings, 1 reply; 10+ messages in thread
From: Jesper Dangaard Brouer @ 2014-05-02 13:19 UTC (permalink / raw)
  To: Zhouyi Zhou
  Cc: brouer, davem, steffen.klassert, fan.du, dborkman, minipli,
	tgraf, netdev, linux-kernel, Zhouyi Zhou

On Fri,  2 May 2014 15:18:12 +0800
Zhouyi Zhou <zhouzhouyi@gmail.com> wrote:

> As http://www.spinics.net/lists/netdev/msg165015.html
> pktgen generates shared packet through vlan interface will cause
> oops because of duplicate entering tc queue.
>
> Try to solve this problem by means of packet clone instead of sharing.

I really don't like adding this stuff to the fast path of pktgen.

Why would you use pktgen on a VLAN?

Why don't you use the "vlan_id" feature available in pktgen, and send
in the lower real device?



> Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
> ---
>  net/core/pktgen.c |   20 +++++++++++++++++---
>  1 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/net/core/pktgen.c b/net/core/pktgen.c
> index 0304f98..ced07fc 100644
> --- a/net/core/pktgen.c
> +++ b/net/core/pktgen.c
> @@ -3297,6 +3297,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>  	netdev_tx_t (*xmit)(struct sk_buff *, struct net_device *)
>  		= odev->netdev_ops->ndo_start_xmit;
>  	struct netdev_queue *txq;
> +	struct sk_buff *nskb = NULL;
>  	u16 queue_map;
>  	int ret;
>  
> @@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>  		pkt_dev->last_ok = 0;
>  		goto unlock;
>  	}
> -	atomic_inc(&(pkt_dev->skb->users));
> -	ret = (*xmit)(pkt_dev->skb, odev);
> +
> +	if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
> +		nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
> +		ret = -ENOMEM;
> +		if (nskb)
> +			ret = (*xmit)(nskb, odev);
> +		else
> +			nskb = ERR_PTR(ret);
> +	} else {
> +		atomic_inc(&(pkt_dev->skb->users));
> +		ret = (*xmit)(pkt_dev->skb, odev);
> +	}
>  
>  	switch (ret) {
>  	case NETDEV_TX_OK:
> @@ -3372,7 +3383,10 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>  	case NETDEV_TX_LOCKED:
>  	case NETDEV_TX_BUSY:
>  		/* Retry it next time */
> -		atomic_dec(&(pkt_dev->skb->users));
> +		if (nskb && !IS_ERR(nskb))
> +			kfree_skb(nskb);
> +		else
> +			atomic_dec(&(pkt_dev->skb->users));
>  		pkt_dev->last_ok = 0;
>  	}
>  unlock:



-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Sr. Network Kernel Developer at Red Hat
  Author of http://www.iptv-analyzer.org
  LinkedIn: http://www.linkedin.com/in/brouer

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02 13:19 ` Jesper Dangaard Brouer
@ 2014-05-02 14:00   ` John Fastabend
  2014-05-02 14:55     ` Zhouyi Zhou
  2014-05-05 15:12     ` Jesper Dangaard Brouer
  0 siblings, 2 replies; 10+ messages in thread
From: John Fastabend @ 2014-05-02 14:00 UTC (permalink / raw)
  To: Jesper Dangaard Brouer
  Cc: Zhouyi Zhou, davem, steffen.klassert, fan.du, dborkman, minipli,
	tgraf, netdev, linux-kernel, Zhouyi Zhou

On 5/2/2014 6:19 AM, Jesper Dangaard Brouer wrote:
> On Fri,  2 May 2014 15:18:12 +0800
> Zhouyi Zhou <zhouzhouyi@gmail.com> wrote:
>
>> As http://www.spinics.net/lists/netdev/msg165015.html
>> pktgen generates shared packet through vlan interface will cause
>> oops because of duplicate entering tc queue.
>>
>> Try to solve this problem by means of packet clone instead of sharing.
>
> I really don't like adding this stuff to the fast path of pktgen.
>
> Why would you use pktgen on a VLAN?

Its a good way to test qdiscs. When you run pktgen over the VLAN
you exercise the lower devices qdisc.

Although I never submitted a patch like this because I figured it
was a corner case and we would want to keep the hotpath clean.

>
> Why don't you use the "vlan_id" feature available in pktgen, and send
> in the lower real device?
>
>
>
>> Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
>> ---
>>   net/core/pktgen.c |   20 +++++++++++++++++---
>>   1 files changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/net/core/pktgen.c b/net/core/pktgen.c
>> index 0304f98..ced07fc 100644
>> --- a/net/core/pktgen.c
>> +++ b/net/core/pktgen.c
>> @@ -3297,6 +3297,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>>   	netdev_tx_t (*xmit)(struct sk_buff *, struct net_device *)
>>   		= odev->netdev_ops->ndo_start_xmit;
>>   	struct netdev_queue *txq;
>> +	struct sk_buff *nskb = NULL;
>>   	u16 queue_map;
>>   	int ret;
>>
>> @@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>>   		pkt_dev->last_ok = 0;
>>   		goto unlock;
>>   	}
>> -	atomic_inc(&(pkt_dev->skb->users));
>> -	ret = (*xmit)(pkt_dev->skb, odev);
>> +
>> +	if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
>> +		nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
>> +		ret = -ENOMEM;
>> +		if (nskb)
>> +			ret = (*xmit)(nskb, odev);
>> +		else
>> +			nskb = ERR_PTR(ret);
>> +	} else {
>> +		atomic_inc(&(pkt_dev->skb->users));
>> +		ret = (*xmit)(pkt_dev->skb, odev);
>> +	}
>>
>>   	switch (ret) {
>>   	case NETDEV_TX_OK:
>> @@ -3372,7 +3383,10 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>>   	case NETDEV_TX_LOCKED:
>>   	case NETDEV_TX_BUSY:
>>   		/* Retry it next time */
>> -		atomic_dec(&(pkt_dev->skb->users));
>> +		if (nskb && !IS_ERR(nskb))
>> +			kfree_skb(nskb);
>> +		else
>> +			atomic_dec(&(pkt_dev->skb->users));
>>   		pkt_dev->last_ok = 0;
>>   	}
>>   unlock:
>
>
>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02 14:00   ` John Fastabend
@ 2014-05-02 14:55     ` Zhouyi Zhou
  2014-05-05 15:12     ` Jesper Dangaard Brouer
  1 sibling, 0 replies; 10+ messages in thread
From: Zhouyi Zhou @ 2014-05-02 14:55 UTC (permalink / raw)
  To: John Fastabend
  Cc: Jesper Dangaard Brouer, David Miller, steffen.klassert, fan.du,
	dborkman, Mathias Krause, tgraf, netdev, linux-kernel,
	Zhouyi Zhou

Thanks for reviewing

On Fri, May 2, 2014 at 10:00 PM, John Fastabend
<john.r.fastabend@intel.com> wrote:
> On 5/2/2014 6:19 AM, Jesper Dangaard Brouer wrote:
>>
>> On Fri,  2 May 2014 15:18:12 +0800
>> Zhouyi Zhou <zhouzhouyi@gmail.com> wrote:
>>
>>> As http://www.spinics.net/lists/netdev/msg165015.html
>>> pktgen generates shared packet through vlan interface will cause
>>> oops because of duplicate entering tc queue.
>>>
>>> Try to solve this problem by means of packet clone instead of sharing.
>>
>>
>> I really don't like adding this stuff to the fast path of pktgen.


>>
>> Why would you use pktgen on a VLAN?

I use pktgen on a VLAN under a special circumstance.

>
>
> Its a good way to test qdiscs. When you run pktgen over the VLAN
> you exercise the lower devices qdisc.
>
> Although I never submitted a patch like this because I figured it
> was a corner case and we would want to keep the hotpath clean.
>

I think is_vlan_dev(odev) have great chances to be in a cache line
that seldom got reset. Could we only judge is_vlan_dev(odev) in my
first if statement?


Also I guess if (nskb && !IS_ERR(nskb)) happens in rarely reached
cases when the interface is not overload.

>
>>
>> Why don't you use the "vlan_id" feature available in pktgen, and send
>> in the lower real device?

Could we automatically convert the VLAN device's joining effort to
real device + vlan_id settings in pkt_dev.
or could we issue a warning or a suggestion
when user try to add a VLAN device to the pktgen thread?

>>
>>
>>
>>> Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
>>> ---
>>>   net/core/pktgen.c |   20 +++++++++++++++++---
>>>   1 files changed, 17 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/net/core/pktgen.c b/net/core/pktgen.c
>>> index 0304f98..ced07fc 100644
>>> --- a/net/core/pktgen.c
>>> +++ b/net/core/pktgen.c
>>> @@ -3297,6 +3297,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>>>         netdev_tx_t (*xmit)(struct sk_buff *, struct net_device *)
>>>                 = odev->netdev_ops->ndo_start_xmit;
>>>         struct netdev_queue *txq;
>>> +       struct sk_buff *nskb = NULL;
>>>         u16 queue_map;
>>>         int ret;
>>>
>>> @@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev
>>> *pkt_dev)
>>>                 pkt_dev->last_ok = 0;
>>>                 goto unlock;
>>>         }
>>> -       atomic_inc(&(pkt_dev->skb->users));
>>> -       ret = (*xmit)(pkt_dev->skb, odev);
>>> +
>>> +       if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
>>> +               nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
>>> +               ret = -ENOMEM;
>>> +               if (nskb)
>>> +                       ret = (*xmit)(nskb, odev);
>>> +               else
>>> +                       nskb = ERR_PTR(ret);
>>> +       } else {
>>> +               atomic_inc(&(pkt_dev->skb->users));
>>> +               ret = (*xmit)(pkt_dev->skb, odev);
>>> +       }
>>>
>>>         switch (ret) {
>>>         case NETDEV_TX_OK:
>>> @@ -3372,7 +3383,10 @@ static void pktgen_xmit(struct pktgen_dev
>>> *pkt_dev)
>>>         case NETDEV_TX_LOCKED:
>>>         case NETDEV_TX_BUSY:
>>>                 /* Retry it next time */
>>> -               atomic_dec(&(pkt_dev->skb->users));
>>> +               if (nskb && !IS_ERR(nskb))
>>> +                       kfree_skb(nskb);
>>> +               else
>>> +                       atomic_dec(&(pkt_dev->skb->users));
>>>                 pkt_dev->last_ok = 0;
>>>         }
>>>   unlock:
>>
>>
>>
>>
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02  7:18 [PATCH] netdev: pktgen xmit packet through vlan interface Zhouyi Zhou
  2014-05-02 13:19 ` Jesper Dangaard Brouer
@ 2014-05-02 16:18 ` Sergei Shtylyov
  2014-05-03  0:58   ` Zhouyi Zhou
  2014-05-05 15:43 ` Jiri Pirko
  2 siblings, 1 reply; 10+ messages in thread
From: Sergei Shtylyov @ 2014-05-02 16:18 UTC (permalink / raw)
  To: Zhouyi Zhou, davem, steffen.klassert, fan.du, dborkman, minipli,
	tgraf, netdev, linux-kernel
  Cc: Zhouyi Zhou

Hello.

On 05/02/2014 11:18 AM, Zhouyi Zhou wrote:

> As http://www.spinics.net/lists/netdev/msg165015.html
> pktgen generates shared packet through vlan interface will cause
> oops because of duplicate entering tc queue.

> Try to solve this problem by means of packet clone instead of sharing.

> Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
> ---
>   net/core/pktgen.c |   20 +++++++++++++++++---
>   1 files changed, 17 insertions(+), 3 deletions(-)

> diff --git a/net/core/pktgen.c b/net/core/pktgen.c
> index 0304f98..ced07fc 100644
> --- a/net/core/pktgen.c
> +++ b/net/core/pktgen.c
[...]
> @@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
>   		pkt_dev->last_ok = 0;
>   		goto unlock;
>   	}
> -	atomic_inc(&(pkt_dev->skb->users));
> -	ret = (*xmit)(pkt_dev->skb, odev);
> +
> +	if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
> +		nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
> +		ret = -ENOMEM;
> +		if (nskb)
> +			ret = (*xmit)(nskb, odev);

    You can just do:

			ret = xmit(nskb, odev);

> +		else
> +			nskb = ERR_PTR(ret);
> +	} else {
> +		atomic_inc(&(pkt_dev->skb->users));
> +		ret = (*xmit)(pkt_dev->skb, odev);

    Same here.

WBR, Sergei


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02 16:18 ` Sergei Shtylyov
@ 2014-05-03  0:58   ` Zhouyi Zhou
  0 siblings, 0 replies; 10+ messages in thread
From: Zhouyi Zhou @ 2014-05-03  0:58 UTC (permalink / raw)
  To: Sergei Shtylyov
  Cc: David Miller, steffen.klassert, fan.du, dborkman, Mathias Krause,
	tgraf, netdev, linux-kernel, Zhouyi Zhou

Thank Sergei for reviewing.

I think
On Sat, May 3, 2014 at 12:18 AM, Sergei Shtylyov
<sergei.shtylyov@cogentembedded.com> wrote:

>> +
>> +       if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
>> +               nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
>> +               ret = -ENOMEM;
>> +               if (nskb)
>> +                       ret = (*xmit)(nskb, odev);
if (is_vlan_dev(odev) && pkt_dev->clone_skb) {
        nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
        ret = -ENOMEM;
        if (nskb)
             ret = (*xmit)(nskb, odev);
}
>
and

case NETDEV_TX_LOCKED:
case NETDEV_TX_BUSY:
     /* Retry it next time */
     atomic_dec(&(pkt_dev->skb->users));
     if (is_vlan_dev(odev) && pkt_dev->clone_skb && nskb)
                 kfree_skb(nskb);
     else
                 atomic_dec(&(pkt_dev->skb->users));

is better, because is_vlan_dev(odev) is probably in  read most cache line.

Zhouyi

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02 14:00   ` John Fastabend
  2014-05-02 14:55     ` Zhouyi Zhou
@ 2014-05-05 15:12     ` Jesper Dangaard Brouer
  2014-05-05 16:24       ` Ben Greear
  1 sibling, 1 reply; 10+ messages in thread
From: Jesper Dangaard Brouer @ 2014-05-05 15:12 UTC (permalink / raw)
  To: John Fastabend
  Cc: Zhouyi Zhou, davem, steffen.klassert, fan.du, dborkman, minipli,
	tgraf, netdev, linux-kernel, Zhouyi Zhou, brouer

On Fri, 02 May 2014 07:00:00 -0700
John Fastabend <john.r.fastabend@intel.com> wrote:

> On 5/2/2014 6:19 AM, Jesper Dangaard Brouer wrote:
> > On Fri,  2 May 2014 15:18:12 +0800
> > Zhouyi Zhou <zhouzhouyi@gmail.com> wrote:
> >
> >> As http://www.spinics.net/lists/netdev/msg165015.html
> >> pktgen generates shared packet through vlan interface will cause
> >> oops because of duplicate entering tc queue.
> >>
> >> Try to solve this problem by means of packet clone instead of sharing.
> >
> > I really don't like adding this stuff to the fast path of pktgen.
> >
> > Why would you use pktgen on a VLAN?
> 
> Its a good way to test qdiscs. When you run pktgen over the VLAN
> you exercise the lower devices qdisc.

I do (personally) need a faster way/tool to exercise the qdisc path.
I'm currently using trafgen, but it is not fast enough for my 10G
testing.

Perhaps we could add a pktgen option, that explicitly enable
transmitting on qdisc path.  And when adding a VLAN device, auto enable
that mode?


> Although I never submitted a patch like this because I figured it
> was a corner case and we would want to keep the hotpath clean.

I'm worried about the overhead of skb_clone() on for every pktgen
pkt_dev->clone_skb counter... does it "invalidate" using the pktgen
CLONE_SKB counter (kind-of confusing pktgen uses "clone_skb" for its
counter).


> > Why don't you use the "vlan_id" feature available in pktgen, and send
> > in the lower real device?

Guess, we can use it for testing/stressing the qdisc code path.


> >> Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
> >> ---
> >>   net/core/pktgen.c |   20 +++++++++++++++++---
> >>   1 files changed, 17 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/net/core/pktgen.c b/net/core/pktgen.c
[...]
> >> @@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
> >>   		pkt_dev->last_ok = 0;
> >>   		goto unlock;
> >>   	}
> >> -	atomic_inc(&(pkt_dev->skb->users));
> >> -	ret = (*xmit)(pkt_dev->skb, odev);
> >> +
> >> +	if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
> >> +		nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
> >> +		ret = -ENOMEM;
> >> +		if (nskb)
> >> +			ret = (*xmit)(nskb, odev);
> >> +		else
> >> +			nskb = ERR_PTR(ret);
> >> +	} else {
> >> +		atomic_inc(&(pkt_dev->skb->users));
> >> +		ret = (*xmit)(pkt_dev->skb, odev);
> >> +	}


-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Sr. Network Kernel Developer at Red Hat
  Author of http://www.iptv-analyzer.org
  LinkedIn: http://www.linkedin.com/in/brouer

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-02  7:18 [PATCH] netdev: pktgen xmit packet through vlan interface Zhouyi Zhou
  2014-05-02 13:19 ` Jesper Dangaard Brouer
  2014-05-02 16:18 ` Sergei Shtylyov
@ 2014-05-05 15:43 ` Jiri Pirko
  2 siblings, 0 replies; 10+ messages in thread
From: Jiri Pirko @ 2014-05-05 15:43 UTC (permalink / raw)
  To: Zhouyi Zhou
  Cc: davem, steffen.klassert, fan.du, dborkman, minipli, tgraf,
	netdev, linux-kernel, Zhouyi Zhou

Fri, May 02, 2014 at 09:18:12AM CEST, zhouzhouyi@gmail.com wrote:
>As http://www.spinics.net/lists/netdev/msg165015.html
>pktgen generates shared packet through vlan interface will cause
>oops because of duplicate entering tc queue.
>
>Try to solve this problem by means of packet clone instead of sharing.

Isn't this prohibited by:
dev->priv_flags         &= ~(IFF_TX_SKB_SHARING);
?

>
>Signed-off-by: Zhouyi Zhou <yizhouzhou@ict.ac.cn>
>---
> net/core/pktgen.c |   20 +++++++++++++++++---
> 1 files changed, 17 insertions(+), 3 deletions(-)
>
>diff --git a/net/core/pktgen.c b/net/core/pktgen.c
>index 0304f98..ced07fc 100644
>--- a/net/core/pktgen.c
>+++ b/net/core/pktgen.c
>@@ -3297,6 +3297,7 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
> 	netdev_tx_t (*xmit)(struct sk_buff *, struct net_device *)
> 		= odev->netdev_ops->ndo_start_xmit;
> 	struct netdev_queue *txq;
>+	struct sk_buff *nskb = NULL;
> 	u16 queue_map;
> 	int ret;
> 
>@@ -3347,8 +3348,18 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
> 		pkt_dev->last_ok = 0;
> 		goto unlock;
> 	}
>-	atomic_inc(&(pkt_dev->skb->users));
>-	ret = (*xmit)(pkt_dev->skb, odev);
>+
>+	if (pkt_dev->clone_skb && is_vlan_dev(odev)) {
>+		nskb = skb_clone(pkt_dev->skb, GFP_ATOMIC);
>+		ret = -ENOMEM;
>+		if (nskb)
>+			ret = (*xmit)(nskb, odev);
>+		else
>+			nskb = ERR_PTR(ret);
>+	} else {
>+		atomic_inc(&(pkt_dev->skb->users));
>+		ret = (*xmit)(pkt_dev->skb, odev);
>+	}
> 
> 	switch (ret) {
> 	case NETDEV_TX_OK:
>@@ -3372,7 +3383,10 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev)
> 	case NETDEV_TX_LOCKED:
> 	case NETDEV_TX_BUSY:
> 		/* Retry it next time */
>-		atomic_dec(&(pkt_dev->skb->users));
>+		if (nskb && !IS_ERR(nskb))
>+			kfree_skb(nskb);
>+		else
>+			atomic_dec(&(pkt_dev->skb->users));
> 		pkt_dev->last_ok = 0;
> 	}
> unlock:
>-- 
>1.7.1
>
>--
>To unsubscribe from this list: send the line "unsubscribe netdev" in
>the body of a message to majordomo@vger.kernel.org
>More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-05 15:12     ` Jesper Dangaard Brouer
@ 2014-05-05 16:24       ` Ben Greear
  2014-05-06  1:51         ` Zhouyi Zhou
  0 siblings, 1 reply; 10+ messages in thread
From: Ben Greear @ 2014-05-05 16:24 UTC (permalink / raw)
  To: Jesper Dangaard Brouer
  Cc: John Fastabend, Zhouyi Zhou, davem, steffen.klassert, fan.du,
	dborkman, minipli, tgraf, netdev, linux-kernel, Zhouyi Zhou

On 05/05/2014 08:12 AM, Jesper Dangaard Brouer wrote:
> On Fri, 02 May 2014 07:00:00 -0700
> John Fastabend <john.r.fastabend@intel.com> wrote:
> 
>> On 5/2/2014 6:19 AM, Jesper Dangaard Brouer wrote:
>>> On Fri,  2 May 2014 15:18:12 +0800
>>> Zhouyi Zhou <zhouzhouyi@gmail.com> wrote:
>>>
>>>> As http://www.spinics.net/lists/netdev/msg165015.html
>>>> pktgen generates shared packet through vlan interface will cause
>>>> oops because of duplicate entering tc queue.
>>>>
>>>> Try to solve this problem by means of packet clone instead of sharing.
>>>
>>> I really don't like adding this stuff to the fast path of pktgen.
>>>
>>> Why would you use pktgen on a VLAN?
>>
>> Its a good way to test qdiscs. When you run pktgen over the VLAN
>> you exercise the lower devices qdisc.
> 
> I do (personally) need a faster way/tool to exercise the qdisc path.
> I'm currently using trafgen, but it is not fast enough for my 10G
> testing.
> 
> Perhaps we could add a pktgen option, that explicitly enable
> transmitting on qdisc path.  And when adding a VLAN device, auto enable
> that mode?

You could just force pktgen to not support multi-skb on vlan interfaces?

I thought we went through this a year or two ago and came up with
something like a 'pktgen-challenged' network interface flag?

Thanks,
Ben


-- 
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc  http://www.candelatech.com


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] netdev: pktgen xmit packet through vlan interface
  2014-05-05 16:24       ` Ben Greear
@ 2014-05-06  1:51         ` Zhouyi Zhou
  0 siblings, 0 replies; 10+ messages in thread
From: Zhouyi Zhou @ 2014-05-06  1:51 UTC (permalink / raw)
  To: Ben Greear
  Cc: Jesper Dangaard Brouer, John Fastabend, David Miller,
	steffen.klassert, fan.du, dborkman, Mathias Krause, tgraf,
	netdev, linux-kernel, Zhouyi Zhou

> You could just force pktgen to not support multi-skb on vlan interfaces?
>
> I thought we went through this a year or two ago and came up with
> something like a 'pktgen-challenged' network interface flag?

Ah yes,  IFF_TX_SKB_SHARING does the job, very sorry for missing that,
 as matter of fact, I have
tailed pktgen model for my personal use.

By the way, would skb_clone save the CPU cycles for
memset(skb_put(skb, datalen), 0, datalen) thing ? especially for
Jesper's qdisc test scenery.





>
> Thanks,
> Ben
>
>
> --
> Ben Greear <greearb@candelatech.com>
> Candela Technologies Inc  http://www.candelatech.com
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2014-05-06  1:51 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-02  7:18 [PATCH] netdev: pktgen xmit packet through vlan interface Zhouyi Zhou
2014-05-02 13:19 ` Jesper Dangaard Brouer
2014-05-02 14:00   ` John Fastabend
2014-05-02 14:55     ` Zhouyi Zhou
2014-05-05 15:12     ` Jesper Dangaard Brouer
2014-05-05 16:24       ` Ben Greear
2014-05-06  1:51         ` Zhouyi Zhou
2014-05-02 16:18 ` Sergei Shtylyov
2014-05-03  0:58   ` Zhouyi Zhou
2014-05-05 15:43 ` Jiri Pirko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).