struct tbf_sched_data *q = qdisc_priv(sch);
        struct sk_buff *segs, *nskb;
        netdev_features_t features = netif_skb_features(skb);
-       unsigned int len = 0, prev_len = qdisc_pkt_len(skb);
+       unsigned int len = 0, prev_len = qdisc_pkt_len(skb), seg_len;
        int ret, nb;
 
        segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK);
        nb = 0;
        skb_list_walk_safe(segs, segs, nskb) {
                skb_mark_not_on_list(segs);
-               qdisc_skb_cb(segs)->pkt_len = segs->len;
-               len += segs->len;
+               seg_len = segs->len;
+               qdisc_skb_cb(segs)->pkt_len = seg_len;
                ret = qdisc_enqueue(segs, q->qdisc, to_free);
                if (ret != NET_XMIT_SUCCESS) {
                        if (net_xmit_drop_count(ret))
                                qdisc_qstats_drop(sch);
                } else {
                        nb++;
+                       len += seg_len;
                }
        }
        sch->q.qlen += nb;
-       if (nb > 1)
+       sch->qstats.backlog += len;
+       if (nb > 0) {
                qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len);
-       consume_skb(skb);
-       return nb > 0 ? NET_XMIT_SUCCESS : NET_XMIT_DROP;
+               consume_skb(skb);
+               return NET_XMIT_SUCCESS;
+       }
+
+       kfree_skb(skb);
+       return NET_XMIT_DROP;
 }
 
 static int tbf_enqueue(struct sk_buff *skb, struct Qdisc *sch,