From: Greg <gvrose8192@gmail.com>
To: Paolo Abeni <pabeni@redhat.com>
Cc: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Bogdan Hamciuc <bogdan.hamciuc@freescale.com>,
Ben Greear <greearb@candelatech.com>,
Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Subject: Re: [PATCH net v2] net: pktgen: fix pkt_size
Date: Fri, 30 Sep 2016 08:39:20 -0700 [thread overview]
Message-ID: <1475249960.3279.1.camel@gmail.com> (raw)
In-Reply-To: <5277a40b08c491bd4ff8f6e3276718848f7406e8.1475246890.git.pabeni@redhat.com>
On Fri, 2016-09-30 at 16:56 +0200, Paolo Abeni wrote:
> 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
>
> Fixes: 879c7220e828 ("net: pktgen: Observe needed_headroom of the device")
> Suggested-by: Ben Greear <greearb@candelatech.com>
> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
> ---
> net/core/pktgen.c | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/net/core/pktgen.c b/net/core/pktgen.c
> index bbd118b..5219a9e 100644
> --- a/net/core/pktgen.c
> +++ b/net/core/pktgen.c
> @@ -2286,7 +2286,7 @@ out:
>
> 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);
> @@ -2777,13 +2777,13 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb,
> }
>
> 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();
>
> @@ -2796,8 +2796,9 @@ static struct sk_buff *pktgen_alloc_skb(struct net_device *dev,
> 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);
Is the 16 here the same as HD_DATA_MOD?
Magic numbers...
Thanks,
- Greg
>
> return skb;
> }
> @@ -2830,16 +2831,14 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
> 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);
> @@ -2959,7 +2958,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev,
> 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;
next prev parent reply other threads:[~2016-09-30 15:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-30 14:56 [PATCH net v2] net: pktgen: fix pkt_size Paolo Abeni
2016-09-30 15:39 ` Greg [this message]
2016-10-01 18:05 ` Paolo Abeni
2016-10-03 13:56 ` Greg
2016-10-03 5:30 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1475249960.3279.1.camel@gmail.com \
--to=gvrose8192@gmail.com \
--cc=bogdan.hamciuc@freescale.com \
--cc=davem@davemloft.net \
--cc=greearb@candelatech.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sergei.shtylyov@cogentembedded.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.