struct bonding *bond = netdev_priv(bond_dev);
        struct slave *slave = NULL;
        struct list_head *iter;
+       bool xmit_suc = false;
+       bool skb_used = false;
 
        bond_for_each_slave_rcu(bond, slave, iter) {
-               if (bond_is_last_slave(bond, slave))
-                       break;
-               if (bond_slave_is_up(slave) && slave->link == BOND_LINK_UP) {
-                       struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
+               struct sk_buff *skb2;
+
+               if (!(bond_slave_is_up(slave) && slave->link == BOND_LINK_UP))
+                       continue;
 
+               if (bond_is_last_slave(bond, slave)) {
+                       skb2 = skb;
+                       skb_used = true;
+               } else {
+                       skb2 = skb_clone(skb, GFP_ATOMIC);
                        if (!skb2) {
                                net_err_ratelimited("%s: Error: %s: skb_clone() failed\n",
                                                    bond_dev->name, __func__);
                                continue;
                        }
-                       bond_dev_queue_xmit(bond, skb2, slave->dev);
                }
+
+               if (bond_dev_queue_xmit(bond, skb2, slave->dev) == NETDEV_TX_OK)
+                       xmit_suc = true;
        }
-       if (slave && bond_slave_is_up(slave) && slave->link == BOND_LINK_UP)
-               return bond_dev_queue_xmit(bond, skb, slave->dev);
 
-       return bond_tx_drop(bond_dev, skb);
+       if (!skb_used)
+               dev_kfree_skb_any(skb);
+
+       if (xmit_suc)
+               return NETDEV_TX_OK;
+
+       atomic_long_inc(&bond_dev->tx_dropped);
+       return NET_XMIT_DROP;
 }
 
 /*------------------------- Device initialization ---------------------------*/