From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Axtens Subject: [PATCH] net: sched: tbf: handle GSO_BY_FRAGS case in enqueue Date: Mon, 5 Feb 2018 14:34:33 +1100 Message-ID: <20180205033433.23647-1-dja@axtens.net> Cc: Daniel Axtens To: netdev@vger.kernel.org Return-path: Received: from mail-pl0-f65.google.com ([209.85.160.65]:43744 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751963AbeBEDf0 (ORCPT ); Sun, 4 Feb 2018 22:35:26 -0500 Received: by mail-pl0-f65.google.com with SMTP id f4so10889913plr.10 for ; Sun, 04 Feb 2018 19:35:26 -0800 (PST) Sender: netdev-owner@vger.kernel.org List-ID: tbf_enqueue() checks the size of a packet before enqueuing it. However, the GSO size check does not consider the GSO_BY_FRAGS case, and so will drop GSO SCTP packets, causing a massive drop in throughput. Use skb_gso_validate_mac_len() instead, as it does consider that case. --- skb_gso_validate_mac_len() is an out-of-line call, but so is skb_gso_mac_seglen(), so this is slower but not much slower. I will send a patch to make the skb_gso_validate_* functions inline-able shortly. Also, GSO_BY_FRAGS considered harmful - I'm pretty sure this is not the only place it causes issues. Signed-off-by: Daniel Axtens --- net/sched/sch_tbf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 229172d509cc..03225a8df973 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -188,7 +188,8 @@ static int tbf_enqueue(struct sk_buff *skb, struct Qdisc *sch, int ret; if (qdisc_pkt_len(skb) > q->max_size) { - if (skb_is_gso(skb) && skb_gso_mac_seglen(skb) <= q->max_size) + if (skb_is_gso(skb) && + skb_gso_validate_mac_len(skb, q->max_size)) return tbf_segment(skb, sch, to_free); return qdisc_drop(skb, sch, to_free); } -- 2.14.1