dpaa_eth: refactor frag count checking
authorMadalin Bucur <madalin.bucur@nxp.com>
Mon, 26 Feb 2018 17:24:03 +0000 (11:24 -0600)
committerDavid S. Miller <davem@davemloft.net>
Tue, 27 Feb 2018 16:40:03 +0000 (11:40 -0500)
Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c

index bdf57fe..9bd0ff0 100644 (file)
@@ -2055,19 +2055,23 @@ static int dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
        /* MAX_SKB_FRAGS is equal or larger than our dpaa_SGT_MAX_ENTRIES;
         * make sure we don't feed FMan with more fragments than it supports.
         */
-       if (nonlinear &&
-           likely(skb_shinfo(skb)->nr_frags < DPAA_SGT_MAX_ENTRIES)) {
-               /* Just create a S/G fd based on the skb */
-               err = skb_to_sg_fd(priv, skb, &fd);
-               percpu_priv->tx_frag_skbuffs++;
-       } else {
+       if (unlikely(nonlinear &&
+                    (skb_shinfo(skb)->nr_frags >= DPAA_SGT_MAX_ENTRIES))) {
                /* If the egress skb contains more fragments than we support
                 * we have no choice but to linearize it ourselves.
                 */
-               if (unlikely(nonlinear) && __skb_linearize(skb))
+               if (__skb_linearize(skb))
                        goto enomem;
 
-               /* Finally, create a contig FD from this skb */
+               nonlinear = skb_is_nonlinear(skb);
+       }
+
+       if (nonlinear) {
+               /* Just create a S/G fd based on the skb */
+               err = skb_to_sg_fd(priv, skb, &fd);
+               percpu_priv->tx_frag_skbuffs++;
+       } else {
+               /* Create a contig FD from this skb */
                err = skb_to_contig_fd(priv, skb, &fd, &offset);
        }
        if (unlikely(err < 0))