[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20201018001326.auu4u7mgfnxk37nx@skbuf>
Date: Sun, 18 Oct 2020 00:13:27 +0000
From: Vladimir Oltean <vladimir.oltean@....com>
To: "netdev@...r.kernel.org" <netdev@...r.kernel.org>
CC: "andrew@...n.ch" <andrew@...n.ch>,
"f.fainelli@...il.com" <f.fainelli@...il.com>,
"vivien.didelot@...il.com" <vivien.didelot@...il.com>,
"kuba@...nel.org" <kuba@...nel.org>,
Christian Eggers <ceggers@...i.de>,
Kurt Kanzenbach <kurt@...utronix.de>
Subject: Re: [RFC PATCH 02/13] net: dsa: implement a central TX reallocation
procedure
On Sun, Oct 18, 2020 at 01:31:20AM +0300, Vladimir Oltean wrote:
> On Sun, Oct 18, 2020 at 01:01:04AM +0300, Vladimir Oltean wrote:
> > > + return pskb_expand_head(skb, headroom, tailroom, GFP_ATOMIC);
> > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > err = pskb_expand_head(skb, headroom, tailroom, GFP_ATOMIC);
> > if (err < 0 || !padlen)
> > return err;
> >
> > return __skb_put_padto(skb, padlen, false);
>
> Oops, another one here. Should be:
>
> return __skb_put_padto(skb, skb->len + padlen, false);
> > > +}
Last one for today. This should actually be correct now, and not
allocate double the needed headroom size.
static int dsa_realloc_skb(struct sk_buff *skb, struct net_device *dev)
{
struct dsa_slave_priv *p = netdev_priv(dev);
struct dsa_slave_stats *e;
int needed_headroom;
int needed_tailroom;
int padlen = 0, err;
needed_headroom = dev->needed_headroom;
needed_tailroom = dev->needed_tailroom;
/* For tail taggers, we need to pad short frames ourselves, to ensure
* that the tail tag does not fail at its role of being at the end of
* the packet, once the master interface pads the frame.
*/
if (unlikely(needed_tailroom && skb->len < ETH_ZLEN))
padlen = ETH_ZLEN - skb->len;
needed_tailroom += padlen;
needed_headroom -= skb_headroom(skb);
needed_tailroom -= skb_tailroom(skb);
if (likely(needed_headroom <= 0 && needed_tailroom <= 0 &&
!skb_cloned(skb)))
/* No reallocation needed, yay! */
return 0;
e = this_cpu_ptr(p->extra_stats);
u64_stats_update_begin(&e->syncp);
e->tx_reallocs++;
u64_stats_update_end(&e->syncp);
err = pskb_expand_head(skb, max(needed_headroom, 0),
max(needed_tailroom, 0), GFP_ATOMIC);
if (err < 0 || !padlen)
return err;
return __skb_put_padto(skb, ETH_ZLEN, false);
}
Powered by blists - more mailing lists