From patchwork Fri Jan 19 23:09:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 863846 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="g6qC0bzh"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zNc3x0K7cz9sP9 for ; Sat, 20 Jan 2018 10:10:04 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756236AbeASXKC (ORCPT ); Fri, 19 Jan 2018 18:10:02 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:42334 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754862AbeASXJz (ORCPT ); Fri, 19 Jan 2018 18:09:55 -0500 Received: by mail-pg0-f68.google.com with SMTP id q67so2502649pga.9 for ; Fri, 19 Jan 2018 15:09:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=K6bu0cSZ12wzLgHTzMNvo8kCjfgxRBd1+kk9Vhgjt9o=; b=g6qC0bzhDZ8LF3FOKhdAuQNG7CFPkHXIZ5NTc/+To/8wqbOvNzQZT2tpePtCOxzPzX M5scNwbbEBE/rHlbu5RNszSmi4FGRYewUj01LcWHFKDVmx45m/xgDl94BKwGm8nTGWMa V7mza9xMv4YqOganiAJT0SOrIZ3PhlUTSMrFTDR6UD7owut2lB6nNX1SgAyaXAsQ/DNO aajUqmxKpl4ebyO97ZUeiMOVz98jnfmzWVVRnpgDOFohgKZVuWJIW0Whmk5sVx/fMGSL WaX8mk0kSb8rUUBaAvEnYjJEitMmlfTzY8jwHX9ozNlMJSkGwD/ZtTMufI+xg8Za5X4U OxhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=K6bu0cSZ12wzLgHTzMNvo8kCjfgxRBd1+kk9Vhgjt9o=; b=GIhcSnRat0zRYaKYFTcPt67IUGFnUgwsT1K99MUSCjKZpWkkljiqpUwxzM4o5f0DPb XZGe5Z1z44IJ8L4yWraoE9UgwtVSUX6ZBi0331uxQknpwyfNcTgrmlSxaRNwdxxZlkdm ZZ3VAYLTPO7WBKVdpxY1xkhC2PALlTjwalY23iKLeSeKFY4f8FJOXnDyDos1x2EBOcN2 DWEI8Gd6qTZSxctCpcz43DVxkAwANqrUnFta5Y6S5sl8kxnlcFgrq/DWFQaLgYlQZ51K fv9g6BbZdIOhrMiMDC+a7r0XT6qBF8kf2oLolJNEY9Xoa/lQQTwTR5+EdoKrCwF/oto3 3nDA== X-Gm-Message-State: AKwxytcczQvD1m+TTFTLTbc2sri2dojc2HLDRxYIHnyspgytM2iXlN3W spbGmtBsIhmzT+THertzBiRNBSp1 X-Google-Smtp-Source: AH8x227GYv2V4ht4GY7s9metNu8b1o02DmmOxu75sa1FfFzfUAWAR1SwbYkK077CmJE9tb+Um3LvWA== X-Received: by 10.99.95.193 with SMTP id t184mr74261pgb.189.1516403394931; Fri, 19 Jan 2018 15:09:54 -0800 (PST) Received: from tw-172-25-30-113.office.twttr.net ([8.25.197.25]) by smtp.gmail.com with ESMTPSA id d205sm12440070pfd.165.2018.01.19.15.09.53 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 19 Jan 2018 15:09:54 -0800 (PST) From: Cong Wang To: netdev@vger.kernel.org Cc: john.fastabend@gmail.com, Cong Wang Subject: [Patch net-next 1/3] net: introduce helper dev_change_tx_queue_len() Date: Fri, 19 Jan 2018 15:09:31 -0800 Message-Id: <20180119230933.10009-2-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20180119230933.10009-1-xiyou.wangcong@gmail.com> References: <20180119230933.10009-1-xiyou.wangcong@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch promotes the local change_tx_queue_len() to a core helper function, dev_change_tx_queue_len(), so that rtnetlink and net-sysfs could share the code. This also prepares for the following patch. Note, the -EFAULT in the original code doesn't make sense, we should propagate the errno from notifiers. Cc: John Fastabend Signed-off-by: Cong Wang Acked-by: John Fastabend --- include/linux/netdevice.h | 1 + net/core/dev.c | 28 ++++++++++++++++++++++++++++ net/core/net-sysfs.c | 25 +------------------------ net/core/rtnetlink.c | 18 +++++------------- 4 files changed, 35 insertions(+), 37 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ed0799a12bf2..75587a053c33 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3325,6 +3325,7 @@ int dev_get_alias(const struct net_device *, char *, size_t); int dev_change_net_namespace(struct net_device *, struct net *, const char *); int __dev_set_mtu(struct net_device *, int); int dev_set_mtu(struct net_device *, int); +int dev_change_tx_queue_len(struct net_device *, unsigned long); void dev_set_group(struct net_device *, int); int dev_set_mac_address(struct net_device *, struct sockaddr *); int dev_change_carrier(struct net_device *, bool new_carrier); diff --git a/net/core/dev.c b/net/core/dev.c index 94435cd09072..99d353e4cbb2 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -7036,6 +7036,34 @@ int dev_set_mtu(struct net_device *dev, int new_mtu) EXPORT_SYMBOL(dev_set_mtu); /** + * dev_change_tx_queue_len - Change TX queue length of a netdevice + * @dev: device + * @new_len: new tx queue length + */ +int dev_change_tx_queue_len(struct net_device *dev, unsigned long new_len) +{ + unsigned int orig_len = dev->tx_queue_len; + int res; + + if (new_len != (unsigned int)new_len) + return -ERANGE; + + if (new_len != orig_len) { + dev->tx_queue_len = new_len; + res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, dev); + res = notifier_to_errno(res); + if (res) { + netdev_err(dev, + "refused to change device tx_queue_len\n"); + dev->tx_queue_len = orig_len; + return res; + } + } + + return 0; +} + +/** * dev_set_group - Change group this device belongs to * @dev: device * @new_group: group this device should belong to diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 7bf8b85ade16..584a480c6274 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -325,29 +325,6 @@ static ssize_t flags_store(struct device *dev, struct device_attribute *attr, } NETDEVICE_SHOW_RW(flags, fmt_hex); -static int change_tx_queue_len(struct net_device *dev, unsigned long new_len) -{ - unsigned int orig_len = dev->tx_queue_len; - int res; - - if (new_len != (unsigned int)new_len) - return -ERANGE; - - if (new_len != orig_len) { - dev->tx_queue_len = new_len; - res = call_netdevice_notifiers(NETDEV_CHANGE_TX_QUEUE_LEN, dev); - res = notifier_to_errno(res); - if (res) { - netdev_err(dev, - "refused to change device tx_queue_len\n"); - dev->tx_queue_len = orig_len; - return -EFAULT; - } - } - - return 0; -} - static ssize_t tx_queue_len_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) @@ -355,7 +332,7 @@ static ssize_t tx_queue_len_store(struct device *dev, if (!capable(CAP_NET_ADMIN)) return -EPERM; - return netdev_store(dev, attr, buf, len, change_tx_queue_len); + return netdev_store(dev, attr, buf, len, dev_change_tx_queue_len); } NETDEVICE_SHOW_RW(tx_queue_len, fmt_dec); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 16d644a4f974..fb2f38193b86 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2282,19 +2282,11 @@ static int do_setlink(const struct sk_buff *skb, if (tb[IFLA_TXQLEN]) { unsigned int value = nla_get_u32(tb[IFLA_TXQLEN]); - unsigned int orig_len = dev->tx_queue_len; - - if (dev->tx_queue_len ^ value) { - dev->tx_queue_len = value; - err = call_netdevice_notifiers( - NETDEV_CHANGE_TX_QUEUE_LEN, dev); - err = notifier_to_errno(err); - if (err) { - dev->tx_queue_len = orig_len; - goto errout; - } - status |= DO_SETLINK_MODIFIED; - } + + err = dev_change_tx_queue_len(dev, value); + if (err) + goto errout; + status |= DO_SETLINK_MODIFIED; } if (tb[IFLA_GSO_MAX_SIZE]) { From patchwork Fri Jan 19 23:09:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 863847 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="qrLSP8Br"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zNc420hW1z9sBZ for ; Sat, 20 Jan 2018 10:10:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756244AbeASXKH (ORCPT ); Fri, 19 Jan 2018 18:10:07 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:35790 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756037AbeASXJ5 (ORCPT ); Fri, 19 Jan 2018 18:09:57 -0500 Received: by mail-pf0-f194.google.com with SMTP id t12so2460894pfg.2 for ; Fri, 19 Jan 2018 15:09:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VwyQ9ktGihn6LKUiM+QvL+wKwA3V24YATnAwf/HhEUc=; b=qrLSP8BrZgOEBNziHKZEkZ6MGyASarr9mdsFpYSqDZzSq4wHqm6KhJNf9FFo+jAVG5 DfNex93oww56koBQaqeZhk14TzecJk+f4kPk85T+Do6PlIWO9AuS+W7x5MAsuQZbnE7J 1z+YKUCez99SvYqi4BOZNxV1snm7FcoPukGh/4rQsUnwz2G/iSmI0me5g3cHUeu6GzNK 8OavhOVBmHjhrUMnCczXBaYoDdKPhuErcr39niWryAI98CHbAbCgX4vMKIA4+5hmLMIz 95rEqnew1/IgZfigNuasi6AUCMAd2qbcirCLqkDjhYJDgkKwBUYqk4Bm4X9diehfwVfl H2HA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VwyQ9ktGihn6LKUiM+QvL+wKwA3V24YATnAwf/HhEUc=; b=apV/4C4ohm04O3LbrC5RHfVm6zOVoBCZJ8oV/3ezOfyVZsZAr9v6MmGgiDUheTLdsj cHkfeWa01cJa/n/bd9VQuxoWOakJfz/GJImk8RoPRxF/r7yleXAFezQzDPYbzfASHNsq +fd+6PdZ3acGYJYubX0SvjDylZl/37ar4bhbmechvbM1HEYp7fhIq9wf4cwTV2DCRj0H sQWG/OH6roS/owXgMXc05aOPhU+cz0nhGomO6Bw/qcfPWNYiN7A56PUo7E3ALEZlAaaI PvDio0qF1rRjv5YEBcToGV/pAmDMxsCW9pLtUvEW/Q/l5NdWk2v+Ko6QYb+Zmw+Z+Yv6 s7EA== X-Gm-Message-State: AKwxytfZznUugEX8z3djYB4NcjdP5XaIN7T0IKNG6fhVXWMUlHh3hG4y 92Mz1WsNJGBsaGEe/yN+0YyuiVuT X-Google-Smtp-Source: AH8x2279t1+SPfjmAmMJlvONriCfwZFTdjxxAsHhie6vYCy+iiJywCCtTa+6sOQAfTGSexhRBVysfw== X-Received: by 10.101.70.69 with SMTP id k5mr88387pgr.426.1516403396115; Fri, 19 Jan 2018 15:09:56 -0800 (PST) Received: from tw-172-25-30-113.office.twttr.net ([8.25.197.25]) by smtp.gmail.com with ESMTPSA id d205sm12440070pfd.165.2018.01.19.15.09.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 19 Jan 2018 15:09:55 -0800 (PST) From: Cong Wang To: netdev@vger.kernel.org Cc: john.fastabend@gmail.com, Cong Wang Subject: [Patch net-next 2/3] net_sched: plug in qdisc ops change_tx_queue_len Date: Fri, 19 Jan 2018 15:09:32 -0800 Message-Id: <20180119230933.10009-3-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20180119230933.10009-1-xiyou.wangcong@gmail.com> References: <20180119230933.10009-1-xiyou.wangcong@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Introduce a new qdisc ops ->change_tx_queue_len() so that each qdisc could decide how to implement this if it wants. Previously we simply read dev->tx_queue_len, after pfifo_fast switches to skb array, we need this API to resize the skb array when we change dev->tx_queue_len. To avoid handling race conditions with TX BH, we need to deactivate all TX queues before change the value and bring them back after we are done, this also makes implementation easier. Cc: John Fastabend Signed-off-by: Cong Wang --- include/net/sch_generic.h | 2 ++ net/core/dev.c | 1 + net/sched/sch_generic.c | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index cd1be1f25c36..aae1baa1c30f 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -200,6 +200,7 @@ struct Qdisc_ops { struct nlattr *arg, struct netlink_ext_ack *extack); void (*attach)(struct Qdisc *sch); + void (*change_tx_queue_len)(struct Qdisc *, unsigned int); int (*dump)(struct Qdisc *, struct sk_buff *); int (*dump_stats)(struct Qdisc *, struct gnet_dump *); @@ -488,6 +489,7 @@ void qdisc_class_hash_remove(struct Qdisc_class_hash *, void qdisc_class_hash_grow(struct Qdisc *, struct Qdisc_class_hash *); void qdisc_class_hash_destroy(struct Qdisc_class_hash *); +void dev_qdisc_change_tx_queue_len(struct net_device *dev); void dev_init_scheduler(struct net_device *dev); void dev_shutdown(struct net_device *dev); void dev_activate(struct net_device *dev); diff --git a/net/core/dev.c b/net/core/dev.c index 99d353e4cbb2..24809d858a64 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -7058,6 +7058,7 @@ int dev_change_tx_queue_len(struct net_device *dev, unsigned long new_len) dev->tx_queue_len = orig_len; return res; } + dev_qdisc_change_tx_queue_len(dev); } return 0; diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index ef8b4ecde2ac..30aaeb3c1bf1 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -1178,6 +1178,28 @@ void dev_deactivate(struct net_device *dev) } EXPORT_SYMBOL(dev_deactivate); +static void qdisc_change_tx_queue_len(struct net_device *dev, + struct netdev_queue *dev_queue, + void *unused) +{ + struct Qdisc *qdisc = dev_queue->qdisc_sleeping; + const struct Qdisc_ops *ops = qdisc->ops; + + if (ops->change_tx_queue_len) + ops->change_tx_queue_len(qdisc, dev->tx_queue_len); +} + +void dev_qdisc_change_tx_queue_len(struct net_device *dev) +{ + bool up = dev->flags & IFF_UP; + + if (up) + dev_deactivate(dev); + netdev_for_each_tx_queue(dev, qdisc_change_tx_queue_len, NULL); + if (up) + dev_activate(dev); +} + static void dev_init_scheduler_queue(struct net_device *dev, struct netdev_queue *dev_queue, void *_qdisc) From patchwork Fri Jan 19 23:09:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 863848 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="XwPlOMyB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zNc460HdLz9sBZ for ; Sat, 20 Jan 2018 10:10:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753670AbeASXKM (ORCPT ); Fri, 19 Jan 2018 18:10:12 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:33448 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752184AbeASXJ5 (ORCPT ); Fri, 19 Jan 2018 18:09:57 -0500 Received: by mail-pg0-f66.google.com with SMTP id u1so2518353pgr.0 for ; Fri, 19 Jan 2018 15:09:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BemBfwGNfn6aVRmM0V2ClYsCBzzFL1ukEQdtYotSLLw=; b=XwPlOMyBQbv9M4RglLk/fQ0kV7tAn6tJjUBN1bsgKecc6L8dWyihawNhJ5+hy4qOG5 9VIMiiznVnHmyWONqqnDLuQnrnYqRpm/Nvbn76iVl4+rOcC6EV+6K525i3ufO82dj39o Fi96n0z8tJpZq0vSDARyOmo4ISkPqOwsj82M/s//bAmPr/saYWX8XMCqZVj4p9IHoid4 pLyXObQ13NPtbDlOV7He3NdSvqFrxqjIQWe4taxn28j0aKV1qsVnlSWHYKsD0nRuUEGo o58fWNr2p78jkyirn+VXErpBAuTYyErufMySD09Edak3JIdOO7P6x4L+sG3DAgXZGkyd W9Lg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BemBfwGNfn6aVRmM0V2ClYsCBzzFL1ukEQdtYotSLLw=; b=fmPvUECZxFZ06UXTgS2LH83ypxS1PJdzo5/xS2I//ALdRXO7wXGjiPib19zC2wIjId mUYKn4KblJLpu/OueWpprhXeGC0638JyPvyapRZr1hOgiFUX5VDhZaC2Sk3CqoYO4peP na+bQgV/5sHi9DWf3MtPIPMO/JFwfgeUpJm06mRuj2jA5/ZxEJJnTfledOxHnzBPv8SD g0uiLL2auX+/QMdReidCjHnEeOw6HsseA8/++ILsXCdsbx0KtHFkgQvdlypBB5T/14gI KREnvBA7rp70PiuKYG7NeDFlJTIyqyYXmxN8dKBfjS/Hbjw4PLWKE13p3gdJEmlGDWsg HOfg== X-Gm-Message-State: AKwxytdsdS1O+/3cHlyCXa+8Py1j53CJ/XX2VX1EvwP8SM7Al2+6063A OLk7LtG5On2CZRxYYhxDOdpJhuaa X-Google-Smtp-Source: AH8x226G+razF8tlVm3ZkugH6cyDkypJt7WkkEqTbPm/5x5X2fnA1YJSBaLm8wLlg/5IB72+LZ3N8w== X-Received: by 10.99.136.194 with SMTP id l185mr80296pgd.53.1516403397310; Fri, 19 Jan 2018 15:09:57 -0800 (PST) Received: from tw-172-25-30-113.office.twttr.net ([8.25.197.25]) by smtp.gmail.com with ESMTPSA id d205sm12440070pfd.165.2018.01.19.15.09.56 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 19 Jan 2018 15:09:56 -0800 (PST) From: Cong Wang To: netdev@vger.kernel.org Cc: john.fastabend@gmail.com, Cong Wang Subject: [Patch net-next 3/3] net_sched: implement ->change_tx_queue_len() for pfifo_fast Date: Fri, 19 Jan 2018 15:09:33 -0800 Message-Id: <20180119230933.10009-4-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20180119230933.10009-1-xiyou.wangcong@gmail.com> References: <20180119230933.10009-1-xiyou.wangcong@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org pfifo_fast used to drop based on qdisc_dev(qdisc)->tx_queue_len, so we have to resize skb array when we change tx_queue_len. Other qdiscs which read tx_queue_len are fine because they all save it to sch->limit or somewhere else in qdisc during init. They don't have to implement this, it is nicer if they do so that users don't have to re-configure qdisc after changing tx_queue_len. Cc: John Fastabend Signed-off-by: Cong Wang --- net/sched/sch_generic.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 30aaeb3c1bf1..7c48a6942238 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -763,6 +763,18 @@ static void pfifo_fast_destroy(struct Qdisc *sch) } } +static void pfifo_fast_change_tx_queue_len(struct Qdisc *sch, unsigned int new_len) +{ + struct pfifo_fast_priv *priv = qdisc_priv(sch); + int prio; + + for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { + struct skb_array *q = band2list(priv, prio); + + skb_array_resize(q, new_len, GFP_KERNEL); + } +} + struct Qdisc_ops pfifo_fast_ops __read_mostly = { .id = "pfifo_fast", .priv_size = sizeof(struct pfifo_fast_priv), @@ -773,6 +785,7 @@ struct Qdisc_ops pfifo_fast_ops __read_mostly = { .destroy = pfifo_fast_destroy, .reset = pfifo_fast_reset, .dump = pfifo_fast_dump, + .change_tx_queue_len = pfifo_fast_change_tx_queue_len, .owner = THIS_MODULE, .static_flags = TCQ_F_NOLOCK | TCQ_F_CPUSTATS, };