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);
}

Reply via email to