* [PATCH net-next] tuntap: hardware vlan tx support
@ 2013-07-23 7:15 Jason Wang
2013-07-23 12:12 ` Sergei Shtylyov
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Jason Wang @ 2013-07-23 7:15 UTC (permalink / raw)
To: davem, mst, netdev, linux-kernel; +Cc: Jason Wang, Basil Gor
Inspired by commit f09e2249c4f5c7c13261ec73f5a7807076af0c8e (macvtap: restore
vlan header on user read). This patch adds hardware vlan tx support for
tuntap. This is done by copying vlan header directly into userspace in
tun_put_user() instead of doing it through __vlan_put_tag() in
dev_hard_start_xmit(). This eliminates one unnecessary memove in
vlan_insert_tag() for 802.1ad and 802.1q traffic.
pktgen test shows about 20% improvement for 802.1q traffic:
Before:
662149pps 317Mb/sec (317831520bps) errors: 0
After:
801033pps 384Mb/sec (384495840bps) errors: 0
Cc: Basil Gor <basil.gor@gmail.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
drivers/net/tun.c | 39 +++++++++++++++++++++++++++++++++++----
1 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index a72d141..66e265d 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -60,6 +60,7 @@
#include <linux/if_arp.h>
#include <linux/if_ether.h>
#include <linux/if_tun.h>
+#include <linux/if_vlan.h>
#include <linux/crc32.h>
#include <linux/nsproxy.h>
#include <linux/virtio_net.h>
@@ -1265,6 +1266,7 @@ static ssize_t tun_put_user(struct tun_struct *tun,
{
struct tun_pi pi = { 0, skb->protocol };
ssize_t total = 0;
+ int vlan_offset = 0;
if (!(tun->flags & TUN_NO_PI)) {
if ((len -= sizeof(pi)) < 0)
@@ -1328,11 +1330,39 @@ static ssize_t tun_put_user(struct tun_struct *tun,
total += tun->vnet_hdr_sz;
}
- len = min_t(int, skb->len, len);
+ if (!vlan_tx_tag_present(skb))
+ len = min_t(int, skb->len, len);
+ else {
+ int copy, ret;
+ struct {
+ __be16 h_vlan_proto;
+ __be16 h_vlan_TCI;
+ } veth;
+ veth.h_vlan_proto = skb->vlan_proto;
+ veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb));
+
+ vlan_offset = offsetof(struct vlan_ethhdr, h_vlan_proto);
+ len = min_t(int, skb->len + VLAN_HLEN, len);
+
+ copy = min_t(int, vlan_offset, len);
+ ret = skb_copy_datagram_const_iovec(skb, 0, iv, total, copy);
+ len -= copy;
+ total += copy;
+ if (ret || !len)
+ goto done;
+
+ copy = min_t(int, sizeof(veth), len);
+ ret = memcpy_toiovecend(iv, (void *)&veth, total, copy);
+ len -= copy;
+ total += copy;
+ if (ret || !len)
+ goto done;
+ }
- skb_copy_datagram_const_iovec(skb, 0, iv, total, len);
- total += skb->len;
+ skb_copy_datagram_const_iovec(skb, vlan_offset, iv, total, len);
+ total += len;
+done:
tun->dev->stats.tx_packets++;
tun->dev->stats.tx_bytes += len;
@@ -1691,7 +1721,8 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
tun_flow_init(tun);
dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST |
- TUN_USER_FEATURES;
+ TUN_USER_FEATURES | NETIF_F_HW_VLAN_CTAG_TX |
+ NETIF_F_HW_VLAN_STAG_TX;
dev->features = dev->hw_features;
dev->vlan_features = dev->features;
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-23 7:15 [PATCH net-next] tuntap: hardware vlan tx support Jason Wang
@ 2013-07-23 12:12 ` Sergei Shtylyov
2013-07-24 3:19 ` Jason Wang
2013-07-23 15:17 ` Stephen Hemminger
2013-07-23 15:53 ` Stephen Hemminger
2 siblings, 1 reply; 10+ messages in thread
From: Sergei Shtylyov @ 2013-07-23 12:12 UTC (permalink / raw)
To: Jason Wang; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
Hello.
On 23-07-2013 11:15, Jason Wang wrote:
> Inspired by commit f09e2249c4f5c7c13261ec73f5a7807076af0c8e (macvtap: restore
> vlan header on user read). This patch adds hardware vlan tx support for
> tuntap. This is done by copying vlan header directly into userspace in
> tun_put_user() instead of doing it through __vlan_put_tag() in
> dev_hard_start_xmit(). This eliminates one unnecessary memove in
s/memove/memmove/?
> vlan_insert_tag() for 802.1ad and 802.1q traffic.
> pktgen test shows about 20% improvement for 802.1q traffic:
> Before:
> 662149pps 317Mb/sec (317831520bps) errors: 0
> After:
> 801033pps 384Mb/sec (384495840bps) errors: 0
> Cc: Basil Gor <basil.gor@gmail.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> drivers/net/tun.c | 39 +++++++++++++++++++++++++++++++++++----
> 1 files changed, 35 insertions(+), 4 deletions(-)
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index a72d141..66e265d 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
[...]
> @@ -1328,11 +1330,39 @@ static ssize_t tun_put_user(struct tun_struct *tun,
> total += tun->vnet_hdr_sz;
> }
>
> - len = min_t(int, skb->len, len);
> + if (!vlan_tx_tag_present(skb))
> + len = min_t(int, skb->len, len);
> + else {
According to Documentation/CodingStyle chapter 3, both arms of an *if*
statement should have {} if one arm has it.
> + int copy, ret;
> + struct {
> + __be16 h_vlan_proto;
> + __be16 h_vlan_TCI;
> + } veth;
Empty line wouldn't hurt here, after declarations...
> + veth.h_vlan_proto = skb->vlan_proto;
> + veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb));
[...]
WBR, Sergei
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-23 12:12 ` Sergei Shtylyov
@ 2013-07-24 3:19 ` Jason Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jason Wang @ 2013-07-24 3:19 UTC (permalink / raw)
To: Sergei Shtylyov; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On 07/23/2013 08:12 PM, Sergei Shtylyov wrote:
> Hello.
>
> On 23-07-2013 11:15, Jason Wang wrote:
>
>> Inspired by commit f09e2249c4f5c7c13261ec73f5a7807076af0c8e (macvtap:
>> restore
>> vlan header on user read). This patch adds hardware vlan tx support for
>> tuntap. This is done by copying vlan header directly into userspace in
>> tun_put_user() instead of doing it through __vlan_put_tag() in
>> dev_hard_start_xmit(). This eliminates one unnecessary memove in
>
> s/memove/memmove/?
>
Yes.
>> vlan_insert_tag() for 802.1ad and 802.1q traffic.
>
>> pktgen test shows about 20% improvement for 802.1q traffic:
>
>> Before:
>> 662149pps 317Mb/sec (317831520bps) errors: 0
>> After:
>> 801033pps 384Mb/sec (384495840bps) errors: 0
>
>> Cc: Basil Gor <basil.gor@gmail.com>
>> Cc: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Jason Wang <jasowang@redhat.com>
>> ---
>> drivers/net/tun.c | 39 +++++++++++++++++++++++++++++++++++----
>> 1 files changed, 35 insertions(+), 4 deletions(-)
>
>> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
>> index a72d141..66e265d 100644
>> --- a/drivers/net/tun.c
>> +++ b/drivers/net/tun.c
> [...]
>> @@ -1328,11 +1330,39 @@ static ssize_t tun_put_user(struct tun_struct
>> *tun,
>> total += tun->vnet_hdr_sz;
>> }
>>
>> - len = min_t(int, skb->len, len);
>> + if (!vlan_tx_tag_present(skb))
>> + len = min_t(int, skb->len, len);
>> + else {
>
> According to Documentation/CodingStyle chapter 3, both arms of an
> *if* statement should have {} if one arm has it.
>
Right.
>> + int copy, ret;
>> + struct {
>> + __be16 h_vlan_proto;
>> + __be16 h_vlan_TCI;
>> + } veth;
>
> Empty line wouldn't hurt here, after declarations...
>
Ok
>> + veth.h_vlan_proto = skb->vlan_proto;
>> + veth.h_vlan_TCI = htons(vlan_tx_tag_get(skb));
> [...]
>
> WBR, Sergei
>
Thanks, will correct them.
> --
> 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 net-next] tuntap: hardware vlan tx support
2013-07-23 7:15 [PATCH net-next] tuntap: hardware vlan tx support Jason Wang
2013-07-23 12:12 ` Sergei Shtylyov
@ 2013-07-23 15:17 ` Stephen Hemminger
2013-07-23 15:27 ` Michael S. Tsirkin
2013-07-24 4:41 ` Jason Wang
2013-07-23 15:53 ` Stephen Hemminger
2 siblings, 2 replies; 10+ messages in thread
From: Stephen Hemminger @ 2013-07-23 15:17 UTC (permalink / raw)
To: Jason Wang; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On Tue, 23 Jul 2013 15:15:48 +0800
Jason Wang <jasowang@redhat.com> wrote:
> Inspired by commit f09e2249c4f5c7c13261ec73f5a7807076af0c8e (macvtap: restore
> vlan header on user read). This patch adds hardware vlan tx support for
> tuntap. This is done by copying vlan header directly into userspace in
> tun_put_user() instead of doing it through __vlan_put_tag() in
> dev_hard_start_xmit(). This eliminates one unnecessary memove in
> vlan_insert_tag() for 802.1ad and 802.1q traffic.
>
> pktgen test shows about 20% improvement for 802.1q traffic:
>
> Before:
> 662149pps 317Mb/sec (317831520bps) errors: 0
> After:
> 801033pps 384Mb/sec (384495840bps) errors: 0
>
> Cc: Basil Gor <basil.gor@gmail.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
You need to make this configurable by some mechanism, since otherwise
it will break applications that expect current VLAN behavior
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-23 15:17 ` Stephen Hemminger
@ 2013-07-23 15:27 ` Michael S. Tsirkin
2013-07-24 4:41 ` Jason Wang
1 sibling, 0 replies; 10+ messages in thread
From: Michael S. Tsirkin @ 2013-07-23 15:27 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: Jason Wang, davem, netdev, linux-kernel, Basil Gor
On Tue, Jul 23, 2013 at 08:17:27AM -0700, Stephen Hemminger wrote:
> On Tue, 23 Jul 2013 15:15:48 +0800
> Jason Wang <jasowang@redhat.com> wrote:
>
> > Inspired by commit f09e2249c4f5c7c13261ec73f5a7807076af0c8e (macvtap: restore
> > vlan header on user read). This patch adds hardware vlan tx support for
> > tuntap. This is done by copying vlan header directly into userspace in
> > tun_put_user() instead of doing it through __vlan_put_tag() in
> > dev_hard_start_xmit(). This eliminates one unnecessary memove in
> > vlan_insert_tag() for 802.1ad and 802.1q traffic.
> >
> > pktgen test shows about 20% improvement for 802.1q traffic:
> >
> > Before:
> > 662149pps 317Mb/sec (317831520bps) errors: 0
> > After:
> > 801033pps 384Mb/sec (384495840bps) errors: 0
> >
> > Cc: Basil Gor <basil.gor@gmail.com>
> > Cc: Michael S. Tsirkin <mst@redhat.com>
> > Signed-off-by: Jason Wang <jasowang@redhat.com>
>
>
> You need to make this configurable by some mechanism, since otherwise
> it will break applications that expect current VLAN behavior
I don't think there's a behavior change: vlan is still linearized
into the buffer. It's just done more efficiently.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-23 15:17 ` Stephen Hemminger
2013-07-23 15:27 ` Michael S. Tsirkin
@ 2013-07-24 4:41 ` Jason Wang
1 sibling, 0 replies; 10+ messages in thread
From: Jason Wang @ 2013-07-24 4:41 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On 07/23/2013 11:17 PM, Stephen Hemminger wrote:
> On Tue, 23 Jul 2013 15:15:48 +0800
> Jason Wang <jasowang@redhat.com> wrote:
>
>> Inspired by commit f09e2249c4f5c7c13261ec73f5a7807076af0c8e (macvtap: restore
>> vlan header on user read). This patch adds hardware vlan tx support for
>> tuntap. This is done by copying vlan header directly into userspace in
>> tun_put_user() instead of doing it through __vlan_put_tag() in
>> dev_hard_start_xmit(). This eliminates one unnecessary memove in
>> vlan_insert_tag() for 802.1ad and 802.1q traffic.
>>
>> pktgen test shows about 20% improvement for 802.1q traffic:
>>
>> Before:
>> 662149pps 317Mb/sec (317831520bps) errors: 0
>> After:
>> 801033pps 384Mb/sec (384495840bps) errors: 0
>>
>> Cc: Basil Gor <basil.gor@gmail.com>
>> Cc: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Jason Wang <jasowang@redhat.com>
>
> You need to make this configurable by some mechanism, since otherwise
> it will break applications that expect current VLAN behavior
> --
>
Didn't see any breakage. Vlan id will always exist in the userspace buffer.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-23 7:15 [PATCH net-next] tuntap: hardware vlan tx support Jason Wang
2013-07-23 12:12 ` Sergei Shtylyov
2013-07-23 15:17 ` Stephen Hemminger
@ 2013-07-23 15:53 ` Stephen Hemminger
2013-07-24 5:55 ` Jason Wang
2 siblings, 1 reply; 10+ messages in thread
From: Stephen Hemminger @ 2013-07-23 15:53 UTC (permalink / raw)
To: Jason Wang; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On Tue, 23 Jul 2013 15:15:48 +0800
Jason Wang <jasowang@redhat.com> wrote:
> + struct {
> + __be16 h_vlan_proto;
> + __be16 h_vlan_TCI;
> + } veth;
Don't you want to use struct vlan_hdr here?
Your definition puts the two fields out of order?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-23 15:53 ` Stephen Hemminger
@ 2013-07-24 5:55 ` Jason Wang
2013-07-24 15:11 ` Stephen Hemminger
0 siblings, 1 reply; 10+ messages in thread
From: Jason Wang @ 2013-07-24 5:55 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On 07/23/2013 11:53 PM, Stephen Hemminger wrote:
> On Tue, 23 Jul 2013 15:15:48 +0800
> Jason Wang <jasowang@redhat.com> wrote:
>
>> + struct {
>> + __be16 h_vlan_proto;
>> + __be16 h_vlan_TCI;
>> + } veth;
> Don't you want to use struct vlan_hdr here?
There's no need to care encapsulated proto here. In fact, we just
emulate the hardware inserting of 802.1Q header. So only skb->vlan_tci
and skb->vlan_proto needs to be cared.
> Your definition puts the two fields out of order?
It's order is same as struct vlan_ethhdr. Did you see any issue?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-24 5:55 ` Jason Wang
@ 2013-07-24 15:11 ` Stephen Hemminger
2013-07-25 3:31 ` Jason Wang
0 siblings, 1 reply; 10+ messages in thread
From: Stephen Hemminger @ 2013-07-24 15:11 UTC (permalink / raw)
To: Jason Wang; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On Wed, 24 Jul 2013 13:55:14 +0800
Jason Wang <jasowang@redhat.com> wrote:
> On 07/23/2013 11:53 PM, Stephen Hemminger wrote:
> > On Tue, 23 Jul 2013 15:15:48 +0800
> > Jason Wang <jasowang@redhat.com> wrote:
> >
> >> + struct {
> >> + __be16 h_vlan_proto;
> >> + __be16 h_vlan_TCI;
> >> + } veth;
> > Don't you want to use struct vlan_hdr here?
>
> There's no need to care encapsulated proto here. In fact, we just
> emulate the hardware inserting of 802.1Q header. So only skb->vlan_tci
> and skb->vlan_proto needs to be cared.
> > Your definition puts the two fields out of order?
>
> It's order is same as struct vlan_ethhdr. Did you see any issue?
I was looking at if_vlan.h struct vlan_hdr. The veth structure
is a slice between ether and vlan header.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net-next] tuntap: hardware vlan tx support
2013-07-24 15:11 ` Stephen Hemminger
@ 2013-07-25 3:31 ` Jason Wang
0 siblings, 0 replies; 10+ messages in thread
From: Jason Wang @ 2013-07-25 3:31 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: davem, mst, netdev, linux-kernel, Basil Gor
On 07/24/2013 11:11 PM, Stephen Hemminger wrote:
> On Wed, 24 Jul 2013 13:55:14 +0800
> Jason Wang <jasowang@redhat.com> wrote:
>
>> On 07/23/2013 11:53 PM, Stephen Hemminger wrote:
>>> On Tue, 23 Jul 2013 15:15:48 +0800
>>> Jason Wang <jasowang@redhat.com> wrote:
>>>
>>>> + struct {
>>>> + __be16 h_vlan_proto;
>>>> + __be16 h_vlan_TCI;
>>>> + } veth;
>>> Don't you want to use struct vlan_hdr here?
>> There's no need to care encapsulated proto here. In fact, we just
>> emulate the hardware inserting of 802.1Q header. So only skb->vlan_tci
>> and skb->vlan_proto needs to be cared.
>>> Your definition puts the two fields out of order?
>> It's order is same as struct vlan_ethhdr. Did you see any issue?
> I was looking at if_vlan.h struct vlan_hdr. The veth structure
> is a slice between ether and vlan header.
Right, so no functional issue.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2013-07-25 3:31 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-23 7:15 [PATCH net-next] tuntap: hardware vlan tx support Jason Wang
2013-07-23 12:12 ` Sergei Shtylyov
2013-07-24 3:19 ` Jason Wang
2013-07-23 15:17 ` Stephen Hemminger
2013-07-23 15:27 ` Michael S. Tsirkin
2013-07-24 4:41 ` Jason Wang
2013-07-23 15:53 ` Stephen Hemminger
2013-07-24 5:55 ` Jason Wang
2013-07-24 15:11 ` Stephen Hemminger
2013-07-25 3:31 ` Jason Wang
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).