• Wei Yongjun's avatar
    net: sched: fix skb leak in dev_requeue_skb() · 9540d977
    Wei Yongjun authored
    When dev_requeue_skb() is called with bulked skb list, only the
    first skb of the list will be requeued to qdisc layer, and leak
    the others without free them.
    
    TCP is broken due to skb leak since no free skb will be considered
    as still in the host queue and never be retransmitted. This happend
    when dev_requeue_skb() called from qdisc_restart().
      qdisc_restart
      |-- dequeue_skb
      |-- sch_direct_xmit()
          |-- dev_requeue_skb() <-- skb may bluked
    
    Fix dev_requeue_skb() to requeue the full bluked list. Also change
    to use __skb_queue_tail() in __dev_requeue_skb() to avoid skb out
    of order.
    
    Fixes: a53851e2 ("net: sched: explicit locking in gso_cpu fallback")
    Signed-off-by: default avatarWei Yongjun <weiyongjun1@huawei.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9540d977
sch_generic.c 30.5 KB