From patchwork Wed Jan 22 18:22:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227381 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=i/xSwLrT; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0F0vZpz9sNF for ; Thu, 23 Jan 2020 05:22:53 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728655AbgAVSWw (ORCPT ); Wed, 22 Jan 2020 13:22:52 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:32988 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSWv (ORCPT ); Wed, 22 Jan 2020 13:22:51 -0500 Received: by mail-pf1-f193.google.com with SMTP id z16so250579pfk.0 for ; Wed, 22 Jan 2020 10:22:51 -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=IiDX1JRlYJ70f8M8rOGvDndZke5qBtFls/ud8lxDiIs=; b=i/xSwLrTen1mNsGRNWKGFVSrL3DHVJMVffrXhF8pA0rPnO4w/uPPLmYJrL0zgwJIbe ZrvgaqX9V9vvc2niRDyWr7Mko2FPsBzY5/W5qGXOGrp5xzYVkRwOz/nUZ3gw/0WofWW9 n3VD6b5o9PNPSDsIyvWmv+JqdhfBPeERLIJnj806GAuzsDbprZmM1ChRgiRSxKj9LIhL ZPzrEB7SSQ+bebWNnGyieCiNT7/gkt30mOOo6q5IsEyB+xNp+j3807uK1lvbE7noUD3E ygXYMFY4w/X2rU75nAxQLWGYV3SaeGu4p/zzmzvjLzfICgN8x1zPQKujMBJF5quPkJBO XCaQ== 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=IiDX1JRlYJ70f8M8rOGvDndZke5qBtFls/ud8lxDiIs=; b=FpW0br3iQyFmiC51MURJgZrZ2QEfI8SmIYdJlZR2tozR5qRwcng+g2Bhnrq1ETbxWX yLxhTb/gNVZOYNEXrEom54e0tmfV+b+5+wYq4gfWydhjkajMUYDRjywnZ1z3QjMiVe7z MJbynw7ZycVrtUiyeQ3Lb/WqMYpFxd1gQLhcll2oI3HBKQXYa6kVfqJjszalwE+RqVpT wtqJzl1GTs9KR96R9FWy/vTvQF6OwWQU8gw7/93vG9oU0D88vUeOHNdoAwwUPu9pOdP2 3ejIbpu32G9PQjv7J49GJ2NBRjl4vBdfmPZboa1n4vHBJs+cnGP/gxmianI4mUNbrYyX s66w== X-Gm-Message-State: APjAAAUyxqP7sOzGVo3G244Vihdm40J2wQuNdz08WjR+EX1vb3ETaaqr kTxggiziHuCk0b+rdwC91Zw5SaCNBXk23Wlh X-Google-Smtp-Source: APXvYqxStaXFeA9IxFaAsPrR1fico5BvspYjyUOyMOXEzFU2Y9v8xEY4AxEu1xjkbbq1fGbSGrNALA== X-Received: by 2002:a63:6d05:: with SMTP id i5mr12906314pgc.120.1579717370593; Wed, 22 Jan 2020 10:22:50 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.22.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:22:50 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 01/10] net: sched: pie: move common code to pie.h Date: Wed, 22 Jan 2020 23:52:24 +0530 Message-Id: <20200122182233.3940-2-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" This patch moves macros, structures and small functions common to PIE and FQ-PIE (to be added in a future commit) from the file net/sched/sch_pie.c to the header file include/net/pie.h. All the moved functions are made inline. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 96 +++++++++++++++++++++++++++++++++++++++++++++ net/sched/sch_pie.c | 86 +--------------------------------------- 2 files changed, 97 insertions(+), 85 deletions(-) create mode 100644 include/net/pie.h diff --git a/include/net/pie.h b/include/net/pie.h new file mode 100644 index 000000000000..440213ec83eb --- /dev/null +++ b/include/net/pie.h @@ -0,0 +1,96 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __NET_SCHED_PIE_H +#define __NET_SCHED_PIE_H + +#include +#include +#include +#include +#include + +#define QUEUE_THRESHOLD 16384 +#define DQCOUNT_INVALID -1 +#define DTIME_INVALID 0xffffffffffffffff +#define MAX_PROB 0xffffffffffffffff +#define PIE_SCALE 8 + +/* parameters used */ +struct pie_params { + psched_time_t target; /* user specified target delay in pschedtime */ + u32 tupdate; /* timer frequency (in jiffies) */ + u32 limit; /* number of packets that can be enqueued */ + u32 alpha; /* alpha and beta are between 0 and 32 */ + u32 beta; /* and are used for shift relative to 1 */ + bool ecn; /* true if ecn is enabled */ + bool bytemode; /* to scale drop early prob based on pkt size */ + u8 dq_rate_estimator; /* to calculate delay using Little's law */ +}; + +/* variables used */ +struct pie_vars { + u64 prob; /* probability but scaled by u64 limit. */ + psched_time_t burst_time; + psched_time_t qdelay; + psched_time_t qdelay_old; + u64 dq_count; /* measured in bytes */ + psched_time_t dq_tstamp; /* drain rate */ + u64 accu_prob; /* accumulated drop probability */ + u32 avg_dq_rate; /* bytes per pschedtime tick,scaled */ + u32 qlen_old; /* in bytes */ + u8 accu_prob_overflows; /* overflows of accu_prob */ +}; + +/* statistics gathering */ +struct pie_stats { + u32 packets_in; /* total number of packets enqueued */ + u32 dropped; /* packets dropped due to pie_action */ + u32 overlimit; /* dropped due to lack of space in queue */ + u32 maxq; /* maximum queue size */ + u32 ecn_mark; /* packets marked with ECN */ +}; + +/* private skb vars */ +struct pie_skb_cb { + psched_time_t enqueue_time; +}; + +static inline void pie_params_init(struct pie_params *params) +{ + params->alpha = 2; + params->beta = 20; + params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ + params->limit = 1000; /* default of 1000 packets */ + params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ + params->ecn = false; + params->bytemode = false; + params->dq_rate_estimator = false; +} + +static inline void pie_vars_init(struct pie_vars *vars) +{ + vars->dq_count = DQCOUNT_INVALID; + vars->dq_tstamp = DTIME_INVALID; + vars->accu_prob = 0; + vars->avg_dq_rate = 0; + /* default of 150 ms in pschedtime */ + vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); + vars->accu_prob_overflows = 0; +} + +static inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb) +{ + qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb)); + return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data; +} + +static inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb) +{ + return get_pie_cb(skb)->enqueue_time; +} + +static inline void pie_set_enqueue_time(struct sk_buff *skb) +{ + get_pie_cb(skb)->enqueue_time = psched_get_time(); +} + +#endif diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c index b0b0dc46af61..7197bcaa14ba 100644 --- a/net/sched/sch_pie.c +++ b/net/sched/sch_pie.c @@ -19,47 +19,7 @@ #include #include #include - -#define QUEUE_THRESHOLD 16384 -#define DQCOUNT_INVALID -1 -#define DTIME_INVALID 0xffffffffffffffff -#define MAX_PROB 0xffffffffffffffff -#define PIE_SCALE 8 - -/* parameters used */ -struct pie_params { - psched_time_t target; /* user specified target delay in pschedtime */ - u32 tupdate; /* timer frequency (in jiffies) */ - u32 limit; /* number of packets that can be enqueued */ - u32 alpha; /* alpha and beta are between 0 and 32 */ - u32 beta; /* and are used for shift relative to 1 */ - bool ecn; /* true if ecn is enabled */ - bool bytemode; /* to scale drop early prob based on pkt size */ - u8 dq_rate_estimator; /* to calculate delay using Little's law */ -}; - -/* variables used */ -struct pie_vars { - u64 prob; /* probability but scaled by u64 limit. */ - psched_time_t burst_time; - psched_time_t qdelay; - psched_time_t qdelay_old; - u64 dq_count; /* measured in bytes */ - psched_time_t dq_tstamp; /* drain rate */ - u64 accu_prob; /* accumulated drop probability */ - u32 avg_dq_rate; /* bytes per pschedtime tick,scaled */ - u32 qlen_old; /* in bytes */ - u8 accu_prob_overflows; /* overflows of accu_prob */ -}; - -/* statistics gathering */ -struct pie_stats { - u32 packets_in; /* total number of packets enqueued */ - u32 dropped; /* packets dropped due to pie_action */ - u32 overlimit; /* dropped due to lack of space in queue */ - u32 maxq; /* maximum queue size */ - u32 ecn_mark; /* packets marked with ECN */ -}; +#include /* private data for the Qdisc */ struct pie_sched_data { @@ -70,50 +30,6 @@ struct pie_sched_data { struct Qdisc *sch; }; -static void pie_params_init(struct pie_params *params) -{ - params->alpha = 2; - params->beta = 20; - params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ - params->limit = 1000; /* default of 1000 packets */ - params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ - params->ecn = false; - params->bytemode = false; - params->dq_rate_estimator = false; -} - -/* private skb vars */ -struct pie_skb_cb { - psched_time_t enqueue_time; -}; - -static struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb) -{ - qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb)); - return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data; -} - -static psched_time_t pie_get_enqueue_time(const struct sk_buff *skb) -{ - return get_pie_cb(skb)->enqueue_time; -} - -static void pie_set_enqueue_time(struct sk_buff *skb) -{ - get_pie_cb(skb)->enqueue_time = psched_get_time(); -} - -static void pie_vars_init(struct pie_vars *vars) -{ - vars->dq_count = DQCOUNT_INVALID; - vars->dq_tstamp = DTIME_INVALID; - vars->accu_prob = 0; - vars->avg_dq_rate = 0; - /* default of 150 ms in pschedtime */ - vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); - vars->accu_prob_overflows = 0; -} - static bool drop_early(struct Qdisc *sch, u32 packet_size) { struct pie_sched_data *q = qdisc_priv(sch); From patchwork Wed Jan 22 18:22:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227382 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=BsqcFup7; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0K3J87z9sNF for ; Thu, 23 Jan 2020 05:22:57 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728765AbgAVSW4 (ORCPT ); Wed, 22 Jan 2020 13:22:56 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:38878 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSW4 (ORCPT ); Wed, 22 Jan 2020 13:22:56 -0500 Received: by mail-pl1-f196.google.com with SMTP id t6so114162plj.5 for ; Wed, 22 Jan 2020 10:22: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=R8o/e98Y1o4b0t9zPieroZgdORNBdpNL7fXG7tccg/Q=; b=BsqcFup7gaCa4lLtBZcFGZLTZ7VGBqmIW1xpOtICll3LlHz77YGtXZW0Jong932lB7 +gvv+b4ZoWZ91ckKtSNL5W+eZvC5tRXjoXx5A0mcXQv+JmR5bDCmNcGgIePivlLrO/sH Mt8agSyXeaPRcDFo1rn5dQRI2qOKePyi7sc/ILpmt1Sy41DKdwXMTY2xptRN1zjy4TGt cP+dFzovq3DNl6uxcZ7nhV+ndfXJlP8LlblQZ8tzVVOTrrZK4ujS377AzBo20m+3B9d4 9VdZMjLiLz+GWPTJiMFAl6WbAYK+nUA5tWiWpf6EkL6E568PHckpYjh4PcewwVsqfpp/ 29VQ== 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=R8o/e98Y1o4b0t9zPieroZgdORNBdpNL7fXG7tccg/Q=; b=NxtD5jVQlzYBJDjIM4ys35I0CgOogGco84WqFPA8PoVAlsEkX9Vi/pHFo3+7xtZZ/M y1PkFEiKE/YqJQTcK4dVU7QxKl7INdQSCMGoGqJuCGuYQbnGoGAEhiplPv6akq303SJ4 q/jyY/FYKEEvKdxaFdEIEu+wcTE8SEOZFb+svz8c6ZtcgI6uqefA4MvFpbxTSCLB7z9V bY9zyCIc41swQsPyBCaNp2S1rD6gby1/ScIkzvn6W/jhmLQxJN1pKOn49mFAlXsptsOH wAyOL/mvJKd1RpjmguAgtoeMJUHz24ruhbePMgifXI4t5/55ruNcy8w01MFtPmi8sx/9 4yGQ== X-Gm-Message-State: APjAAAVCNuBhF7+gZocjwBMBEHHznoRmfZ2TRWhbEuIguzroDqa78qIY NeVS6PHP1guexlrX/TrJtJZhp7t34xtaq7qf X-Google-Smtp-Source: APXvYqxXNyY/8ORF2JeKK7wqSh/ftTmntjOTq7YgxMlIKKHiDaSqtdK2+mNNzxXLu0qyYjnRMrK90A== X-Received: by 2002:a17:90b:11d7:: with SMTP id gv23mr4527265pjb.94.1579717375510; Wed, 22 Jan 2020 10:22:55 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.22.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:22:55 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 02/10] pie: use U64_MAX to denote (2^64 - 1) Date: Wed, 22 Jan 2020 23:52:25 +0530 Message-Id: <20200122182233.3940-3-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Use the U64_MAX macro to denote the constant (2^64 - 1). Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index 440213ec83eb..7ef375db5bab 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -10,8 +10,8 @@ #define QUEUE_THRESHOLD 16384 #define DQCOUNT_INVALID -1 -#define DTIME_INVALID 0xffffffffffffffff -#define MAX_PROB 0xffffffffffffffff +#define DTIME_INVALID U64_MAX +#define MAX_PROB U64_MAX #define PIE_SCALE 8 /* parameters used */ From patchwork Wed Jan 22 18:22:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227383 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=kxfxaxXX; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0Q29tkz9sNF for ; Thu, 23 Jan 2020 05:23:02 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728811AbgAVSXB (ORCPT ); Wed, 22 Jan 2020 13:23:01 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:42154 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXB (ORCPT ); Wed, 22 Jan 2020 13:23:01 -0500 Received: by mail-pg1-f196.google.com with SMTP id s64so3936260pgb.9 for ; Wed, 22 Jan 2020 10:23:00 -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=JS/s9j8U9IeQ6/b6RxEgOuCmaH0wVa5WX2YOp3bYvgI=; b=kxfxaxXXufadb3b7T/OH3vwbKBvgG/qTRABmxJlowEEbHWjsJEaur2G7CkzEgDXkN9 t+npb+dguR/QqhNMlgI7cKtKVJEQbFYofd3Hk44UxaJRNk9iO7Ze0z2kjPQ4sNfgoCZC q3WYoIzqPwJg47d4EinysVmJ11SoOVoCrq0EP5oNST+JQQxd6gLE+REENoIJm2EYRt4b GV1IkmqWsIWkrrFritGWI/ZD0qU6BXEATyjA780t0ARGuc5f3g0/sjxqw1mAlffJ1/9v 2xBKW66hdQceM0vpA0BOLJdeH2dhWaPlxs6Nw2zYYMR9HINIMfoiNFEwEimrlo+f/TcA NJIg== 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=JS/s9j8U9IeQ6/b6RxEgOuCmaH0wVa5WX2YOp3bYvgI=; b=Y2BFQN2YwVqjcQa+T3OROi5V1N6K5IVG8bsM7YhTKRTs5BvFajqzkbzSykEkmH7AYN dC9ye4G9RWASFCkXvmcWHDML4QLHWsFGVxWbb2s4E1hdTO1sdOze/Xc59+AvWfpt4SYP Ft83wRNX0jaZrTj4vCj6mxQe47MCWO09DdOXk/njyJHHmGEsnXnHupm48AMOtaluIPxV fBRJaYek/D6Qrzc0HfZNj/ci5V5uSwnu9sdZpJi6svG75gIzuDswqjBfVm2uch2hhVli YZZ4D97+fECdI4K+rodDyCzNfJkiL2ITU8p3uqersGExr5ZSQW7seBhtwmxigHbFO2tT 0giA== X-Gm-Message-State: APjAAAW+AujL0kkUy0d4TWcCGFfVniwtdMJqbxU/UFkWG1h/cmoq+0nq FVwlQvvyz7jZPDA29Z2xDOnjgq0taRTmAeVk X-Google-Smtp-Source: APXvYqw8M0j3Bp5QQqtgxqR+JT1xeViQvW9HyC2D46/nu3mJm/Xhw3W6V0rfTRnM7yF6g2ODBAmoRQ== X-Received: by 2002:a65:484d:: with SMTP id i13mr1502pgs.32.1579717380231; Wed, 22 Jan 2020 10:23:00 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.22.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:22:59 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 03/10] pie: rearrange macros in order of length Date: Wed, 22 Jan 2020 23:52:26 +0530 Message-Id: <20200122182233.3940-4-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Rearrange macros in order of length and align the values to improve readability. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index 7ef375db5bab..397c7abf0879 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -8,11 +8,11 @@ #include #include -#define QUEUE_THRESHOLD 16384 -#define DQCOUNT_INVALID -1 -#define DTIME_INVALID U64_MAX -#define MAX_PROB U64_MAX -#define PIE_SCALE 8 +#define MAX_PROB U64_MAX +#define DTIME_INVALID U64_MAX +#define QUEUE_THRESHOLD 16384 +#define DQCOUNT_INVALID -1 +#define PIE_SCALE 8 /* parameters used */ struct pie_params { From patchwork Wed Jan 22 18:22:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227384 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=pqh/hUj/; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0W26zCz9sNF for ; Thu, 23 Jan 2020 05:23:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728831AbgAVSXG (ORCPT ); Wed, 22 Jan 2020 13:23:06 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:46323 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXG (ORCPT ); Wed, 22 Jan 2020 13:23:06 -0500 Received: by mail-pf1-f195.google.com with SMTP id n9so217904pff.13 for ; Wed, 22 Jan 2020 10:23:05 -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=lLPfkaHUdJk91hEn7ISh5HhzYqtAwjmDshBoNiXJGwM=; b=pqh/hUj/OID2qAYXnmxMGKaTa7eFYta1drhRmJ2YkDt2b/svjhq0QPu4c6Guv5f5sB OAImgAUxYlQlO+prD5ikmYr/BCGEC2mQI2gfKO66KNM1M/0ecO95IU1SdiOvRYEhfgCm Ny2LUvygvavfqmy24kndspxFwrQSGt4q6guWeZm4eDvWP/T6E+iVUVm3PWJRgPfCOkDM a7QcPYsVYW3JaH330PXTGef6dbmRXWoBBL333BTlvq066dJTUoBPL2Z3fs2N5vD2D6Wu +SFX19kk3Ehy3w/St/pIiZbxIxXbel2RwBpoqyWiUsKYviq4I9QDwuQH1vnd5+2ICoeP jcmA== 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=lLPfkaHUdJk91hEn7ISh5HhzYqtAwjmDshBoNiXJGwM=; b=i1jvi7YKyHFg8AkDI/zx38/qj3f60C6brxiCSm5DHhFoOz/OVY8mXAjYL5KXnaCyqo UXHmhB0edf25+li++ImmlPD2t6wWThq/O9uQg66WMOUKYLw5X8nNOkRue0w/6ZQYtANj FF7wL5ZJ2p9y7Mode5quuENkbOwwF5K4CV0ZvdmvQT+6NPzVM5Rs48ZmM+agJRXu9hoU aFPrL7LVxMBYBTd9TGInx0e1qsjppl+gwFN2WjJ5d/sesytzqNIKEN5IiLwSTB2ByDyZ 1VsYZvvZcNtBs+7sdmDJ+feoM923deAhH8AcOYQHzMQyiSLOikDH2z1Ujh2OqVM2aeQD aUuA== X-Gm-Message-State: APjAAAVo42/4Vs4RO27K0A20ytOadQtbkCC645fWimp1rqD2NxFIgfpa qYilGz5lVfYrq8NnO6xJj2D1pQjW60x/oqb2 X-Google-Smtp-Source: APXvYqxbZR4ZDUqmZG/ZPNt/U+VW8HDx+AuVo1tHbqbsWyTZ6il1tK8CD0iPF3Xtkx7yxcF4yEM5cA== X-Received: by 2002:a62:53c3:: with SMTP id h186mr3731194pfb.118.1579717385218; Wed, 22 Jan 2020 10:23:05 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:04 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 04/10] pie: use u8 instead of bool in pie_vars Date: Wed, 22 Jan 2020 23:52:27 +0530 Message-Id: <20200122182233.3940-5-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Linux best practice recommends using u8 for true/false values in structures. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index 397c7abf0879..f9c6a44bdb0c 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -21,8 +21,8 @@ struct pie_params { u32 limit; /* number of packets that can be enqueued */ u32 alpha; /* alpha and beta are between 0 and 32 */ u32 beta; /* and are used for shift relative to 1 */ - bool ecn; /* true if ecn is enabled */ - bool bytemode; /* to scale drop early prob based on pkt size */ + u8 ecn; /* true if ecn is enabled */ + u8 bytemode; /* to scale drop early prob based on pkt size */ u8 dq_rate_estimator; /* to calculate delay using Little's law */ }; From patchwork Wed Jan 22 18:22:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227385 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=asbJKXx6; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0c5Tjwz9sNF for ; Thu, 23 Jan 2020 05:23:12 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728899AbgAVSXL (ORCPT ); Wed, 22 Jan 2020 13:23:11 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:32792 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXL (ORCPT ); Wed, 22 Jan 2020 13:23:11 -0500 Received: by mail-pl1-f195.google.com with SMTP id ay11so125725plb.0 for ; Wed, 22 Jan 2020 10:23:11 -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=75GYGZCutiLRlVt9f9TBFKtlqNdfsesUvmoWR+mvNZE=; b=asbJKXx6kpUO5Bur7RqmjUfcEE9MnGnGsuIMxuwFd4VUwBRL9pjPK6ZAP7SLTuI/Cg dFshv3P/GMVb/+wM2nBkvZ/07IlYEtb6h5p0786B2XDPM5Ve3Cru5bCkasZZx3Kc4U62 NE1eilHYBxBi9qo42OSYEdaIp7pzYjN3WBLi4X7TCc3ZWiYMUL+rRzTZqlrBH3OdYpR8 wXju6RZeRxYTlSXTTixmnlbUTd4A6WRXfFx6Y43sAEOxe0qFnp/B4NSsrekyijhO4Qyi 8NfB1qgrajAZTnGCTZTAwMmGdppZQSo0FC7sEV3vj94/ogPZkzYzG8P9wwUMN3Mh7KnS IldQ== 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=75GYGZCutiLRlVt9f9TBFKtlqNdfsesUvmoWR+mvNZE=; b=jS0+7/deJnA7ePqQLmfSDtUA6TyIe2JU9UZ2eiKvg+Yhjw0ZAi9x11q2JyIrB+O2S6 S5J8122v/5KiRv88AN1ms2hsk1268glNUEu4RfQcwFkH/pqBe0TS8v3OqaEjHkX2EqKB JeUomdTU1lqIKE4oaAKX7LM8Zu17YSTetZo750RwxQjwn9X0UDWmqcKbMNCrJR4d1jTe 8EeY40gZxasjQru6/0rYdrkHVggLYFhTpWT9iFYZb3cJ879hRpej5elNw5a0KnX+H6cJ AD8feP4SBIGmwIc6Qyryx6gKZRKurphUzYBdPeiRHbLiUiiYIdlTACXxUyMI7yFyczU+ TSmw== X-Gm-Message-State: APjAAAVcK3L1EJYb2+hDGVYe0EupINvha0I9T+ItusAUliyE835GRbKY 0irr1wAJ3WgEt3TznxtIVlyNIi7ulPnUnEGu X-Google-Smtp-Source: APXvYqy05SDSg3iYMpd2d6I9TeQqXjLBF1sYUN3LdSCtY/LQk+frVisdYWqCucys1N8mKtbA+0v8yA== X-Received: by 2002:a17:902:6b8a:: with SMTP id p10mr12141590plk.47.1579717390494; Wed, 22 Jan 2020 10:23:10 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:10 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 05/10] pie: rearrange structure members and their initializations Date: Wed, 22 Jan 2020 23:52:28 +0530 Message-Id: <20200122182233.3940-6-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Rearrange the members of the structure such that closely referenced members appear together and/or fit in the same cacheline. Also, change the order of their initializations to match the order in which they appear in the structure. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 20 ++++++++++---------- net/sched/sch_pie.c | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index f9c6a44bdb0c..ec0fbe98ec2f 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -28,13 +28,13 @@ struct pie_params { /* variables used */ struct pie_vars { - u64 prob; /* probability but scaled by u64 limit. */ - psched_time_t burst_time; psched_time_t qdelay; psched_time_t qdelay_old; - u64 dq_count; /* measured in bytes */ + psched_time_t burst_time; psched_time_t dq_tstamp; /* drain rate */ + u64 prob; /* probability but scaled by u64 limit. */ u64 accu_prob; /* accumulated drop probability */ + u64 dq_count; /* measured in bytes */ u32 avg_dq_rate; /* bytes per pschedtime tick,scaled */ u32 qlen_old; /* in bytes */ u8 accu_prob_overflows; /* overflows of accu_prob */ @@ -45,8 +45,8 @@ struct pie_stats { u32 packets_in; /* total number of packets enqueued */ u32 dropped; /* packets dropped due to pie_action */ u32 overlimit; /* dropped due to lack of space in queue */ - u32 maxq; /* maximum queue size */ u32 ecn_mark; /* packets marked with ECN */ + u32 maxq; /* maximum queue size */ }; /* private skb vars */ @@ -56,11 +56,11 @@ struct pie_skb_cb { static inline void pie_params_init(struct pie_params *params) { - params->alpha = 2; - params->beta = 20; + params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ params->limit = 1000; /* default of 1000 packets */ - params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ + params->alpha = 2; + params->beta = 20; params->ecn = false; params->bytemode = false; params->dq_rate_estimator = false; @@ -68,12 +68,12 @@ static inline void pie_params_init(struct pie_params *params) static inline void pie_vars_init(struct pie_vars *vars) { - vars->dq_count = DQCOUNT_INVALID; + /* default of 150 ms in pschedtime */ + vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); vars->dq_tstamp = DTIME_INVALID; vars->accu_prob = 0; + vars->dq_count = DQCOUNT_INVALID; vars->avg_dq_rate = 0; - /* default of 150 ms in pschedtime */ - vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); vars->accu_prob_overflows = 0; } diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c index 7197bcaa14ba..0c583cc148f3 100644 --- a/net/sched/sch_pie.c +++ b/net/sched/sch_pie.c @@ -23,8 +23,8 @@ /* private data for the Qdisc */ struct pie_sched_data { - struct pie_params params; struct pie_vars vars; + struct pie_params params; struct pie_stats stats; struct timer_list adapt_timer; struct Qdisc *sch; From patchwork Wed Jan 22 18:22:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227386 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=j0CM85Il; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0k2fQQz9sNF for ; Thu, 23 Jan 2020 05:23:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728911AbgAVSXR (ORCPT ); Wed, 22 Jan 2020 13:23:17 -0500 Received: from mail-pj1-f66.google.com ([209.85.216.66]:54219 "EHLO mail-pj1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXR (ORCPT ); Wed, 22 Jan 2020 13:23:17 -0500 Received: by mail-pj1-f66.google.com with SMTP id n96so267760pjc.3 for ; Wed, 22 Jan 2020 10:23:16 -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=NdDugV4RVuZnDJNXT9PvRvUKCb7vnZ8wbK7a4Kfzijc=; b=j0CM85Il7/7gnEnFxVOX8/xlAknRb6C4ejzmVsOD/RG02DdKaUQFDl+mAmsjywfENg duFyH4Jq916RiSV/4VrVAZi251uPM+TOU8Ld/YBLxVKQeN7IPBUJeMVLuqNSJzwbfxpe wFsfyaTH3lViqsBNc6fG+1eO0J5f8PeAzau5c+e68uYzOYg9KV/XzzFdKzba2613+CWY j9CFmCRmd8sVK9Lz2X8mNifJgRFOtGfGZ92FNdABJ1xn3Y8m3d2U2uk5D8SLREs9Prrx s1cTEoKc25OKxznfoI1sevLRU3z6kwgfqk1Z/rvk8mp1Bda9vSX5KpiiQ93MV99+UNuL yMhQ== 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=NdDugV4RVuZnDJNXT9PvRvUKCb7vnZ8wbK7a4Kfzijc=; b=W8ZsUr6pyO3mNPM6QQUvhEUX8Pxn6XCF2AR5EVl7VxMpOHrY0lOVxgySzO1olNfEso vgGO4ucEbnS3CmQQ3QepzgnJldcwHAdLhaZCrrx14gKf9o4BCNOyL44UONMLY9IKjtNp VHyeTM28w+FpUTeEDx3QN+Wlk/Eb/yD8fXvSmFcdg4v2PyN+V0oL6RrGXDziSovZRDnW HUyzMHciGPVvj0Gm+P/O0IIHpHM5LhQgDi274BQlsd7SWwfsLB4sgF+C8uPUTd1QkzRm 6+UY4MV/v9EN5h80fP+WFrJl2xcLzjE+tWMvfNVXHgiv20DlkcDofaKnaHxa/YJuKKSp 7QbA== X-Gm-Message-State: APjAAAUPoPWy1Q9W1oL2vz1UDLselEtCLPjuH9kjYpWn3NaYsucmBMwn Uoqaahc+E5YqJvQdXYbCg83CyIAgDHBCdr2F X-Google-Smtp-Source: APXvYqySkYuOyIaFRc4GKOmt71847Ja0N0cmr56Z8fNpBAFhbaKCWF5gTG+a72Ms+R6GdrUtHZtCqQ== X-Received: by 2002:a17:90a:cb16:: with SMTP id z22mr4533098pjt.122.1579717396001; Wed, 22 Jan 2020 10:23:16 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:15 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 06/10] pie: improve comments and commenting style Date: Wed, 22 Jan 2020 23:52:29 +0530 Message-Id: <20200122182233.3940-7-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Improve the comments along with the commenting style used to describe the members of the structures and their initial values in the init functions. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 85 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 27 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index ec0fbe98ec2f..51a1984c2dce 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -14,42 +14,74 @@ #define DQCOUNT_INVALID -1 #define PIE_SCALE 8 -/* parameters used */ +/** + * struct pie_params - contains pie parameters + * @target: target delay in pschedtime + * @tudpate: interval at which drop probability is calculated + * @limit: total number of packets that can be in the queue + * @alpha: parameter to control drop probability + * @beta: parameter to control drop probability + * @ecn: is ECN marking of packets enabled + * @bytemode: is drop probability scaled based on pkt size + * @dq_rate_estimator: is Little's law used for qdelay calculation + */ struct pie_params { - psched_time_t target; /* user specified target delay in pschedtime */ - u32 tupdate; /* timer frequency (in jiffies) */ - u32 limit; /* number of packets that can be enqueued */ - u32 alpha; /* alpha and beta are between 0 and 32 */ - u32 beta; /* and are used for shift relative to 1 */ - u8 ecn; /* true if ecn is enabled */ - u8 bytemode; /* to scale drop early prob based on pkt size */ - u8 dq_rate_estimator; /* to calculate delay using Little's law */ + psched_time_t target; + u32 tupdate; + u32 limit; + u32 alpha; + u32 beta; + u8 ecn; + u8 bytemode; + u8 dq_rate_estimator; }; -/* variables used */ +/** + * struct pie_vars - contains pie variables + * @qdelay: current queue delay + * @qdelay_old: queue delay in previous qdelay calculation + * @burst_time: burst time allowance + * @dq_tstamp: timestamp at which dq rate was last calculated + * @prob: drop probability + * @accu_prob: accumulated drop probability + * @dq_count: number of bytes dequeued in a measurement cycle + * @avg_dq_rate: calculated average dq rate + * @qlen_old: queue length during previous qdelay calculation + * @accu_prob_overflows: number of times accu_prob overflows + */ struct pie_vars { psched_time_t qdelay; psched_time_t qdelay_old; psched_time_t burst_time; - psched_time_t dq_tstamp; /* drain rate */ - u64 prob; /* probability but scaled by u64 limit. */ - u64 accu_prob; /* accumulated drop probability */ - u64 dq_count; /* measured in bytes */ - u32 avg_dq_rate; /* bytes per pschedtime tick,scaled */ - u32 qlen_old; /* in bytes */ - u8 accu_prob_overflows; /* overflows of accu_prob */ + psched_time_t dq_tstamp; + u64 prob; + u64 accu_prob; + u64 dq_count; + u32 avg_dq_rate; + u32 qlen_old; + u8 accu_prob_overflows; }; -/* statistics gathering */ +/** + * struct pie_stats - contains pie stats + * @packets_in: total number of packets enqueued + * @dropped: packets dropped due to pie action + * @overlimit: packets dropped due to lack of space in queue + * @ecn_mark: packets marked with ECN + * @maxq: maximum queue size + */ struct pie_stats { - u32 packets_in; /* total number of packets enqueued */ - u32 dropped; /* packets dropped due to pie_action */ - u32 overlimit; /* dropped due to lack of space in queue */ - u32 ecn_mark; /* packets marked with ECN */ - u32 maxq; /* maximum queue size */ + u32 packets_in; + u32 dropped; + u32 overlimit; + u32 ecn_mark; + u32 maxq; }; -/* private skb vars */ +/** + * struct pie_skb_cb - contains private skb vars + * @enqueue_time: timestamp when the packet is enqueued + */ struct pie_skb_cb { psched_time_t enqueue_time; }; @@ -58,7 +90,7 @@ static inline void pie_params_init(struct pie_params *params) { params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ - params->limit = 1000; /* default of 1000 packets */ + params->limit = 1000; params->alpha = 2; params->beta = 20; params->ecn = false; @@ -68,8 +100,7 @@ static inline void pie_params_init(struct pie_params *params) static inline void pie_vars_init(struct pie_vars *vars) { - /* default of 150 ms in pschedtime */ - vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); + vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); /* 150 ms */ vars->dq_tstamp = DTIME_INVALID; vars->accu_prob = 0; vars->dq_count = DQCOUNT_INVALID; From patchwork Wed Jan 22 18:22:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227387 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=MqTmKmX6; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0p6z2lz9sNF for ; Thu, 23 Jan 2020 05:23:22 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728978AbgAVSXW (ORCPT ); Wed, 22 Jan 2020 13:23:22 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:44361 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXV (ORCPT ); Wed, 22 Jan 2020 13:23:21 -0500 Received: by mail-pf1-f195.google.com with SMTP id 62so223110pfu.11 for ; Wed, 22 Jan 2020 10:23:21 -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=7QJ7r6VCbJ5yiJne5YJbfLdcih0PR3cC3oHUxUnk3EU=; b=MqTmKmX68FSUXivmnfAgOeoAhBX6Jc1+nQC+0OJIm4+T6UXr0/mytC/7WVE6lJccs4 JGvMH+m2P8JZcxq5IY37Ed7HZJJQgsvQgPS0sbo8TmsPBlffiBMU/58U/zZgeExjwy7G dtk6KtG4PG9Bwp41IuLX8wveSkFJN/sH9nSU+2h+uLPCA/VtYaiKl2nl660emn9RMlj3 xw/rcF15bxBW64mdJExzwyttXfQBfvaAz87+EA2j8SG/2o1tbwN0SIbkZ4njyk9SLj04 FcJwknREQbpsJDzGz8cklooHZKTYMospL3s/yiNBrqPG/ZKYpRaSCSte3ljwgptYA5Wu GW4A== 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=7QJ7r6VCbJ5yiJne5YJbfLdcih0PR3cC3oHUxUnk3EU=; b=btb8IHbWoZRKGQxX7/sF+XKtztdLionWDBd2mHzOHhmAG6HNXHSzYrHEPYPd158zM5 CUTMrBe3JTlrupygGfSbaW0zlPoqcJVkjLrQdQ5RcPGfN/DdbQS/dcrqxUJxCD3EjczN jPI6nqalckxHlY+RDRMFgMz+ERf/ORXhso77u4n03ALCzGb6EwGm9YadOXMzr8ASQa2Q dgPPXJdE/CzP6bwbhqTO4XTxRvSumeS0mnm3oTIA2/b1KOQx0L3Ap6/qp7e+JwnYZ5eI 5M3e2gCp+ygoEtC0KPcKp1CuNJlaHG1Y1DFZWWm9Fr+fsI+wiywnlxxKLFL6XFuGRmqt 26Cg== X-Gm-Message-State: APjAAAWgXqZ4NLI9u2DvYFXdwD4Md6qgCkhQrzId8w8O0manJmDNSoFk NuX5nNznYWvKcDhC8Nq05/hnoBkOu5kGQXKW X-Google-Smtp-Source: APXvYqztFKQnHa8HKTM59tdf+qqB387G5lay/rUCzpS/mS2lEQrpPX7pVo8EAeCS5h8mB6vragGGyA== X-Received: by 2002:a63:6fca:: with SMTP id k193mr12920551pgc.416.1579717400769; Wed, 22 Jan 2020 10:23:20 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:20 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 07/10] net: sched: pie: fix commenting Date: Wed, 22 Jan 2020 23:52:30 +0530 Message-Id: <20200122182233.3940-8-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Fix punctuation and logical mistakes in the comments. The logical mistake was that "dequeue_rate" is no longer the default way to calculate queuing delay and is not needed. The default way to calculate queue delay was changed in commit cec2975f2b70 ("net: sched: pie: enable timestamp based delay calculation"). Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- net/sched/sch_pie.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c index 0c583cc148f3..024f55569a38 100644 --- a/net/sched/sch_pie.c +++ b/net/sched/sch_pie.c @@ -248,10 +248,10 @@ static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb) q->vars.dq_count = 0; } - /* Calculate the average drain rate from this value. If queue length - * has receded to a small value viz., <= QUEUE_THRESHOLD bytes,reset + /* Calculate the average drain rate from this value. If queue length + * has receded to a small value viz., <= QUEUE_THRESHOLD bytes, reset * the dq_count to -1 as we don't have enough packets to calculate the - * drain rate anymore The following if block is entered only when we + * drain rate anymore. The following if block is entered only when we * have a substantial queue built up (QUEUE_THRESHOLD bytes or more) * and we calculate the drain rate for the threshold here. dq_count is * in bytes, time difference in psched_time, hence rate is in @@ -329,8 +329,8 @@ static void calculate_probability(struct Qdisc *sch) qdelay_old = q->vars.qdelay_old; } - /* If qdelay is zero and qlen is not, it means qlen is very small, less - * than dequeue_rate, so we do not update probabilty in this round + /* If qdelay is zero and qlen is not, it means qlen is very small, + * so we do not update probabilty in this round. */ if (qdelay == 0 && qlen != 0) update_prob = false; From patchwork Wed Jan 22 18:22:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227388 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=ApC2j0Pi; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v0v6HBhz9sNF for ; Thu, 23 Jan 2020 05:23:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728998AbgAVSX1 (ORCPT ); Wed, 22 Jan 2020 13:23:27 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:46564 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSX0 (ORCPT ); Wed, 22 Jan 2020 13:23:26 -0500 Received: by mail-pg1-f193.google.com with SMTP id z124so3915648pgb.13 for ; Wed, 22 Jan 2020 10:23:26 -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=anPHFBLNPdadjSGekrzr3WCtJamEsDr9v8sySIJaS0w=; b=ApC2j0PigWH00DWBSANTZFKN13G9sOX04/PTbu2P5teXWxl+5WHBQXbjgLiR5Vgsmp J0v2AzPA4HQeT4eTtc9WOkYGEmcFK9sJutVJhHHKUUB+bjMP42nnp7HMifSl7U/sMiWs XM8Va0hT6/phC8BmzMmfV36oPO2gsZkehta70t+/3C8kn0X4zil/nUjxR9+dvQy7E/h5 FAsVIwM07qoJUETod3R31SrMXSxJ/yab3lcAYRYOeZdMfREd6J78IhgZUKgAs/67hhJq 6NuZYPTQI63e3rhHWHP9jafLlv/1+QTidh3CiVTL+l1vxSihNjZ8Dk12umFRzlto1vtv syUw== 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=anPHFBLNPdadjSGekrzr3WCtJamEsDr9v8sySIJaS0w=; b=SpVNBl6IiaHBrNu9ekvufLfbMboKfLqhBVbqY8eHSss+yYZvycr0OzmJeyAcU+2a9Q JXRYRJj0ChTNbrttg0M3kkltwBs/+q3tzjAklSIO7irqIDf36am0ksMqW9sqMzONLgHM eCXX2lWmGQyuAKbD0D4hNT/GX0PcnV3E7ZBmEpr8RhwLL+bWKtc0cjUiStkR0QyVTItk dANmb8sli32hpB1qiokJhP7cn04uKTmaVqp+yREyvhSVvMlHFYsCFIHfc3rCUe8RKF54 XevDBrW2AtfemtJvVmPk3Ww5XJzffpOHIxmoPGqDRF1yPc+fpvxhAg6KiNT6rGlfSIbP 1xCw== X-Gm-Message-State: APjAAAWhrUp8lzTNfLv5ZDLgzp9NZ64ITUIGPBzO41Twmj3Onn4zpdR4 bhhE39H5X81R5CA6cbphpqWpj72nhHpfTrUZ X-Google-Smtp-Source: APXvYqzNwh4AR7JGWn9Upz9Xt/vSDPS9j/ZAYlL/ad+vGJxSWA5Sf0u9uaKKvBpfyTOxcX/5TOu6IA== X-Received: by 2002:a63:6704:: with SMTP id b4mr12807562pgc.424.1579717405651; Wed, 22 Jan 2020 10:23:25 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:25 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 08/10] net: sched: pie: fix alignment in struct instances Date: Wed, 22 Jan 2020 23:52:31 +0530 Message-Id: <20200122182233.3940-9-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Make the alignment in the initialization of the struct instances consistent in the file. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- net/sched/sch_pie.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c index 024f55569a38..c65164659bca 100644 --- a/net/sched/sch_pie.c +++ b/net/sched/sch_pie.c @@ -132,14 +132,14 @@ static int pie_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch, } static const struct nla_policy pie_policy[TCA_PIE_MAX + 1] = { - [TCA_PIE_TARGET] = {.type = NLA_U32}, - [TCA_PIE_LIMIT] = {.type = NLA_U32}, - [TCA_PIE_TUPDATE] = {.type = NLA_U32}, - [TCA_PIE_ALPHA] = {.type = NLA_U32}, - [TCA_PIE_BETA] = {.type = NLA_U32}, - [TCA_PIE_ECN] = {.type = NLA_U32}, - [TCA_PIE_BYTEMODE] = {.type = NLA_U32}, - [TCA_PIE_DQ_RATE_ESTIMATOR] = {.type = NLA_U32}, + [TCA_PIE_TARGET] = {.type = NLA_U32}, + [TCA_PIE_LIMIT] = {.type = NLA_U32}, + [TCA_PIE_TUPDATE] = {.type = NLA_U32}, + [TCA_PIE_ALPHA] = {.type = NLA_U32}, + [TCA_PIE_BETA] = {.type = NLA_U32}, + [TCA_PIE_ECN] = {.type = NLA_U32}, + [TCA_PIE_BYTEMODE] = {.type = NLA_U32}, + [TCA_PIE_DQ_RATE_ESTIMATOR] = {.type = NLA_U32}, }; static int pie_change(struct Qdisc *sch, struct nlattr *opt, @@ -549,7 +549,7 @@ static void pie_destroy(struct Qdisc *sch) } static struct Qdisc_ops pie_qdisc_ops __read_mostly = { - .id = "pie", + .id = "pie", .priv_size = sizeof(struct pie_sched_data), .enqueue = pie_qdisc_enqueue, .dequeue = pie_qdisc_dequeue, From patchwork Wed Jan 22 18:22:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227389 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=UR01aw+3; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v113C8Zz9sQp for ; Thu, 23 Jan 2020 05:23:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729016AbgAVSXc (ORCPT ); Wed, 22 Jan 2020 13:23:32 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:41978 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXc (ORCPT ); Wed, 22 Jan 2020 13:23:32 -0500 Received: by mail-pg1-f196.google.com with SMTP id x8so3939741pgk.8 for ; Wed, 22 Jan 2020 10:23:31 -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=SCmdNafV4LQw/RRGOXko1kH2Ydhm553VdaSsK52kHhw=; b=UR01aw+3n5n0JbdHZ5RQbDs9w7GmE+IprgntZWWd28GXmGCDeoH6Yg/VGPqp880t/t 1ch0O4P5XhgZ8CFmS9x9pVMSb8Jp0mfoEBEDMAlFqmdu5VdcPzoOx/wUVaKVL5gRDHmO i3Y0Vz1id3yNAtzJoGZyeE+UKfjXLI/Q8zRkZDfiUGw/VnGPDDKOZFvusqztDeFkjo36 7bzFtbq+VmTuUWIs0d77yS/WV0Cp/o0ML18+OTjX2kuwV9npQH17EPHTnzkyneJb+u/S gmfNrLAr1rlkAne0LKSo/2l2czEDPlbN/Lh1pH6GwXu0+crXxmogMzp3bn8s2t7HvzpB JknQ== 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=SCmdNafV4LQw/RRGOXko1kH2Ydhm553VdaSsK52kHhw=; b=o8oWBhO3yWj0aCrnws5Qd+EYamxFGWvrWnXwBtMtylQzfUNGg1eP9TQOR4sc8qfDZs 8v7jHROlogumMfTcVmHPOhn5UW7OqZ//wQFt3CJ8SZTiMWEfWHqkgL3gGVzw8GLtSk95 FiujMihKFX5Tj8h+vwCZ1qJe9+D2pnZGAeqBR35sz8m7T3XgUEUs8s9GCbG6xh7vEYT6 tBK5IDfxZGGV3nyQC3UNEl1087ZP13h0nZTFiOL2Wxr4V3nmIyqj1LpU1fsaXTnUhmAG IVNx1PgRxSLNOKkw/TQDtJjMBFjPcUqLeoTf7gioZqRRw+ScB9TD12miYoJRVML0WcuF rPdQ== X-Gm-Message-State: APjAAAU0YMcOJ9qpqjbP05n8iD0wk1Jjip5bkMvBzncBVGgoCPBToQXf 2Ll2ZX+IDTxobRaB/1S+5dKCK6EyJs/M0K0N X-Google-Smtp-Source: APXvYqydodrejq4pvn6isilZ/RvOsAIx+CmZC2N+Wj2wE1VKHcBmLlL0VEjft0jTyeN6NaGd9AhKKA== X-Received: by 2002:a65:55cc:: with SMTP id k12mr12793592pgs.184.1579717410847; Wed, 22 Jan 2020 10:23:30 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:30 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , Gautam Ramakrishnan Subject: [PATCH net-next v7 09/10] net: sched: pie: export symbols to be reused by FQ-PIE Date: Wed, 22 Jan 2020 23:52:32 +0530 Message-Id: <20200122182233.3940-10-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" This patch makes the drop_early(), calculate_probability() and pie_process_dequeue() functions generic enough to be used by both PIE and FQ-PIE (to be added in a future commit). The major change here is in the way the functions take in arguments. This patch exports these functions and makes FQ-PIE dependent on sch_pie. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 9 +++ net/sched/sch_pie.c | 173 ++++++++++++++++++++++---------------------- 2 files changed, 97 insertions(+), 85 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index 51a1984c2dce..90f5db3d29e7 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -124,4 +124,13 @@ static inline void pie_set_enqueue_time(struct sk_buff *skb) get_pie_cb(skb)->enqueue_time = psched_get_time(); } +bool pie_drop_early(struct Qdisc *sch, struct pie_params *params, + struct pie_vars *vars, u32 qlen, u32 packet_size); + +void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params, + struct pie_vars *vars, u32 qlen); + +void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars, + u32 qlen); + #endif diff --git a/net/sched/sch_pie.c b/net/sched/sch_pie.c index c65164659bca..915bcdb59a9f 100644 --- a/net/sched/sch_pie.c +++ b/net/sched/sch_pie.c @@ -30,64 +30,65 @@ struct pie_sched_data { struct Qdisc *sch; }; -static bool drop_early(struct Qdisc *sch, u32 packet_size) +bool pie_drop_early(struct Qdisc *sch, struct pie_params *params, + struct pie_vars *vars, u32 qlen, u32 packet_size) { - struct pie_sched_data *q = qdisc_priv(sch); u64 rnd; - u64 local_prob = q->vars.prob; + u64 local_prob = vars->prob; u32 mtu = psched_mtu(qdisc_dev(sch)); /* If there is still burst allowance left skip random early drop */ - if (q->vars.burst_time > 0) + if (vars->burst_time > 0) return false; /* If current delay is less than half of target, and * if drop prob is low already, disable early_drop */ - if ((q->vars.qdelay < q->params.target / 2) && - (q->vars.prob < MAX_PROB / 5)) + if ((vars->qdelay < params->target / 2) && + (vars->prob < MAX_PROB / 5)) return false; - /* If we have fewer than 2 mtu-sized packets, disable drop_early, + /* If we have fewer than 2 mtu-sized packets, disable pie_drop_early, * similar to min_th in RED */ - if (sch->qstats.backlog < 2 * mtu) + if (qlen < 2 * mtu) return false; /* If bytemode is turned on, use packet size to compute new * probablity. Smaller packets will have lower drop prob in this case */ - if (q->params.bytemode && packet_size <= mtu) + if (params->bytemode && packet_size <= mtu) local_prob = (u64)packet_size * div_u64(local_prob, mtu); else - local_prob = q->vars.prob; + local_prob = vars->prob; if (local_prob == 0) { - q->vars.accu_prob = 0; - q->vars.accu_prob_overflows = 0; + vars->accu_prob = 0; + vars->accu_prob_overflows = 0; } - if (local_prob > MAX_PROB - q->vars.accu_prob) - q->vars.accu_prob_overflows++; + if (local_prob > MAX_PROB - vars->accu_prob) + vars->accu_prob_overflows++; - q->vars.accu_prob += local_prob; + vars->accu_prob += local_prob; - if (q->vars.accu_prob_overflows == 0 && - q->vars.accu_prob < (MAX_PROB / 100) * 85) + if (vars->accu_prob_overflows == 0 && + vars->accu_prob < (MAX_PROB / 100) * 85) return false; - if (q->vars.accu_prob_overflows == 8 && - q->vars.accu_prob >= MAX_PROB / 2) + if (vars->accu_prob_overflows == 8 && + vars->accu_prob >= MAX_PROB / 2) return true; prandom_bytes(&rnd, 8); if (rnd < local_prob) { - q->vars.accu_prob = 0; - q->vars.accu_prob_overflows = 0; + vars->accu_prob = 0; + vars->accu_prob_overflows = 0; return true; } return false; } +EXPORT_SYMBOL_GPL(pie_drop_early); static int pie_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free) @@ -100,7 +101,8 @@ static int pie_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch, goto out; } - if (!drop_early(sch, skb->len)) { + if (!pie_drop_early(sch, &q->params, &q->vars, sch->qstats.backlog, + skb->len)) { enqueue = true; } else if (q->params.ecn && (q->vars.prob <= MAX_PROB / 10) && INET_ECN_set_ce(skb)) { @@ -212,26 +214,25 @@ static int pie_change(struct Qdisc *sch, struct nlattr *opt, return 0; } -static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb) +void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params, + struct pie_vars *vars, u32 qlen) { - struct pie_sched_data *q = qdisc_priv(sch); - int qlen = sch->qstats.backlog; /* current queue size in bytes */ psched_time_t now = psched_get_time(); u32 dtime = 0; /* If dq_rate_estimator is disabled, calculate qdelay using the * packet timestamp. */ - if (!q->params.dq_rate_estimator) { - q->vars.qdelay = now - pie_get_enqueue_time(skb); + if (!params->dq_rate_estimator) { + vars->qdelay = now - pie_get_enqueue_time(skb); - if (q->vars.dq_tstamp != DTIME_INVALID) - dtime = now - q->vars.dq_tstamp; + if (vars->dq_tstamp != DTIME_INVALID) + dtime = now - vars->dq_tstamp; - q->vars.dq_tstamp = now; + vars->dq_tstamp = now; if (qlen == 0) - q->vars.qdelay = 0; + vars->qdelay = 0; if (dtime == 0) return; @@ -243,9 +244,9 @@ static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb) * we have enough packets to calculate the drain rate. Save * current time as dq_tstamp and start measurement cycle. */ - if (qlen >= QUEUE_THRESHOLD && q->vars.dq_count == DQCOUNT_INVALID) { - q->vars.dq_tstamp = psched_get_time(); - q->vars.dq_count = 0; + if (qlen >= QUEUE_THRESHOLD && vars->dq_count == DQCOUNT_INVALID) { + vars->dq_tstamp = psched_get_time(); + vars->dq_count = 0; } /* Calculate the average drain rate from this value. If queue length @@ -257,25 +258,25 @@ static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb) * in bytes, time difference in psched_time, hence rate is in * bytes/psched_time. */ - if (q->vars.dq_count != DQCOUNT_INVALID) { - q->vars.dq_count += skb->len; + if (vars->dq_count != DQCOUNT_INVALID) { + vars->dq_count += skb->len; - if (q->vars.dq_count >= QUEUE_THRESHOLD) { - u32 count = q->vars.dq_count << PIE_SCALE; + if (vars->dq_count >= QUEUE_THRESHOLD) { + u32 count = vars->dq_count << PIE_SCALE; - dtime = now - q->vars.dq_tstamp; + dtime = now - vars->dq_tstamp; if (dtime == 0) return; count = count / dtime; - if (q->vars.avg_dq_rate == 0) - q->vars.avg_dq_rate = count; + if (vars->avg_dq_rate == 0) + vars->avg_dq_rate = count; else - q->vars.avg_dq_rate = - (q->vars.avg_dq_rate - - (q->vars.avg_dq_rate >> 3)) + (count >> 3); + vars->avg_dq_rate = + (vars->avg_dq_rate - + (vars->avg_dq_rate >> 3)) + (count >> 3); /* If the queue has receded below the threshold, we hold * on to the last drain rate calculated, else we reset @@ -283,10 +284,10 @@ static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb) * packet is dequeued */ if (qlen < QUEUE_THRESHOLD) { - q->vars.dq_count = DQCOUNT_INVALID; + vars->dq_count = DQCOUNT_INVALID; } else { - q->vars.dq_count = 0; - q->vars.dq_tstamp = psched_get_time(); + vars->dq_count = 0; + vars->dq_tstamp = psched_get_time(); } goto burst_allowance_reduction; @@ -296,18 +297,18 @@ static void pie_process_dequeue(struct Qdisc *sch, struct sk_buff *skb) return; burst_allowance_reduction: - if (q->vars.burst_time > 0) { - if (q->vars.burst_time > dtime) - q->vars.burst_time -= dtime; + if (vars->burst_time > 0) { + if (vars->burst_time > dtime) + vars->burst_time -= dtime; else - q->vars.burst_time = 0; + vars->burst_time = 0; } } +EXPORT_SYMBOL_GPL(pie_process_dequeue); -static void calculate_probability(struct Qdisc *sch) +void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars, + u32 qlen) { - struct pie_sched_data *q = qdisc_priv(sch); - u32 qlen = sch->qstats.backlog; /* queue size in bytes */ psched_time_t qdelay = 0; /* in pschedtime */ psched_time_t qdelay_old = 0; /* in pschedtime */ s64 delta = 0; /* determines the change in probability */ @@ -316,17 +317,17 @@ static void calculate_probability(struct Qdisc *sch) u32 power; bool update_prob = true; - if (q->params.dq_rate_estimator) { - qdelay_old = q->vars.qdelay; - q->vars.qdelay_old = q->vars.qdelay; + if (params->dq_rate_estimator) { + qdelay_old = vars->qdelay; + vars->qdelay_old = vars->qdelay; - if (q->vars.avg_dq_rate > 0) - qdelay = (qlen << PIE_SCALE) / q->vars.avg_dq_rate; + if (vars->avg_dq_rate > 0) + qdelay = (qlen << PIE_SCALE) / vars->avg_dq_rate; else qdelay = 0; } else { - qdelay = q->vars.qdelay; - qdelay_old = q->vars.qdelay_old; + qdelay = vars->qdelay; + qdelay_old = vars->qdelay_old; } /* If qdelay is zero and qlen is not, it means qlen is very small, @@ -342,18 +343,18 @@ static void calculate_probability(struct Qdisc *sch) * probability. alpha/beta are updated locally below by scaling down * by 16 to come to 0-2 range. */ - alpha = ((u64)q->params.alpha * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 4; - beta = ((u64)q->params.beta * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 4; + alpha = ((u64)params->alpha * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 4; + beta = ((u64)params->beta * (MAX_PROB / PSCHED_TICKS_PER_SEC)) >> 4; /* We scale alpha and beta differently depending on how heavy the * congestion is. Please see RFC 8033 for details. */ - if (q->vars.prob < MAX_PROB / 10) { + if (vars->prob < MAX_PROB / 10) { alpha >>= 1; beta >>= 1; power = 100; - while (q->vars.prob < div_u64(MAX_PROB, power) && + while (vars->prob < div_u64(MAX_PROB, power) && power <= 1000000) { alpha >>= 2; beta >>= 2; @@ -362,14 +363,14 @@ static void calculate_probability(struct Qdisc *sch) } /* alpha and beta should be between 0 and 32, in multiples of 1/16 */ - delta += alpha * (u64)(qdelay - q->params.target); + delta += alpha * (u64)(qdelay - params->target); delta += beta * (u64)(qdelay - qdelay_old); - oldprob = q->vars.prob; + oldprob = vars->prob; /* to ensure we increase probability in steps of no more than 2% */ if (delta > (s64)(MAX_PROB / (100 / 2)) && - q->vars.prob >= MAX_PROB / 10) + vars->prob >= MAX_PROB / 10) delta = (MAX_PROB / 100) * 2; /* Non-linear drop: @@ -380,12 +381,12 @@ static void calculate_probability(struct Qdisc *sch) if (qdelay > (PSCHED_NS2TICKS(250 * NSEC_PER_MSEC))) delta += MAX_PROB / (100 / 2); - q->vars.prob += delta; + vars->prob += delta; if (delta > 0) { /* prevent overflow */ - if (q->vars.prob < oldprob) { - q->vars.prob = MAX_PROB; + if (vars->prob < oldprob) { + vars->prob = MAX_PROB; /* Prevent normalization error. If probability is at * maximum value already, we normalize it here, and * skip the check to do a non-linear drop in the next @@ -395,8 +396,8 @@ static void calculate_probability(struct Qdisc *sch) } } else { /* prevent underflow */ - if (q->vars.prob > oldprob) - q->vars.prob = 0; + if (vars->prob > oldprob) + vars->prob = 0; } /* Non-linear drop in probability: Reduce drop probability quickly if @@ -405,10 +406,10 @@ static void calculate_probability(struct Qdisc *sch) if (qdelay == 0 && qdelay_old == 0 && update_prob) /* Reduce drop probability to 98.4% */ - q->vars.prob -= q->vars.prob / 64u; + vars->prob -= vars->prob / 64; - q->vars.qdelay = qdelay; - q->vars.qlen_old = qlen; + vars->qdelay = qdelay; + vars->qlen_old = qlen; /* We restart the measurement cycle if the following conditions are met * 1. If the delay has been low for 2 consecutive Tupdate periods @@ -416,16 +417,17 @@ static void calculate_probability(struct Qdisc *sch) * 3. If average dq_rate_estimator is enabled, we have atleast one * estimate for the avg_dq_rate ie., is a non-zero value */ - if ((q->vars.qdelay < q->params.target / 2) && - (q->vars.qdelay_old < q->params.target / 2) && - q->vars.prob == 0 && - (!q->params.dq_rate_estimator || q->vars.avg_dq_rate > 0)) { - pie_vars_init(&q->vars); + if ((vars->qdelay < params->target / 2) && + (vars->qdelay_old < params->target / 2) && + vars->prob == 0 && + (!params->dq_rate_estimator || vars->avg_dq_rate > 0)) { + pie_vars_init(vars); } - if (!q->params.dq_rate_estimator) - q->vars.qdelay_old = qdelay; + if (!params->dq_rate_estimator) + vars->qdelay_old = qdelay; } +EXPORT_SYMBOL_GPL(pie_calculate_probability); static void pie_timer(struct timer_list *t) { @@ -434,7 +436,7 @@ static void pie_timer(struct timer_list *t) spinlock_t *root_lock = qdisc_lock(qdisc_root_sleeping(sch)); spin_lock(root_lock); - calculate_probability(sch); + pie_calculate_probability(&q->params, &q->vars, sch->qstats.backlog); /* reset the timer to fire after 'tupdate'. tupdate is in jiffies. */ if (q->params.tupdate) @@ -523,12 +525,13 @@ static int pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d) static struct sk_buff *pie_qdisc_dequeue(struct Qdisc *sch) { + struct pie_sched_data *q = qdisc_priv(sch); struct sk_buff *skb = qdisc_dequeue_head(sch); if (!skb) return NULL; - pie_process_dequeue(sch, skb); + pie_process_dequeue(skb, &q->params, &q->vars, sch->qstats.backlog); return skb; } From patchwork Wed Jan 22 18:22:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1227390 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=DrAw/wKG; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 482v181KKpz9sQp for ; Thu, 23 Jan 2020 05:23:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729028AbgAVSXj (ORCPT ); Wed, 22 Jan 2020 13:23:39 -0500 Received: from mail-pl1-f196.google.com ([209.85.214.196]:37604 "EHLO mail-pl1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725883AbgAVSXj (ORCPT ); Wed, 22 Jan 2020 13:23:39 -0500 Received: by mail-pl1-f196.google.com with SMTP id c23so116243plz.4 for ; Wed, 22 Jan 2020 10:23:38 -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=8AW38ZjkFp5VTwWlfd3ipGvhQnLa+MJcQKFz5tlL/iE=; b=DrAw/wKG+CVHiNriOxpBG63S3ptkjgDMOIH8aJqCjGwcY0AXoZxhh74Mzkgr/gNvHr bOIr8SrjjQ0hPKbe+StCumAvkmxUOs+KzCWh9OMZS6mWccUgCMZDVJNkA6nXLa9OLnoA Zne3jTKX5Iy0hWBeCZ97rLvT8JgdmaC1wbBnhFo0mp/bs54sGHC83kSx30zVd9Tvdl9p eLfLIk0UT/5odyHF8tI5AbRb0NJj5PasV2oPXvZxKM8PSSpDqAhckPe3i+cO6J3EmTds XaW/Z2ZjBhle47H8TYkQFUjbO+8Tx/Me77oyxK58HEXafzMRXxzeSHCWBF7e6uPla/F7 iQBw== 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=8AW38ZjkFp5VTwWlfd3ipGvhQnLa+MJcQKFz5tlL/iE=; b=CWbiV/yLbe2PbTJR3b8uTs8zNVbgD97lbVY8o9dGkZczAg/An4uCGkKbvbPLEfiK5G lQByRcSV3afY5qsHNdrMlcKRyjolppLkKa31gHyP8g1fxwut2KE+DEPC5DGPH9cmstnY WbOSWPyOuYonxorVf/VISyUEuV9jY6DBKEU+MxtM8VgOie3rQaO5DucBNVcRNmTnsO9h gB/vbplwaRUrg4UL9gBaH8VahTcftQ94Kb9gOqPFIqjlYLocoP7ECA10y92sh3kwCpaH N8IDnWYRtHkKIzKWXmj15hP5ZTZ6fGaKCExP6aM9ECW0sMvNYq8v8/HiD37wr3n4Ab5u 5Dsg== X-Gm-Message-State: APjAAAUapCcbTQiGp0KpMiOfxZfIEoFv1OPdh807Utld/e0OXlkpCCVB HPHHZtQ9vWmtoaNMhGjOGfGMytdt+XcL9Zny X-Google-Smtp-Source: APXvYqx1JfE6REp+jJCsyLstcYJhzg9rlSjdBswM7jBzqXkK498t1pmLkKtsx6YlegEdWWcS3L2+Xw== X-Received: by 2002:a17:902:321:: with SMTP id 30mr12679333pld.130.1579717417493; Wed, 22 Jan 2020 10:23:37 -0800 (PST) Received: from localhost.localdomain ([223.186.203.82]) by smtp.gmail.com with ESMTPSA id o17sm3996532pjq.1.2020.01.22.10.23.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jan 2020 10:23:36 -0800 (PST) From: gautamramk@gmail.com To: netdev@vger.kernel.org Cc: "Mohit P. Tahiliani" , Jamal Hadi Salim , "David S . Miller" , Dave Taht , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= , Jakub Kicinski , Stephen Hemminger , Leslie Monis , "Sachin D . Patil" , "V . Saicharan" , Mohit Bhasi , Gautam Ramakrishnan Subject: [PATCH net-next v7 10/10] net: sched: add Flow Queue PIE packet scheduler Date: Wed, 22 Jan 2020 23:52:33 +0530 Message-Id: <20200122182233.3940-11-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200122182233.3940-1-gautamramk@gmail.com> References: <20200122182233.3940-1-gautamramk@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Mohit P. Tahiliani" Principles: - Packets are classified on flows. - This is a Stochastic model (as we use a hash, several flows might be hashed to the same slot) - Each flow has a PIE managed queue. - Flows are linked onto two (Round Robin) lists, so that new flows have priority on old ones. - For a given flow, packets are not reordered. - Drops during enqueue only. - ECN capability is off by default. - ECN threshold (if ECN is enabled) is at 10% by default. - Uses timestamps to calculate queue delay by default. Usage: tc qdisc ... fq_pie [ limit PACKETS ] [ flows NUMBER ] [ target TIME ] [ tupdate TIME ] [ alpha NUMBER ] [ beta NUMBER ] [ quantum BYTES ] [ memory_limit BYTES ] [ ecnprob PERCENTAGE ] [ [no]ecn ] [ [no]bytemode ] [ [no_]dq_rate_estimator ] defaults: limit: 10240 packets, flows: 1024 target: 15 ms, tupdate: 15 ms (in jiffies) alpha: 1/8, beta : 5/4 quantum: device MTU, memory_limit: 32 Mb ecnprob: 10%, ecn: off bytemode: off, dq_rate_estimator: off Signed-off-by: Mohit P. Tahiliani Signed-off-by: Sachin D. Patil Signed-off-by: V. Saicharan Signed-off-by: Mohit Bhasi Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 2 + include/uapi/linux/pkt_sched.h | 31 ++ net/sched/Kconfig | 13 + net/sched/Makefile | 1 + net/sched/sch_fq_pie.c | 562 +++++++++++++++++++++++++++++++++ 5 files changed, 609 insertions(+) create mode 100644 net/sched/sch_fq_pie.c diff --git a/include/net/pie.h b/include/net/pie.h index 90f5db3d29e7..fd5a37cb7993 100644 --- a/include/net/pie.h +++ b/include/net/pie.h @@ -81,9 +81,11 @@ struct pie_stats { /** * struct pie_skb_cb - contains private skb vars * @enqueue_time: timestamp when the packet is enqueued + * @mem_usage: size of the skb during enqueue */ struct pie_skb_cb { psched_time_t enqueue_time; + u32 mem_usage; }; static inline void pie_params_init(struct pie_params *params) diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h index bf5a5b1dfb0b..bbe791b24168 100644 --- a/include/uapi/linux/pkt_sched.h +++ b/include/uapi/linux/pkt_sched.h @@ -971,6 +971,37 @@ struct tc_pie_xstats { __u32 ecn_mark; /* packets marked with ecn*/ }; +/* FQ PIE */ +enum { + TCA_FQ_PIE_UNSPEC, + TCA_FQ_PIE_LIMIT, + TCA_FQ_PIE_FLOWS, + TCA_FQ_PIE_TARGET, + TCA_FQ_PIE_TUPDATE, + TCA_FQ_PIE_ALPHA, + TCA_FQ_PIE_BETA, + TCA_FQ_PIE_QUANTUM, + TCA_FQ_PIE_MEMORY_LIMIT, + TCA_FQ_PIE_ECN_PROB, + TCA_FQ_PIE_ECN, + TCA_FQ_PIE_BYTEMODE, + TCA_FQ_PIE_DQ_RATE_ESTIMATOR, + __TCA_FQ_PIE_MAX +}; +#define TCA_FQ_PIE_MAX (__TCA_FQ_PIE_MAX - 1) + +struct tc_fq_pie_xstats { + __u32 packets_in; /* total number of packets enqueued */ + __u32 dropped; /* packets dropped due to fq_pie_action */ + __u32 overlimit; /* dropped due to lack of space in queue */ + __u32 overmemory; /* dropped due to lack of memory in queue */ + __u32 ecn_mark; /* packets marked with ecn */ + __u32 new_flow_count; /* count of new flows created by packets */ + __u32 new_flows_len; /* count of flows in new list */ + __u32 old_flows_len; /* count of flows in old list */ + __u32 memory_usage; /* total memory across all queues */ +}; + /* CBS */ struct tc_cbs_qopt { __u8 offload; diff --git a/net/sched/Kconfig b/net/sched/Kconfig index b1e7ec726958..edde0e519438 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig @@ -366,6 +366,19 @@ config NET_SCH_PIE If unsure, say N. +config NET_SCH_FQ_PIE + depends on NET_SCH_PIE + tristate "Flow Queue Proportional Integral controller Enhanced (FQ-PIE)" + help + Say Y here if you want to use the Flow Queue Proportional Integral + controller Enhanced (FQ-PIE) packet scheduling algorithm. + For more information, please see https://tools.ietf.org/html/rfc8033 + + To compile this driver as a module, choose M here: the module + will be called sch_fq_pie. + + If unsure, say N. + config NET_SCH_INGRESS tristate "Ingress/classifier-action Qdisc" depends on NET_CLS_ACT diff --git a/net/sched/Makefile b/net/sched/Makefile index bc8856b865ff..31c367a6cd09 100644 --- a/net/sched/Makefile +++ b/net/sched/Makefile @@ -59,6 +59,7 @@ obj-$(CONFIG_NET_SCH_CAKE) += sch_cake.o obj-$(CONFIG_NET_SCH_FQ) += sch_fq.o obj-$(CONFIG_NET_SCH_HHF) += sch_hhf.o obj-$(CONFIG_NET_SCH_PIE) += sch_pie.o +obj-$(CONFIG_NET_SCH_FQ_PIE) += sch_fq_pie.o obj-$(CONFIG_NET_SCH_CBS) += sch_cbs.o obj-$(CONFIG_NET_SCH_ETF) += sch_etf.o obj-$(CONFIG_NET_SCH_TAPRIO) += sch_taprio.o diff --git a/net/sched/sch_fq_pie.c b/net/sched/sch_fq_pie.c new file mode 100644 index 000000000000..bbd0dea6b6b9 --- /dev/null +++ b/net/sched/sch_fq_pie.c @@ -0,0 +1,562 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Flow Queue PIE discipline + * + * Copyright (C) 2019 Mohit P. Tahiliani + * Copyright (C) 2019 Sachin D. Patil + * Copyright (C) 2019 V. Saicharan + * Copyright (C) 2019 Mohit Bhasi + * Copyright (C) 2019 Leslie Monis + * Copyright (C) 2019 Gautam Ramakrishnan + */ + +#include +#include +#include +#include +#include + +/* Flow Queue PIE + * + * Principles: + * - Packets are classified on flows. + * - This is a Stochastic model (as we use a hash, several flows might + * be hashed to the same slot) + * - Each flow has a PIE managed queue. + * - Flows are linked onto two (Round Robin) lists, + * so that new flows have priority on old ones. + * - For a given flow, packets are not reordered. + * - Drops during enqueue only. + * - ECN capability is off by default. + * - ECN threshold (if ECN is enabled) is at 10% by default. + * - Uses timestamps to calculate queue delay by default. + */ + +/** + * struct fq_pie_flow - contains data for each flow + * @vars: pie vars associated with the flow + * @deficit: number of remaining byte credits + * @backlog: size of data in the flow + * @qlen: number of packets in the flow + * @flowchain: flowchain for the flow + * @head: first packet in the flow + * @tail: last packet in the flow + */ +struct fq_pie_flow { + struct pie_vars vars; + s32 deficit; + u32 backlog; + u32 qlen; + struct list_head flowchain; + struct sk_buff *head; + struct sk_buff *tail; +}; + +struct fq_pie_sched_data { + struct tcf_proto __rcu *filter_list; /* optional external classifier */ + struct tcf_block *block; + struct fq_pie_flow *flows; + struct Qdisc *sch; + struct list_head old_flows; + struct list_head new_flows; + struct pie_params p_params; + u32 ecn_prob; + u32 flows_cnt; + u32 quantum; + u32 memory_limit; + u32 new_flow_count; + u32 memory_usage; + u32 overmemory; + struct pie_stats stats; + struct timer_list adapt_timer; +}; + +static unsigned int fq_pie_hash(const struct fq_pie_sched_data *q, + struct sk_buff *skb) +{ + return reciprocal_scale(skb_get_hash(skb), q->flows_cnt); +} + +static unsigned int fq_pie_classify(struct sk_buff *skb, struct Qdisc *sch, + int *qerr) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + struct tcf_proto *filter; + struct tcf_result res; + int result; + + if (TC_H_MAJ(skb->priority) == sch->handle && + TC_H_MIN(skb->priority) > 0 && + TC_H_MIN(skb->priority) <= q->flows_cnt) + return TC_H_MIN(skb->priority); + + filter = rcu_dereference_bh(q->filter_list); + if (!filter) + return fq_pie_hash(q, skb) + 1; + + *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; + result = tcf_classify(skb, filter, &res, false); + if (result >= 0) { +#ifdef CONFIG_NET_CLS_ACT + switch (result) { + case TC_ACT_STOLEN: + case TC_ACT_QUEUED: + case TC_ACT_TRAP: + *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN; + /* fall through */ + case TC_ACT_SHOT: + return 0; + } +#endif + if (TC_H_MIN(res.classid) <= q->flows_cnt) + return TC_H_MIN(res.classid); + } + return 0; +} + +/* add skb to flow queue (tail add) */ +static inline void flow_queue_add(struct fq_pie_flow *flow, + struct sk_buff *skb) +{ + if (!flow->head) + flow->head = skb; + else + flow->tail->next = skb; + flow->tail = skb; + skb->next = NULL; +} + +static int fq_pie_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch, + struct sk_buff **to_free) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + struct fq_pie_flow *sel_flow; + int uninitialized_var(ret); + u8 memory_limited = false; + u8 enqueue = false; + u32 pkt_len; + u32 idx; + + /* Classifies packet into corresponding flow */ + idx = fq_pie_classify(skb, sch, &ret); + sel_flow = &q->flows[idx]; + + /* Checks whether adding a new packet would exceed memory limit */ + get_pie_cb(skb)->mem_usage = skb->truesize; + memory_limited = q->memory_usage > q->memory_limit + skb->truesize; + + /* Checks if the qdisc is full */ + if (unlikely(qdisc_qlen(sch) >= sch->limit)) { + q->stats.overlimit++; + goto out; + } else if (unlikely(memory_limited)) { + q->overmemory++; + } + + if (!pie_drop_early(sch, &q->p_params, &sel_flow->vars, + sel_flow->backlog, skb->len)) { + enqueue = true; + } else if (q->p_params.ecn && + sel_flow->vars.prob <= (MAX_PROB / 100) * q->ecn_prob && + INET_ECN_set_ce(skb)) { + /* If packet is ecn capable, mark it if drop probability + * is lower than the parameter ecn_prob, else drop it. + */ + q->stats.ecn_mark++; + enqueue = true; + } + if (enqueue) { + /* Set enqueue time only when dq_rate_estimator is disabled. */ + if (!q->p_params.dq_rate_estimator) + pie_set_enqueue_time(skb); + + pkt_len = qdisc_pkt_len(skb); + q->stats.packets_in++; + q->memory_usage += skb->truesize; + sch->qstats.backlog += pkt_len; + sch->q.qlen++; + flow_queue_add(sel_flow, skb); + if (list_empty(&sel_flow->flowchain)) { + list_add_tail(&sel_flow->flowchain, &q->new_flows); + q->new_flow_count++; + sel_flow->deficit = q->quantum; + sel_flow->qlen = 0; + sel_flow->backlog = 0; + } + sel_flow->qlen++; + sel_flow->backlog += pkt_len; + return NET_XMIT_SUCCESS; + } +out: + q->stats.dropped++; + sel_flow->vars.accu_prob = 0; + sel_flow->vars.accu_prob_overflows = 0; + __qdisc_drop(skb, to_free); + qdisc_qstats_drop(sch); + return NET_XMIT_CN; +} + +static const struct nla_policy fq_pie_policy[TCA_FQ_PIE_MAX + 1] = { + [TCA_FQ_PIE_LIMIT] = {.type = NLA_U32}, + [TCA_FQ_PIE_FLOWS] = {.type = NLA_U32}, + [TCA_FQ_PIE_TARGET] = {.type = NLA_U32}, + [TCA_FQ_PIE_TUPDATE] = {.type = NLA_U32}, + [TCA_FQ_PIE_ALPHA] = {.type = NLA_U32}, + [TCA_FQ_PIE_BETA] = {.type = NLA_U32}, + [TCA_FQ_PIE_QUANTUM] = {.type = NLA_U32}, + [TCA_FQ_PIE_MEMORY_LIMIT] = {.type = NLA_U32}, + [TCA_FQ_PIE_ECN_PROB] = {.type = NLA_U32}, + [TCA_FQ_PIE_ECN] = {.type = NLA_U32}, + [TCA_FQ_PIE_BYTEMODE] = {.type = NLA_U32}, + [TCA_FQ_PIE_DQ_RATE_ESTIMATOR] = {.type = NLA_U32}, +}; + +static inline struct sk_buff *dequeue_head(struct fq_pie_flow *flow) +{ + struct sk_buff *skb = flow->head; + + flow->head = skb->next; + skb->next = NULL; + return skb; +} + +static struct sk_buff *fq_pie_qdisc_dequeue(struct Qdisc *sch) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + struct sk_buff *skb = NULL; + struct fq_pie_flow *flow; + struct list_head *head; + u32 pkt_len; + +begin: + head = &q->new_flows; + if (list_empty(head)) { + head = &q->old_flows; + if (list_empty(head)) + return NULL; + } + + flow = list_first_entry(head, struct fq_pie_flow, flowchain); + /* Flow has exhausted all its credits */ + if (flow->deficit <= 0) { + flow->deficit += q->quantum; + list_move_tail(&flow->flowchain, &q->old_flows); + goto begin; + } + + if (flow->head) { + skb = dequeue_head(flow); + pkt_len = qdisc_pkt_len(skb); + sch->qstats.backlog -= pkt_len; + sch->q.qlen--; + qdisc_bstats_update(sch, skb); + } + + if (!skb) { + /* force a pass through old_flows to prevent starvation */ + if (head == &q->new_flows && !list_empty(&q->old_flows)) + list_move_tail(&flow->flowchain, &q->old_flows); + else + list_del_init(&flow->flowchain); + goto begin; + } + + flow->qlen--; + flow->deficit -= pkt_len; + flow->backlog -= pkt_len; + q->memory_usage -= get_pie_cb(skb)->mem_usage; + pie_process_dequeue(skb, &q->p_params, &flow->vars, flow->backlog); + return skb; +} + +static int fq_pie_change(struct Qdisc *sch, struct nlattr *opt, + struct netlink_ext_ack *extack) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + struct nlattr *tb[TCA_FQ_PIE_MAX + 1]; + unsigned int len_dropped = 0; + unsigned int num_dropped = 0; + int err; + + if (!opt) + return -EINVAL; + + err = nla_parse_nested(tb, TCA_FQ_PIE_MAX, opt, fq_pie_policy, extack); + if (err < 0) + return err; + + sch_tree_lock(sch); + if (tb[TCA_FQ_PIE_LIMIT]) { + u32 limit = nla_get_u32(tb[TCA_FQ_PIE_LIMIT]); + + q->p_params.limit = limit; + sch->limit = limit; + } + if (tb[TCA_FQ_PIE_FLOWS]) { + if (q->flows) { + NL_SET_ERR_MSG_MOD(extack, + "Number of flows cannot be changed"); + goto flow_error; + } + q->flows_cnt = nla_get_u32(tb[TCA_FQ_PIE_FLOWS]); + if (!q->flows_cnt || q->flows_cnt > 65536) { + NL_SET_ERR_MSG_MOD(extack, + "Number of flows must be < 65536"); + goto flow_error; + } + } + + /* convert from microseconds to pschedtime */ + if (tb[TCA_FQ_PIE_TARGET]) { + /* target is in us */ + u32 target = nla_get_u32(tb[TCA_FQ_PIE_TARGET]); + + /* convert to pschedtime */ + q->p_params.target = + PSCHED_NS2TICKS((u64)target * NSEC_PER_USEC); + } + + /* tupdate is in jiffies */ + if (tb[TCA_FQ_PIE_TUPDATE]) + q->p_params.tupdate = + usecs_to_jiffies(nla_get_u32(tb[TCA_FQ_PIE_TUPDATE])); + + if (tb[TCA_FQ_PIE_ALPHA]) + q->p_params.alpha = nla_get_u32(tb[TCA_FQ_PIE_ALPHA]); + + if (tb[TCA_FQ_PIE_BETA]) + q->p_params.beta = nla_get_u32(tb[TCA_FQ_PIE_BETA]); + + if (tb[TCA_FQ_PIE_QUANTUM]) + q->quantum = nla_get_u32(tb[TCA_FQ_PIE_QUANTUM]); + + if (tb[TCA_FQ_PIE_MEMORY_LIMIT]) + q->memory_limit = nla_get_u32(tb[TCA_FQ_PIE_MEMORY_LIMIT]); + + if (tb[TCA_FQ_PIE_ECN_PROB]) + q->ecn_prob = nla_get_u32(tb[TCA_FQ_PIE_ECN_PROB]); + + if (tb[TCA_FQ_PIE_ECN]) + q->p_params.ecn = nla_get_u32(tb[TCA_FQ_PIE_ECN]); + + if (tb[TCA_FQ_PIE_BYTEMODE]) + q->p_params.bytemode = nla_get_u32(tb[TCA_FQ_PIE_BYTEMODE]); + + if (tb[TCA_FQ_PIE_DQ_RATE_ESTIMATOR]) + q->p_params.dq_rate_estimator = + nla_get_u32(tb[TCA_FQ_PIE_DQ_RATE_ESTIMATOR]); + + /* Drop excess packets if new limit is lower */ + while (sch->q.qlen > sch->limit) { + struct sk_buff *skb = fq_pie_qdisc_dequeue(sch); + + kfree_skb(skb); + len_dropped += qdisc_pkt_len(skb); + num_dropped += 1; + } + qdisc_tree_reduce_backlog(sch, num_dropped, len_dropped); + + sch_tree_unlock(sch); + return 0; + +flow_error: + sch_tree_unlock(sch); + return -EINVAL; +} + +static void fq_pie_timer(struct timer_list *t) +{ + struct fq_pie_sched_data *q = from_timer(q, t, adapt_timer); + struct Qdisc *sch = q->sch; + spinlock_t *root_lock; /* to lock qdisc for probability calculations */ + u16 idx; + + root_lock = qdisc_lock(qdisc_root_sleeping(sch)); + spin_lock(root_lock); + + for (idx = 0; idx < q->flows_cnt; idx++) + pie_calculate_probability(&q->p_params, &q->flows[idx].vars, + q->flows[idx].backlog); + + /* reset the timer to fire after 'tupdate' jiffies. */ + if (q->p_params.tupdate) + mod_timer(&q->adapt_timer, jiffies + q->p_params.tupdate); + + spin_unlock(root_lock); +} + +static int fq_pie_init(struct Qdisc *sch, struct nlattr *opt, + struct netlink_ext_ack *extack) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + int err; + u16 idx; + + pie_params_init(&q->p_params); + sch->limit = 10 * 1024; + q->p_params.limit = sch->limit; + q->quantum = psched_mtu(qdisc_dev(sch)); + q->sch = sch; + q->ecn_prob = 10; + q->flows_cnt = 1024; + q->memory_limit = SZ_32M; + + INIT_LIST_HEAD(&q->new_flows); + INIT_LIST_HEAD(&q->old_flows); + + if (opt) { + err = fq_pie_change(sch, opt, extack); + + if (err) + return err; + } + + err = tcf_block_get(&q->block, &q->filter_list, sch, extack); + if (err) + goto init_failure; + + q->flows = kvcalloc(q->flows_cnt, sizeof(struct fq_pie_flow), + GFP_KERNEL); + if (!q->flows) { + err = -ENOMEM; + goto init_failure; + } + for (idx = 0; idx < q->flows_cnt; idx++) { + struct fq_pie_flow *flow = q->flows + idx; + + INIT_LIST_HEAD(&flow->flowchain); + pie_vars_init(&flow->vars); + } + + timer_setup(&q->adapt_timer, fq_pie_timer, 0); + mod_timer(&q->adapt_timer, jiffies + HZ / 2); + + return 0; + +init_failure: + q->flows_cnt = 0; + + return err; +} + +static int fq_pie_dump(struct Qdisc *sch, struct sk_buff *skb) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + struct nlattr *opts; + + opts = nla_nest_start(skb, TCA_OPTIONS); + if (!opts) + return -EMSGSIZE; + + /* convert target from pschedtime to us */ + if (nla_put_u32(skb, TCA_FQ_PIE_LIMIT, sch->limit) || + nla_put_u32(skb, TCA_FQ_PIE_FLOWS, q->flows_cnt) || + nla_put_u32(skb, TCA_FQ_PIE_TARGET, + ((u32)PSCHED_TICKS2NS(q->p_params.target)) / + NSEC_PER_USEC) || + nla_put_u32(skb, TCA_FQ_PIE_TUPDATE, + jiffies_to_usecs(q->p_params.tupdate)) || + nla_put_u32(skb, TCA_FQ_PIE_ALPHA, q->p_params.alpha) || + nla_put_u32(skb, TCA_FQ_PIE_BETA, q->p_params.beta) || + nla_put_u32(skb, TCA_FQ_PIE_QUANTUM, q->quantum) || + nla_put_u32(skb, TCA_FQ_PIE_MEMORY_LIMIT, q->memory_limit) || + nla_put_u32(skb, TCA_FQ_PIE_ECN_PROB, q->ecn_prob) || + nla_put_u32(skb, TCA_FQ_PIE_ECN, q->p_params.ecn) || + nla_put_u32(skb, TCA_FQ_PIE_BYTEMODE, q->p_params.bytemode) || + nla_put_u32(skb, TCA_FQ_PIE_DQ_RATE_ESTIMATOR, + q->p_params.dq_rate_estimator)) + goto nla_put_failure; + + return nla_nest_end(skb, opts); + +nla_put_failure: + nla_nest_cancel(skb, opts); + return -EMSGSIZE; +} + +static int fq_pie_dump_stats(struct Qdisc *sch, struct gnet_dump *d) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + struct tc_fq_pie_xstats st = { + .packets_in = q->stats.packets_in, + .overlimit = q->stats.overlimit, + .overmemory = q->overmemory, + .dropped = q->stats.dropped, + .ecn_mark = q->stats.ecn_mark, + .new_flow_count = q->new_flow_count, + .memory_usage = q->memory_usage, + }; + struct list_head *pos; + + sch_tree_lock(sch); + list_for_each(pos, &q->new_flows) + st.new_flows_len++; + + list_for_each(pos, &q->old_flows) + st.old_flows_len++; + sch_tree_unlock(sch); + + return gnet_stats_copy_app(d, &st, sizeof(st)); +} + +static void fq_pie_reset(struct Qdisc *sch) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + u16 idx; + + INIT_LIST_HEAD(&q->new_flows); + INIT_LIST_HEAD(&q->old_flows); + for (idx = 0; idx < q->flows_cnt; idx++) { + struct fq_pie_flow *flow = q->flows + idx; + + /* Removes all packets from flow */ + rtnl_kfree_skbs(flow->head, flow->tail); + flow->head = NULL; + + INIT_LIST_HEAD(&flow->flowchain); + pie_vars_init(&flow->vars); + } + + sch->q.qlen = 0; + sch->qstats.backlog = 0; +} + +static void fq_pie_destroy(struct Qdisc *sch) +{ + struct fq_pie_sched_data *q = qdisc_priv(sch); + + tcf_block_put(q->block); + del_timer_sync(&q->adapt_timer); + kvfree(q->flows); +} + +static struct Qdisc_ops fq_pie_qdisc_ops __read_mostly = { + .id = "fq_pie", + .priv_size = sizeof(struct fq_pie_sched_data), + .enqueue = fq_pie_qdisc_enqueue, + .dequeue = fq_pie_qdisc_dequeue, + .peek = qdisc_peek_dequeued, + .init = fq_pie_init, + .destroy = fq_pie_destroy, + .reset = fq_pie_reset, + .change = fq_pie_change, + .dump = fq_pie_dump, + .dump_stats = fq_pie_dump_stats, + .owner = THIS_MODULE, +}; + +static int __init fq_pie_module_init(void) +{ + return register_qdisc(&fq_pie_qdisc_ops); +} + +static void __exit fq_pie_module_exit(void) +{ + unregister_qdisc(&fq_pie_qdisc_ops); +} + +module_init(fq_pie_module_init); +module_exit(fq_pie_module_exit); + +MODULE_DESCRIPTION("Flow Queue Proportional Integral controller Enhanced (FQ-PIE)"); +MODULE_AUTHOR("Mohit P. Tahiliani"); +MODULE_LICENSE("GPL");