From patchwork Tue Nov 25 13:24:52 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yang Yingliang X-Patchwork-Id: 414663 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3A1591401D0 for ; Wed, 26 Nov 2014 00:25:22 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754794AbaKYNZO (ORCPT ); Tue, 25 Nov 2014 08:25:14 -0500 Received: from szxga01-in.huawei.com ([119.145.14.64]:54739 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752338AbaKYNZK (ORCPT ); Tue, 25 Nov 2014 08:25:10 -0500 Received: from 172.24.2.119 (EHLO szxeml460-hub.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CEZ56100; Tue, 25 Nov 2014 21:25:03 +0800 (CST) Received: from localhost (10.177.18.231) by szxeml460-hub.china.huawei.com (10.82.67.203) with Microsoft SMTP Server id 14.3.158.1; Tue, 25 Nov 2014 21:25:00 +0800 From: Yang Yingliang To: CC: , Subject: [PATCH net-next 3/3] sch_fq: segment too big GSO packets Date: Tue, 25 Nov 2014 21:24:52 +0800 Message-ID: <1416921892-4756-4-git-send-email-yangyingliang@huawei.com> X-Mailer: git-send-email 1.8.1.msysgit.1 In-Reply-To: <1416921892-4756-1-git-send-email-yangyingliang@huawei.com> References: <1416921892-4756-1-git-send-email-yangyingliang@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.177.18.231] X-CFilter-Loop: Reflected Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If a GSO packet cost more than 125ms to send, segment the packet and send individual segments. Signed-off-by: Yang Yingliang --- net/sched/sch_fq.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c index ec6eff8..0119340 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c @@ -423,6 +423,30 @@ static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch) return qdisc_drop(skb, sch); } + if (skb_is_gso(skb) && skb_is_too_big(skb, q, NULL)) { + struct sk_buff *segs, *nskb; + netdev_features_t features = netif_skb_features(skb); + int nb = 0; + + segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); + + if (IS_ERR_OR_NULL(segs)) + goto enqueue_out; + + while (segs) { + nskb = segs->next; + qdisc_skb_cb(segs)->pkt_len = segs->len; + __fq_enqueue(segs, sch, f); + nb++; + segs = nskb; + } + if (nb > 1) + qdisc_tree_decrease_qlen(sch, 1 - nb); + consume_skb(skb); + return NET_XMIT_SUCCESS; + } + +enqueue_out: return __fq_enqueue(skb, sch, f); }