From: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Date: 2021-01-16 02:46:40
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: John Fastabend <john.fastabend@gmail.com> Date: 2021-01-17 21:57:07
Xuan Zhuo wrote:
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
Passing a 'int *err' here is ugly IMO use the ERR_PTR/PTR_ERR macros
and roll it into the return value.
or maybe use the out: pattern used in the kernel, but just doing direct
returns like now but with ERR_PTR() would also be fine.
+ struct sk_buff *skb ;
struct sk_buff *skb = NULL;
err = -ENOMEM;
+
+ if (xs->dev->features & NETIF_F_SKB_NO_LINEAR) {
+ skb = xsk_build_skb_zerocopy(xs, desc);
+ if (unlikely(!skb)) {
From: Magnus Karlsson <hidden> Date: 2021-01-18 10:44:24
On Sat, Jan 16, 2021 at 3:47 AM Xuan Zhuo [off-list ref] wrote:
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
network card supports the header information of the packet in the frag
and not in the linear space.
Could you please break this new feature bit into its own patch and
produce a patch set. Patch 1 being the NETIF_F_SKB_NO_LINEAR bit
addition and patch 2 being the xsk part. I can then ack patch 2 since
I am one of the maintainers of that, and then the owner of the netdev
bits can ack that part (whoever that is?). The bit addition looks fine
to me, but I am not the owner of those feature bits, so I would feel
somewhat awkward to ack that.
Otherwise, good performance boost. I like it. Thank you!
quoted hunk
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */--
From: "Michael S. Tsirkin" <mst@redhat.com> Date: 2021-01-18 12:00:42
On Sat, Jan 16, 2021 at 10:44:53AM +0800, Xuan Zhuo wrote:
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk) goto out; while (xskq_cons_peek_desc(xs->tx, &desc, xs->pool)) {- char *buffer;- u64 addr;- u32 len;- if (max_batch-- == 0) { err = -EAGAIN; goto out; }- len = desc.len;- skb = sock_alloc_send_skb(sk, len, 1, &err);+ skb = xsk_build_skb(xs, &desc, &err); if (unlikely(!skb)) goto out;- skb_put(skb, len);- addr = desc.addr;- buffer = xsk_buff_raw_get_data(xs->pool, addr);- err = skb_store_bits(skb, 0, buffer, len); /* This is the backpressure mechanism for the Tx path. * Reserve space in the completion queue and only proceed * if there is space in it. This avoids having to implement * any buffering in the Tx path. */ spin_lock_irqsave(&xs->pool->cq_lock, flags);- if (unlikely(err) || xskq_prod_reserve(xs->pool->cq)) {+ if (xskq_prod_reserve(xs->pool->cq)) { spin_unlock_irqrestore(&xs->pool->cq_lock, flags); kfree_skb(skb); goto out; } spin_unlock_irqrestore(&xs->pool->cq_lock, flags);- skb->dev = xs->dev;- skb->priority = sk->sk_priority;- skb->mark = sk->sk_mark;- skb_shinfo(skb)->destructor_arg = (void *)(long)desc.addr;- skb->destructor = xsk_destruct_skb;- err = __dev_direct_xmit(skb, xs->queue_id); if (err == NETDEV_TX_BUSY) { /* Tell user-space to retry the send */
From: Yunsheng Lin <hidden> Date: 2021-01-18 12:42:54
On 2021/1/16 10:44, Xuan Zhuo wrote:
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
quoted hunk
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Alexander Lobakin <hidden> Date: 2021-01-18 12:43:43
From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Date: Sat, 16 Jan 2021 10:44:53 +0800
quoted hunk
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I think the best would be if you will split this patch into three:
- the first one will introduce NETI_F_SKB_NO_LINEAR;
- the second will add this feature to virtio_net;
- the third will do the rest.
Also, it would be nice if you'll mention (in the cover letter or
in the third patch) that in order to get a nice boost on non-ZC
XSK xmit developers can add a support for completely non-linear
skbs and advertise this new feature in their drivers. I think
there'll be enough folks wanting to do this.
As the others said, just use ERR_PTR() and PTR_ERR().
You also should have received the letters from kernel test robot
that the current version is non-compilable at all.
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk) goto out; while (xskq_cons_peek_desc(xs->tx, &desc, xs->pool)) {- char *buffer;- u64 addr;- u32 len;- if (max_batch-- == 0) { err = -EAGAIN; goto out; }- len = desc.len;- skb = sock_alloc_send_skb(sk, len, 1, &err);+ skb = xsk_build_skb(xs, &desc, &err); if (unlikely(!skb)) goto out;- skb_put(skb, len);- addr = desc.addr;- buffer = xsk_buff_raw_get_data(xs->pool, addr);- err = skb_store_bits(skb, 0, buffer, len); /* This is the backpressure mechanism for the Tx path. * Reserve space in the completion queue and only proceed * if there is space in it. This avoids having to implement * any buffering in the Tx path. */ spin_lock_irqsave(&xs->pool->cq_lock, flags);- if (unlikely(err) || xskq_prod_reserve(xs->pool->cq)) {+ if (xskq_prod_reserve(xs->pool->cq)) { spin_unlock_irqrestore(&xs->pool->cq_lock, flags); kfree_skb(skb); goto out; } spin_unlock_irqrestore(&xs->pool->cq_lock, flags);- skb->dev = xs->dev;- skb->priority = sk->sk_priority;- skb->mark = sk->sk_mark;- skb_shinfo(skb)->destructor_arg = (void *)(long)desc.addr;- skb->destructor = xsk_destruct_skb;- err = __dev_direct_xmit(skb, xs->queue_id); if (err == NETDEV_TX_BUSY) { /* Tell user-space to retry the send */
From: Alexander Lobakin <hidden> Date: 2021-01-18 13:03:28
From: Yunsheng Lin <redacted>
Date: Mon, 18 Jan 2021 20:40:52 +0800
On 2021/1/16 10:44, Xuan Zhuo wrote:
quoted
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
As far as I can grep, only mlx4 supports this, and it has a different
meaning in that driver.
So I guess a new netdev_feature would be a better solution.
quoted
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I completely forgot to add that you'd better to mention in both
enumeration/feature and its Ethtool string that the feature applies
to Tx path.
Smth like:
NETIF_F_SKB_TX_NO_LINEAR{,_BIT}, "skb-tx-no-linear"
or
NETIF_F_TX_SKB_NO_LINEAR{,_BIT}, "tx-skb-no-linear"
Otherwise, it may be confusing for users and developers.
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Alexander Lobakin <hidden> Date: 2021-01-18 14:46:12
From: Alexander Lobakin <redacted>
Date: Mon, 18 Jan 2021 13:00:17 +0000
From: Yunsheng Lin <redacted>
Date: Mon, 18 Jan 2021 20:40:52 +0800
quoted
On 2021/1/16 10:44, Xuan Zhuo wrote:
quoted
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
As far as I can grep, only mlx4 supports this, and it has a different
meaning in that driver.
So I guess a new netdev_feature would be a better solution.
quoted
quoted
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I completely forgot to add that you'd better to mention in both
enumeration/feature and its Ethtool string that the feature applies
to Tx path.
Smth like:
NETIF_F_SKB_TX_NO_LINEAR{,_BIT}, "skb-tx-no-linear"
or
NETIF_F_TX_SKB_NO_LINEAR{,_BIT}, "tx-skb-no-linear"
Otherwise, it may be confusing for users and developers.
OR, I think we may tight the feature with the new approach to build
skbs by page as it makes no sense for anything else.
So, if we define something like:
NETIF_F_XSK_TX_GENERIC_ZC{,_BIT}, "xsk-tx-generic-zerocopy",
then user can toggle your new XSK Tx path on/off via Ethtool for
drivers that will support it (don't forget to add it to hw_features
for virtio_net then).
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Magnus Karlsson <hidden> Date: 2021-01-18 15:08:20
On Mon, Jan 18, 2021 at 3:47 PM Alexander Lobakin [off-list ref] wrote:
From: Alexander Lobakin <redacted>
Date: Mon, 18 Jan 2021 13:00:17 +0000
quoted
From: Yunsheng Lin <redacted>
Date: Mon, 18 Jan 2021 20:40:52 +0800
quoted
On 2021/1/16 10:44, Xuan Zhuo wrote:
quoted
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
As far as I can grep, only mlx4 supports this, and it has a different
meaning in that driver.
So I guess a new netdev_feature would be a better solution.
quoted
quoted
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I completely forgot to add that you'd better to mention in both
enumeration/feature and its Ethtool string that the feature applies
to Tx path.
Smth like:
NETIF_F_SKB_TX_NO_LINEAR{,_BIT}, "skb-tx-no-linear"
or
NETIF_F_TX_SKB_NO_LINEAR{,_BIT}, "tx-skb-no-linear"
Otherwise, it may be confusing for users and developers.
OR, I think we may tight the feature with the new approach to build
skbs by page as it makes no sense for anything else.
So, if we define something like:
NETIF_F_XSK_TX_GENERIC_ZC{,_BIT}, "xsk-tx-generic-zerocopy",
then user can toggle your new XSK Tx path on/off via Ethtool for
drivers that will support it (don't forget to add it to hw_features
for virtio_net then).
Is there ever a reason not to use this path if it is available? If
not, then it would IMO be better if the xsk base code could probe for
this bit and always use this faster path when the feature is supported
by the driver. If it is not supported by the driver, we will just fall
back on the old approach. This way, the user would get better
performance without having to know it needs to toggle some special bit
using Ethtool.
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Magnus Karlsson <hidden> Date: 2021-01-18 15:20:08
On Mon, Jan 18, 2021 at 3:47 PM Alexander Lobakin [off-list ref] wrote:
From: Alexander Lobakin <redacted>
Date: Mon, 18 Jan 2021 13:00:17 +0000
quoted
From: Yunsheng Lin <redacted>
Date: Mon, 18 Jan 2021 20:40:52 +0800
quoted
On 2021/1/16 10:44, Xuan Zhuo wrote:
quoted
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
As far as I can grep, only mlx4 supports this, and it has a different
meaning in that driver.
So I guess a new netdev_feature would be a better solution.
quoted
quoted
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I completely forgot to add that you'd better to mention in both
enumeration/feature and its Ethtool string that the feature applies
to Tx path.
Smth like:
NETIF_F_SKB_TX_NO_LINEAR{,_BIT}, "skb-tx-no-linear"
or
NETIF_F_TX_SKB_NO_LINEAR{,_BIT}, "tx-skb-no-linear"
Otherwise, it may be confusing for users and developers.
I prefer one of these names for the property as they clearly describe
a feature that the driver supports.
OR, I think we may tight the feature with the new approach to build
skbs by page as it makes no sense for anything else.
So, if we define something like:
NETIF_F_XSK_TX_GENERIC_ZC{,_BIT}, "xsk-tx-generic-zerocopy",
This one I misunderstood first. I thought: "this is not zerocopy", but
you are right it is. It is zero-copy implemented with skb:s. But in my
mind, the NO_LINEAR version that you suggested are clearer.
then user can toggle your new XSK Tx path on/off via Ethtool for
drivers that will support it (don't forget to add it to hw_features
for virtio_net then).
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Alexander Lobakin <hidden> Date: 2021-01-18 16:40:41
From: Magnus Karlsson <redacted>
Date: Mon, 18 Jan 2021 16:10:40 +0100
On Mon, Jan 18, 2021 at 3:47 PM Alexander Lobakin [off-list ref] wrote:
quoted
From: Alexander Lobakin <redacted>
Date: Mon, 18 Jan 2021 13:00:17 +0000
quoted
From: Yunsheng Lin <redacted>
Date: Mon, 18 Jan 2021 20:40:52 +0800
quoted
On 2021/1/16 10:44, Xuan Zhuo wrote:
quoted
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
As far as I can grep, only mlx4 supports this, and it has a different
meaning in that driver.
So I guess a new netdev_feature would be a better solution.
quoted
quoted
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I completely forgot to add that you'd better to mention in both
enumeration/feature and its Ethtool string that the feature applies
to Tx path.
Smth like:
NETIF_F_SKB_TX_NO_LINEAR{,_BIT}, "skb-tx-no-linear"
or
NETIF_F_TX_SKB_NO_LINEAR{,_BIT}, "tx-skb-no-linear"
Otherwise, it may be confusing for users and developers.
I prefer one of these names for the property as they clearly describe
a feature that the driver supports.
quoted
OR, I think we may tight the feature with the new approach to build
skbs by page as it makes no sense for anything else.
So, if we define something like:
NETIF_F_XSK_TX_GENERIC_ZC{,_BIT}, "xsk-tx-generic-zerocopy",
This one I misunderstood first. I thought: "this is not zerocopy", but
you are right it is. It is zero-copy implemented with skb:s. But in my
mind, the NO_LINEAR version that you suggested are clearer.
quoted
then user can toggle your new XSK Tx path on/off via Ethtool for
drivers that will support it (don't forget to add it to hw_features
for virtio_net then).
User don't need to enable manually this, drivers usually enable most
of their features on netdevice creation. This way we just could have
an option to turn it off.
If the feature is not about to be exposed to user at all, only to
indicate if a particular driver supports skbs with skb_headlen == 0
on its .ndo_start_xmit() path, then it might be better to introduce
a private flag (netdev_priv_flags) instead of netdev_feature. Private
flags are kernel-only and can't be toggled on/off after netdev is
registered.
E.g.
IFF_TX_SKB_NO_LINEAR
and test it like
if (dev->priv_flags & IFF_TX_SKB_NO_LINEAR) {
/* new generic zerocopy path */
} else {
/* current code */
}
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Magnus Karlsson <hidden> Date: 2021-01-19 07:03:39
On Mon, Jan 18, 2021 at 5:38 PM Alexander Lobakin [off-list ref] wrote:
quoted
From: Magnus Karlsson <redacted>
Date: Mon, 18 Jan 2021 16:10:40 +0100
On Mon, Jan 18, 2021 at 3:47 PM Alexander Lobakin [off-list ref] wrote:
quoted
From: Alexander Lobakin <redacted>
Date: Mon, 18 Jan 2021 13:00:17 +0000
quoted
From: Yunsheng Lin <redacted>
Date: Mon, 18 Jan 2021 20:40:52 +0800
quoted
On 2021/1/16 10:44, Xuan Zhuo wrote:
quoted
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
Does it make sense to use ETHTOOL_TX_COPYBREAK tunable in ethtool to
configure if the data is copied or not?
As far as I can grep, only mlx4 supports this, and it has a different
meaning in that driver.
So I guess a new netdev_feature would be a better solution.
quoted
quoted
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
I completely forgot to add that you'd better to mention in both
enumeration/feature and its Ethtool string that the feature applies
to Tx path.
Smth like:
NETIF_F_SKB_TX_NO_LINEAR{,_BIT}, "skb-tx-no-linear"
or
NETIF_F_TX_SKB_NO_LINEAR{,_BIT}, "tx-skb-no-linear"
Otherwise, it may be confusing for users and developers.
I prefer one of these names for the property as they clearly describe
a feature that the driver supports.
quoted
OR, I think we may tight the feature with the new approach to build
skbs by page as it makes no sense for anything else.
So, if we define something like:
NETIF_F_XSK_TX_GENERIC_ZC{,_BIT}, "xsk-tx-generic-zerocopy",
This one I misunderstood first. I thought: "this is not zerocopy", but
you are right it is. It is zero-copy implemented with skb:s. But in my
mind, the NO_LINEAR version that you suggested are clearer.
quoted
then user can toggle your new XSK Tx path on/off via Ethtool for
drivers that will support it (don't forget to add it to hw_features
for virtio_net then).
User don't need to enable manually this, drivers usually enable most
of their features on netdevice creation. This way we just could have
an option to turn it off.
If the feature is not about to be exposed to user at all, only to
indicate if a particular driver supports skbs with skb_headlen == 0
on its .ndo_start_xmit() path, then it might be better to introduce
a private flag (netdev_priv_flags) instead of netdev_feature. Private
flags are kernel-only and can't be toggled on/off after netdev is
registered.
E.g.
IFF_TX_SKB_NO_LINEAR
and test it like
if (dev->priv_flags & IFF_TX_SKB_NO_LINEAR) {
/* new generic zerocopy path */
} else {
/* current code */
}
This sounds like a good idea. I would go with this. Thank you Alexander!
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk)gotoout;while(xskq_cons_peek_desc(xs->tx,&desc,xs->pool)){-char*buffer;-u64addr;-u32len;-if(max_batch--==0){err=-EAGAIN;gotoout;}-len=desc.len;-skb=sock_alloc_send_skb(sk,len,1,&err);+skb=xsk_build_skb(xs,&desc,&err);if(unlikely(!skb))gotoout;-skb_put(skb,len);-addr=desc.addr;-buffer=xsk_buff_raw_get_data(xs->pool,addr);-err=skb_store_bits(skb,0,buffer,len);/* This is the backpressure mechanism for the Tx path.*Reservespaceinthecompletionqueueandonlyproceed*ifthereisspaceinit.Thisavoidshavingtoimplement*anybufferingintheTxpath.*/spin_lock_irqsave(&xs->pool->cq_lock,flags);-if(unlikely(err)||xskq_prod_reserve(xs->pool->cq)){+if(xskq_prod_reserve(xs->pool->cq)){spin_unlock_irqrestore(&xs->pool->cq_lock,flags);kfree_skb(skb);gotoout;}spin_unlock_irqrestore(&xs->pool->cq_lock,flags);-skb->dev=xs->dev;-skb->priority=sk->sk_priority;-skb->mark=sk->sk_mark;-skb_shinfo(skb)->destructor_arg=(void*)(long)desc.addr;-skb->destructor=xsk_destruct_skb;-err=__dev_direct_xmit(skb,xs->queue_id);if(err==NETDEV_TX_BUSY){/* Tell user-space to retry the send */
From: Alexander Lobakin <hidden> Date: 2021-01-19 13:03:02
From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Date: Sat, 16 Jan 2021 10:44:53 +0800
quoted hunk
This patch is used to construct skb based on page to save memory copy
overhead.
This has one problem:
We construct the skb by fill the data page as a frag into the skb. In
this way, the linear space is empty, and the header information is also
in the frag, not in the linear space, which is not allowed for some
network cards. For example, Mellanox Technologies MT27710 Family
[ConnectX-4 Lx] will get the following error message:
mlx5_core 0000:3b:00.1 eth1: Error cqe on cqn 0x817, ci 0x8, qn 0x1dbb, opcode 0xd, syndrome 0x1, vendor syndrome 0x68
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 60 10 68 01 0a 00 1d bb 00 0f 9f d2
WQE DUMP: WQ size 1024 WQ cur size 0, WQE index 0xf, len: 64
00000000: 00 00 0f 0a 00 1d bb 03 00 00 00 08 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 2b 00 08 00 00 00 00 00 05 9e e3 08 00
00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
mlx5_core 0000:3b:00.1 eth1: ERR CQE on SQ: 0x1dbb
I also tried to use build_skb to construct skb, but because of the
existence of skb_shinfo, it must be behind the linear space, so this
method is not working. We can't put skb_shinfo on desc->addr, it will be
exposed to users, this is not safe.
Finally, I added a feature NETIF_F_SKB_NO_LINEAR to identify whether the
network card supports the header information of the packet in the frag
and not in the linear space.
---------------- Performance Testing ------------
The test environment is Aliyun ECS server.
Test cmd:
@@ -2985,7 +2985,7 @@ static int virtnet_probe(struct virtio_device *vdev)/* Set up network device as normal. */dev->priv_flags|=IFF_UNICAST_FLT|IFF_LIVE_ADDR_CHANGE;dev->netdev_ops=&virtnet_netdev;-dev->features=NETIF_F_HIGHDMA;+dev->features=NETIF_F_HIGHDMA|NETIF_F_SKB_NO_LINEAR;dev->ethtool_ops=&virtnet_ethtool_ops;SET_NETDEV_DEV(dev,&vdev->dev);
@@ -85,9 +85,11 @@ enum {NETIF_F_HW_MACSEC_BIT,/* Offload MACsec operations */+NETIF_F_SKB_NO_LINEAR_BIT,/* Allow skb linear is empty */+/**Addyourfreshnewfeatureaboveandremembertoupdate-*netdev_features_strings[]innet/core/ethtool.candmaybe+*netdev_features_strings[]innet/ethtool/common.candmaybe*somefeaturemask#definesbelow.Pleasealsodescribeit*inDocumentation/networking/netdev-features.rst.*/
@@ -157,6 +159,7 @@ enum {#define NETIF_F_GRO_FRAGLIST __NETIF_F(GRO_FRAGLIST)#define NETIF_F_GSO_FRAGLIST __NETIF_F(GSO_FRAGLIST)#define NETIF_F_HW_MACSEC __NETIF_F(HW_MACSEC)+#define NETIF_F_SKB_NO_LINEAR __NETIF_F(SKB_NO_LINEAR)/* Finds the next feature with the highest number of the range of start till 0.*/
@@ -446,43 +535,28 @@ static int xsk_generic_xmit(struct sock *sk) goto out; while (xskq_cons_peek_desc(xs->tx, &desc, xs->pool)) {- char *buffer;- u64 addr;- u32 len;- if (max_batch-- == 0) { err = -EAGAIN; goto out; }- len = desc.len;- skb = sock_alloc_send_skb(sk, len, 1, &err);+ skb = xsk_build_skb(xs, &desc, &err); if (unlikely(!skb)) goto out;- skb_put(skb, len);- addr = desc.addr;- buffer = xsk_buff_raw_get_data(xs->pool, addr);- err = skb_store_bits(skb, 0, buffer, len); /* This is the backpressure mechanism for the Tx path. * Reserve space in the completion queue and only proceed * if there is space in it. This avoids having to implement * any buffering in the Tx path. */ spin_lock_irqsave(&xs->pool->cq_lock, flags);- if (unlikely(err) || xskq_prod_reserve(xs->pool->cq)) {+ if (xskq_prod_reserve(xs->pool->cq)) { spin_unlock_irqrestore(&xs->pool->cq_lock, flags); kfree_skb(skb); goto out; } spin_unlock_irqrestore(&xs->pool->cq_lock, flags);- skb->dev = xs->dev;- skb->priority = sk->sk_priority;- skb->mark = sk->sk_mark;- skb_shinfo(skb)->destructor_arg = (void *)(long)desc.addr;- skb->destructor = xsk_destruct_skb;- err = __dev_direct_xmit(skb, xs->queue_id); if (err == NETDEV_TX_BUSY) { /* Tell user-space to retry the send */