Patch "net: pktgen: fix pkt_size" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
net: pktgen: fix pkt_size
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-pktgen-fix-pkt_size.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Nov 10 16:42:45 CET 2016
From: Paolo Abeni <[email protected]>
Date: Fri, 30 Sep 2016 16:56:45 +0200
Subject: net: pktgen: fix pkt_size
From: Paolo Abeni <[email protected]>
[ Upstream commit 63d75463c91a5b5be7c0aca11ceb45ea5a0ae81d ]
The commit 879c7220e828 ("net: pktgen: Observe needed_headroom of the device") increased the 'pkt_overhead' field value by LL_RESERVED_SPACE.
As a side effect the generated packet size, computed as:
/* Eth + IPh + UDPh + mpls */ datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 - pkt_dev->pkt_overhead;
is decreased by the same value.
The above changed slightly the behavior of existing pktgen users, and made the procfs interface somewhat inconsistent. Fix it by restoring the previous pkt_overhead value and using LL_RESERVED_SPACE as extralen in skb allocation.
Also, change pktgen_alloc_skb() to only partially reserve the headroom to allow the caller to prefetch from ll header start.
v1 -> v2:
- fixed some typos in the comments
--- net/core/pktgen.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)
net/core/pktgen.c +10 -11
@@ -2278,7 +2278,7 @@ static void spin(struct pktgen_dev *pkt_static inline void set_pkt_overhead (struct pktgen_dev *pkt_dev) { - pkt_dev->pkt_overhead =LL_RESERVED_SPACE (pkt_dev->odev); + pkt_dev->pkt_overhead =0 ; pkt_dev->pkt_overhead += pkt_dev->nr_labels*sizeof (u32); pkt_dev->pkt_overhead +=VLAN_TAG_SIZE (pkt_dev); pkt_dev->pkt_overhead +=SVLAN_TAG_SIZE (pkt_dev);
@@ -2769,13 +2769,13 @@ static void pktgen_finalize_skb(struct p }static struct sk_buff *pktgen_alloc_skb (struct net_device *dev, -struct pktgen_dev *pkt_dev, -unsigned int extralen) +struct pktgen_dev *pkt_dev) { +unsigned int extralen =LL_RESERVED_SPACE (dev);struct sk_buff *skb =NULL ; -unsigned int size = pkt_dev->cur_pkt_size +64 + extralen + - pkt_dev->pkt_overhead; +unsigned int size; + size = pkt_dev->cur_pkt_size +64 + extralen + pkt_dev->pkt_overhead;if (pkt_dev->flags &F_NODE ) {int node = pkt_dev->node >=0 ? pkt_dev->node :numa_node_id ();
@@ -2788,8 +2788,9 @@ static struct sk_buff *pktgen_alloc_skb( skb =__netdev_alloc_skb (dev, size,GFP_NOWAIT ); } +/* the caller pre-fetches from skb->data and reserves for the mac hdr */ if (likely (skb)) -skb_reserve (skb,LL_RESERVED_SPACE (dev)); +skb_reserve (skb, extralen -16 );return skb; }
@@ -2822,16 +2823,14 @@ static struct sk_buff *fill_packet_ipv4(mod_cur_headers (pkt_dev); queue_map = pkt_dev->cur_queue_map; - datalen = (odev->hard_header_len +16 ) & ~0xf ; - - skb =pktgen_alloc_skb (odev, pkt_dev, datalen); + skb =pktgen_alloc_skb (odev, pkt_dev);if (!skb) {sprintf (pkt_dev->result,"No memory" );return NULL ; }prefetchw (skb->data); -skb_reserve (skb, datalen); +skb_reserve (skb,16 );/* Reserve for ethernet and IP header */ eth = (__u8 *)skb_push (skb,14 );
@@ -2951,7 +2950,7 @@ static struct sk_buff *fill_packet_ipv6(mod_cur_headers (pkt_dev); queue_map = pkt_dev->cur_queue_map; - skb =pktgen_alloc_skb (odev, pkt_dev,16 ); + skb =pktgen_alloc_skb (odev, pkt_dev);if (!skb) {sprintf (pkt_dev->result,"No memory" );return NULL ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/net-pktgen-fix-pkt_size.patch