From patchwork Tue Jan 21 14:12:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226585 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=czm+5/UH; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829Vb0ZRwz9sP3 for ; Wed, 22 Jan 2020 01:13:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729160AbgAUONK (ORCPT ); Tue, 21 Jan 2020 09:13:10 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:44795 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727508AbgAUONK (ORCPT ); Tue, 21 Jan 2020 09:13:10 -0500 Received: by mail-pg1-f194.google.com with SMTP id x7so1542416pgl.11 for ; Tue, 21 Jan 2020 06:13:09 -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=czm+5/UHG3OYUmOFlHNbuiZW0mvHl+pezywexKo4ifa/baSM6KMFKrljIb0CqYG8ac B4Hf0/F/wwckuXWe0SaYYEpkbb0tZlXEuUxUnnHAB/5FkLCxqwLhUtg6aENeCcvYYNQb AW0PFfQPPAdo8TGUvghEq8OQjXVnV+MxNI35v796wWE4I6mg/oEFOSuErn1CV+xB8U6e ZeCnN4yMgliH1u8MpH5pwfteG2KgsRixh2qUGfyhtK86IW6acstxsTAeRGpQrvLp0hUe e8/jmm/waEN+hY+XMPMkwjzaG7QC7F1TTqqgniVYDUgfv5kzvGdBz054zMiRfZAg+dH7 aRlw== 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=SJBQcfslKg0fpb3wWULcujY9GPWmxuIYwJ6MKWiL4U94Z1YSR0Jr08fyRfN/E/fsKA /Qhohh9gYMMMWbFd2srMIyzQDM1O2Kwo2MU4qwfKHKfwoULMUz+UBsmAbKYyeborxG1w atLlXaub1w4rucYEmbSBFGNSo4pa2x9FKUK5QoxmoTVf60WzAtnE0Of8dNymHkI67HkT b9QO5zvmOh+VhyyzMnlIrg9JA3RZCQTJN2EHWPoehlnB++aZ1MtM4JY/3/Q/G0WN2U2U HMgByMoRf6xXI1v8tCu0KgkKyRMw6tpr98tXUrBgPmRd0GdkAn4h0uLmJrdD3hwsZH45 zzmA== X-Gm-Message-State: APjAAAXwKZ/9E13a70EJsC78ktQiRwvpccF9WPJVxXaKjxTdbuMqeO17 Yifx/tU24wnlcbRVqXzNysQXmjg3Ruin9w== X-Google-Smtp-Source: APXvYqxcQqDHDO/7BaI0m+WlqN7o0TptcOjLHH5IuVkpgTuC+tzKFy2ychNc2Fuf2YOdXki0U7KDnw== X-Received: by 2002:a62:be09:: with SMTP id l9mr4617075pff.57.1579615988819; Tue, 21 Jan 2020 06:13:08 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:08 -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 v4 01/10] net: sched: pie: move common code to pie.h Date: Tue, 21 Jan 2020 19:42:40 +0530 Message-Id: <20200121141250.26989-2-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 Tue Jan 21 14:12:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226586 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=T8PyxVI1; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829Vg5Mdwz9sP3 for ; Wed, 22 Jan 2020 01:13:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729190AbgAUONO (ORCPT ); Tue, 21 Jan 2020 09:13:14 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:44634 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727508AbgAUONO (ORCPT ); Tue, 21 Jan 2020 09:13:14 -0500 Received: by mail-pf1-f193.google.com with SMTP id 62so1555840pfu.11 for ; Tue, 21 Jan 2020 06:13:14 -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=T8PyxVI1rxTLmKO9kVr+k2KZMan8b+EbqdnIcLfBhTAbTBIyMlDfrGRejSB8/MFhbR dMmpz9K218prYYCmk5gJmfQO4xk+3h+VzXAJqOVhTYqbZ5m7NIreCtNbj8ykXldksx2N Q53G17Le7LEyovJ79+hLePqQEYPy1SThZybntyq4Q62XfpriTYza3glhrzVGt6mGU0/x KkHPPSJKIf8wkTF4y/x7bvb/S4qTTF9uGPdrCuwKAclUbTz7/hsjw8sKZ9g8+1U+lcLo uFJ9IsH1FepkOYQpAIvkxo2PaqKjMsuvUwJXLV2Ends599PNyLalfTocObrKKE1LOOUX Zjww== 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=aKYhUIC7rTyOwpSphzr8IiBAzOgizcgla8StwoHBuGijz2PAxDS899TjjkOPb+VNPe FvnqFvIKtI7FKDQHp8omTEgF8tIktupRl4wW5Kq4fEzddrssUzJ29TdCfuX6AV+2LrFp 9jCFj5PssNge1/5LULgR3sCV/wq2JL6HaKHY9SiNKJQhzcS8ZNQbGr2KUMrQ2Ot8xipl HOtti/7zADLKGctzFzVuKaT7W0HFUZauCIHYa78zOtywABiXAdvaC033mxMISCsaD3T9 bre7DC0e2JLO2Wo0mIkyQP5sFFZWLNurVV+KTshW9uOKp6bkVUHW2lNM9TXt/JkPg/3O qQMQ== X-Gm-Message-State: APjAAAUk0DRJJB09P3tqQ/vicrzz8DiGHWGgzzoBR8cofEIc88WXrMWv ESliHvtAK24yaa0v7xYyrwrTxbcCtN6XvA== X-Google-Smtp-Source: APXvYqzoDlghdF6wfrRj/yoFkclxTKR8skZVkaZiTaDRWKXXiQCOEbSHOFuYa37ft7mjjL/VJ2cmZQ== X-Received: by 2002:a63:2355:: with SMTP id u21mr5580669pgm.179.1579615993695; Tue, 21 Jan 2020 06:13:13 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:13 -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 v4 02/10] pie: use U64_MAX to denote (2^64 - 1) Date: Tue, 21 Jan 2020 19:42:41 +0530 Message-Id: <20200121141250.26989-3-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 Tue Jan 21 14:12:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226588 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=fbJKPW6+; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829Vm5MdPz9sRQ for ; Wed, 22 Jan 2020 01:13:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729259AbgAUONU (ORCPT ); Tue, 21 Jan 2020 09:13:20 -0500 Received: from mail-pg1-f196.google.com ([209.85.215.196]:37264 "EHLO mail-pg1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729162AbgAUONT (ORCPT ); Tue, 21 Jan 2020 09:13:19 -0500 Received: by mail-pg1-f196.google.com with SMTP id q127so1565736pga.4 for ; Tue, 21 Jan 2020 06:13:19 -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=fbJKPW6+ukxnEcRWrHQkv+g/W32eD9IDKig1zZMNNU5Qije+FyJKvmNTUjj1QTBcMF 3nZwkF3LI0FipVkWpMucP0kXjLKaW8vnnzmURwffu1da3S/nHIVU9PASIxC8zW1OE1gN L2Hb0y2qucIR7SuYS/VofH7MjsIjqMVXTl80RZpbYND4PxBJKbo1YhaVXYur1z1tgCY8 S86s56nnE6OKDDcgfk88h8cXDUhJrge2bb+x7OIAuSyBzRsCoOb4UN+ss/h2GzV54tkQ j3c8GA74w9sI7UIQ4Hu1h9tUfM7qAM1A6j7wNtYvbj4fMzvIExAFUkQkd1oqj/KyUHEu 07Xg== 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=bGECaTmJ8a/JCjiLEuDHCitCZ8l5jEP/KmxqchCNIxBYQUzTXqUHFdg4tBNEEfObW0 EE+KWyGXepUxnY5xAuAJu8kfovLkoVPpyO/ekH7o1dPV8VBqNZxlOmfvxS9PK8ZiD78z wY0G8FBEOWhwahTKob9SWMCLA5xvG/8lNyWp83fejM/+XGQwLRSP1n3ltYw4XF0PHHQx wkBQjttwaMoruTrje8DBloXHc5cddhi1y0yAfBbg7HBT483WvPFKw/idgnBV81nj3TOf DPIeAawYeuA0IpbjN8a8tG2MtUt6991bxD1EnRpH0zACZiR0JvBmWoGywFJBXx+9UQj3 2FgA== X-Gm-Message-State: APjAAAWzLYiKCtLx1SSdyzConxnbfJQGphdy1LLd+6boZcl5LFgfJDlc dP3k/zFl1sCQ+07A+SqOES7X2XHBaojoig== X-Google-Smtp-Source: APXvYqw5oqoblN/4DPJM8+v7/kJkoIqjbtrqrLF7ust6JQcjFmKUNMXfRIugvZw1WhJB3BFOGLpFlQ== X-Received: by 2002:a63:184d:: with SMTP id 13mr5643823pgy.132.1579615998366; Tue, 21 Jan 2020 06:13:18 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:17 -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 v4 03/10] pie: rearrange macros in order of length Date: Tue, 21 Jan 2020 19:42:42 +0530 Message-Id: <20200121141250.26989-4-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 Tue Jan 21 14:12:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226589 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=jFX8o9Q/; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829Vr6B8bz9sP3 for ; Wed, 22 Jan 2020 01:13:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729275AbgAUONY (ORCPT ); Tue, 21 Jan 2020 09:13:24 -0500 Received: from mail-pj1-f67.google.com ([209.85.216.67]:54891 "EHLO mail-pj1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729162AbgAUONX (ORCPT ); Tue, 21 Jan 2020 09:13:23 -0500 Received: by mail-pj1-f67.google.com with SMTP id kx11so1426144pjb.4 for ; Tue, 21 Jan 2020 06:13:23 -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=jFX8o9Q/idu//qa1Y7rnAbcYrIfzg5QCxYjfbhoH4+FZOY49OKFDnz70lvOAo9m2Zf SCgfg9Il5433FGuGfFHrVNwwocF/4Ub+rWCwZSbPCcy+abODklgr8aacq5fj6HOQhNtv QvzX09wB8em+j66y2f6pIT4hDTLkakh/J36an1eIp+0MwJPzygJgLmAMfG1iPErRSG0b wGj38fqDwLoWYH5Gg28AHi2gzxXZ6blS0mz/yH9Qx6EU/GfdxCEOrefrqheENqYgDfHY 4ZhYX/MZD6WjJ0yO4MeI/yvou1jKg9KXOUfOzN1D7FWbV4a1yqwMPnkmKbECzruWe/kU Vx4g== 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=du71eCvmERXkjQ+3AB7Qd4vMKbFg2k5twdLkOnb8SyKC6rs4jFgFLYdk/J1cKXPlLj r/ZQgn/ZAhuxeno35ls/of1fTLgbl3/elKMr689V5KWMOgMRccdixKyxI0dxtrPd+EKQ ffy+ko/g7LXWediZfpKM4Cq33NvCQPPthLWr5kjxAruiPAEmi6GIkI7TvOxfxH/uMZlf klkO9sKxEVNmP+HEYH+1F3tMazVS38X8DkktnT0TeIMGmLYW8dzOh4lEGJoK9riY//Ug IeajkmJMOKzoN11c64BHa/TSgpaE9ovNahKLucH4twulGu3c37fha83ZEU2Z0EA2EnZ6 lrCQ== X-Gm-Message-State: APjAAAWnw3kJ+76BH0bmK36DGMxqg3qqIVMKKge9Egrh2fqkvzpNSvDL DS3M0TgTp/ek/JbcX6cFiKaacUTX3fCf2A== X-Google-Smtp-Source: APXvYqxEiUUZtVf2nHi6612TSYhil1ZhxrqNSayxdV06OARHsasIHF/pq5ihgNnKQ7J0b1d6UIlJhQ== X-Received: by 2002:a17:90a:2763:: with SMTP id o90mr5438539pje.110.1579616002673; Tue, 21 Jan 2020 06:13:22 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:22 -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 v4 04/10] pie: use u8 instead of bool in pie_vars Date: Tue, 21 Jan 2020 19:42:43 +0530 Message-Id: <20200121141250.26989-5-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 Tue Jan 21 14:12:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226590 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=kaQfXK5k; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829Vx2gjWz9sPJ for ; Wed, 22 Jan 2020 01:13:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728916AbgAUON2 (ORCPT ); Tue, 21 Jan 2020 09:13:28 -0500 Received: from mail-pf1-f195.google.com ([209.85.210.195]:35837 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727059AbgAUON2 (ORCPT ); Tue, 21 Jan 2020 09:13:28 -0500 Received: by mail-pf1-f195.google.com with SMTP id i23so1579506pfo.2 for ; Tue, 21 Jan 2020 06:13:27 -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=Koo9oYgCLFqTmfRexnYrMar9O2Y7tkdHqNHY1KP94GM=; b=kaQfXK5kpkYlCNUEVALPaX1AungE115WE8CVXGusoSrjlX5d/Y+faxCvFtGqMQYICm HawsRpgOs59J5SLRityMTyfNyJQn5esgmqp3rKtJRgKxurtA7Hcwg9q4mdZx/dLu+MUC OJXaMcwTaHSwVKUsJd4/ujebyA3VZyGt5qCZtHi/Bb1gFLiC45lLH2hHVOOgO6BGo0p4 a3HH42cO/cVefosgtRRBRJO43m0ypot3vryeCY5ftxDw/giU4OhrO02+FhgSYvQG4q9y D8KChg5DB4gu7xWPlE2vtjhi7Txt7xLu6q/yqC2r9yd9BUOwkaMEqbOKCuxsnr7+yLK+ E3tQ== 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=Koo9oYgCLFqTmfRexnYrMar9O2Y7tkdHqNHY1KP94GM=; b=GeDjOlj580EWHZBRqxV6KH9qnkLoM50W05yaAFKfS3Yj0OulN62I1HPgiGxTm9bX0j 36N7gzUju5SOkEVAwjOxbSJ33JyM9sWo5b90sBC0dMdZCwjr2zsDTJhhnepnQLvvNcdS n7kqshvDcsfEAf2sH3laMTgMCVRQ75iBwSqh+42e7lyPINMFNmZ2SX9MErbjFDRJ27su 7LDKGK+SdLdcS6a5sN1aV3JXkK7hw4BsDGdBDhf89Na1Yc8OT2cIuIMcP2N2Urbe5rV5 Y1+46GKcnZxlN/K5axYqkMSUqmHldzaSM4/DW16Fm20yNkXxtD703atwcOPLA0hTs87D IW6w== X-Gm-Message-State: APjAAAU982HFSYvy/nAvkqDT2wUTsr49Tl7PAE/bBYus9JBPqCGoXc1Q LDwl7mj7NMWZk4+KEFI529Mk6RjEfQvTGQ== X-Google-Smtp-Source: APXvYqy7R8adZuPzcngyywI72HLvptoIKAJueNOX0ZbCKMDjk0ymSNcHwHjr9Ba5LqFJD+HgYkBRfg== X-Received: by 2002:a63:d502:: with SMTP id c2mr5780841pgg.46.1579616007063; Tue, 21 Jan 2020 06:13:27 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:26 -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 v4 05/10] pie: rearrange structure members and their initializations Date: Tue, 21 Jan 2020 19:42:44 +0530 Message-Id: <20200121141250.26989-6-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 structures such that they appear in order of their types. Also, change the order of their initializations to match the order in which they appear in the structures. This improves the code's readability and consistency. Signed-off-by: Mohit P. Tahiliani Signed-off-by: Leslie Monis Signed-off-by: Gautam Ramakrishnan --- include/net/pie.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/net/pie.h b/include/net/pie.h index f9c6a44bdb0c..54ba6c6a7514 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 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 */ @@ -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; } From patchwork Tue Jan 21 14:12:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226591 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=HsTP/W0d; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829W21G5rz9sPJ for ; Wed, 22 Jan 2020 01:13:34 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729184AbgAUONd (ORCPT ); Tue, 21 Jan 2020 09:13:33 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:46165 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727059AbgAUONd (ORCPT ); Tue, 21 Jan 2020 09:13:33 -0500 Received: by mail-pl1-f195.google.com with SMTP id y8so1377895pll.13 for ; Tue, 21 Jan 2020 06:13:32 -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=ab5exaHl+2Vc6g/PXwsk8pLa7T9uwuzuZY6A6qV1U2Y=; b=HsTP/W0d3EiAj37njpsAH/FZSqlOKgUkpzIorJiWvCo08r1599Rx/QucNhGvsmwIzK 8gx/cphj3t6u029Ckd4p9sCPN/ooti6d5Qdn0FsQW1oIXbFJcJ2onPXbkpq91G95b/IP Fe0NqjkdY72tHk9VfQv+oaghWMi0YSBcCbO25kGQl3szYK8QR4x7haAuAKAWis4eb3cD Lh6oHiYa4tD4Yt0ouihSmOFYNFU/yZ61NFliu7FVWrgjdPvqhy47Cpj8Fa/P+yzyAtUH Fja8h1wFALr3dLKucjtK85h0z4HCqiDmQ8a2TKeS2kjSVddvnqWnFF1Tnx6mQ9cYX9vD tGhw== 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=ab5exaHl+2Vc6g/PXwsk8pLa7T9uwuzuZY6A6qV1U2Y=; b=Yv18HG6C/rsFPV1hDtxn1MsO0cAeJaDwMl0s5sjenuXN4//S0MfP6CggOzYs6XQmt8 uQ1T95a9YkuYZVnpoLd2ksUnG0/h6GDETnyzaHuHAJ/MN/1OID79YLnVxQxIK6laDe2e BuVdp/jBDWnNbce4VN88d7CANjxbQE+SOrxO7Lzo3g2tnQoz/yufJuolCoO+h4sgCdO5 0zrhrZqu4Cd8IZblkbYOoLQfUdVM7vZN2r1QMfXkY5YeKR+m/wUrM1AVvhTwzvi6enbV pW/djEJ3OHa7Q46WEs9z1lZtQxPjwLbIPcfvhfZwJ0+xmKXcvd5Jv9LQwBLycnJb8eLL 9E6Q== X-Gm-Message-State: APjAAAU44S5Gkxm7Th446cHkKoF4aJaGYsC83Nd2sN9uXW5hXjSxvZm3 f9Dryh4llx+LcxBf2MxCMtuoHffdyNxcMQ== X-Google-Smtp-Source: APXvYqz1BUeWtXRhrv29e5qHsEDE25A7EzY/dE1I+AffSgvToqORblun/baVjnsES6m3sFX3KSHe8Q== X-Received: by 2002:a17:902:8c94:: with SMTP id t20mr5632151plo.170.1579616011832; Tue, 21 Jan 2020 06:13:31 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:31 -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 v4 06/10] pie: improve comments and commenting style Date: Tue, 21 Jan 2020 19:42:45 +0530 Message-Id: <20200121141250.26989-7-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 54ba6c6a7514..65f0e8b2193a 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 + * @burst_time: burst time allowance + * @qdelay: current queue delay + * @qdelay_old: queue delay in previous qdelay calculation + * @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_overflow: number of times accu_prob overflows + */ struct pie_vars { psched_time_t burst_time; psched_time_t qdelay; psched_time_t qdelay_old; - 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 + * @maxq: maximum queue size + * @ecn_mark: packets marked with ECN + */ 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 packets_in; + u32 dropped; + u32 overlimit; + u32 maxq; + u32 ecn_mark; }; -/* 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 Tue Jan 21 14:12:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226592 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=Y9ld0Tgo; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829W65wXTz9sPJ for ; Wed, 22 Jan 2020 01:13:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729276AbgAUONh (ORCPT ); Tue, 21 Jan 2020 09:13:37 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:41480 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728904AbgAUONh (ORCPT ); Tue, 21 Jan 2020 09:13:37 -0500 Received: by mail-pl1-f194.google.com with SMTP id t14so1389247plr.8 for ; Tue, 21 Jan 2020 06:13:37 -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=fLMSzwn105nQG1k0Bcg5PrK+NSb62h11DDA8BpA28gE=; b=Y9ld0TgoGtzFYQ4NGnfF+GIRzSzEpoO4uEPZjupsz0woSF8ICj4k9RTSqXkVTr6n7+ Y8VEyNv+5yqfeN1IrNBVzIx3+qgAJVYD3BhLUPfiHVw10/2Hp7Oed188DGV/HdXNLiLz o9Mk2mNmbfqO+p8cPT3fTERVzPuUaHAnY3u3oXCe2z2jspJEyK6+AwDEQacSxcGCI8al l9nxrCNBkONC0du54+TDFwHjY79WiP85NlQD/vdBbvvmWrsesWI2+hBpLepzVQtw9bns rDJiqGAwxY8lsCxrIqkttzkkokPDEnVul3yNucPGrfr+RpXV8ilOH9bWKthkLt4CciVn R/sg== 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=fLMSzwn105nQG1k0Bcg5PrK+NSb62h11DDA8BpA28gE=; b=OCOAgOZDDJ2hwjdMQUlXpkp8F8URDDrELFFvoAMNzyh3opvKgUa9JaCLQmqBO1hKAD li/0rvPGZNGC84KXNzm/MZ8+c1r0784X2TB3zGlwheEQWEKfFTuL5vDOnr/CsePuBry8 njeXXi/PcFnNR32mRbT4O48xnDVgFsBBY5r3JGGp7eb/UiasyTJW+rG1NoXWhVMW91Cr IlBPAOWXyWhOCyiuI+35f8KlZ9lEpwQvelIgk/cy3/Mi/lAl10hl9sdqhlWKaqKrCe/s IOML2ALVzTsuLFz82D3X6rtFGlwZyMjy4o/NrqF5uLEYIzGLSBSgAeEKP7GCp+xWmPTu 21Ig== X-Gm-Message-State: APjAAAUfJU5ZkCQP1HwyaEWBHqg29ewaHX9i6YgVeQ8R1bM7NL06ka1T LXi5J8U0/8SQW0bhkjrEX0LFIEMy+u9rRw== X-Google-Smtp-Source: APXvYqyWPVK66MS6g6AxyIcwC+MDtKFXD6IoJ1TdadBT+h2EnHvEyB42+S97MQrS95BiAn8iah4FRQ== X-Received: by 2002:a17:90a:8a0c:: with SMTP id w12mr5557925pjn.61.1579616016622; Tue, 21 Jan 2020 06:13:36 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13: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 , Gautam Ramakrishnan Subject: [PATCH net-next v4 07/10] net: sched: pie: fix commenting Date: Tue, 21 Jan 2020 19:42:46 +0530 Message-Id: <20200121141250.26989-8-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 7197bcaa14ba..c0a4df01c0a0 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 Tue Jan 21 14:12:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226593 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=aY5niDcz; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829WD2DClz9sRG for ; Wed, 22 Jan 2020 01:13:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729281AbgAUONn (ORCPT ); Tue, 21 Jan 2020 09:13:43 -0500 Received: from mail-pj1-f66.google.com ([209.85.216.66]:38077 "EHLO mail-pj1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729008AbgAUONn (ORCPT ); Tue, 21 Jan 2020 09:13:43 -0500 Received: by mail-pj1-f66.google.com with SMTP id l35so1603823pje.3 for ; Tue, 21 Jan 2020 06:13:42 -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=MhdoGB2dOxgGgsYCpXJK63reh8b1AS0/NQxYWj0RslQ=; b=aY5niDczBO7Rs8eqBTPzES2LoZRRIIrtm/DM6JRTIZWYPv1QiaTu78pQ7Yfcj5nekQ r1L9DlU3w43blgY2HkyU+86sUSbkHPoBI66NDZo6HPpum3NvfzNeJfJkGFRSDXccBN0G xRjp1bqZf7nj0UcDOkSFlNrZdGBeLhW/tWrLAdUpHfuwyw9sjCZehxXqL+rFSNee7Vh+ oYL+i4QC65920CICYYcucHUx+/EiQJVHwh8Uv2SklAADaJeKXUKpiT4mFcJPxJBIWKme X5DqymJaGTMySHr12h3PS9TYmFTc21F55djvspAA2ygq/XGkpKmhlZWglEJhDxrNeuLq 8XEg== 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=MhdoGB2dOxgGgsYCpXJK63reh8b1AS0/NQxYWj0RslQ=; b=fmgLWNZmpo+ct0qLaJ49WDTXzOtfDixUJP+MW9cjj6JbbIYzKud+L/Qkxc8VsU1zfs Pu1ajGa7R0Wkz7od3dYhbdd2zWWH/KkyEAsJsJ7X36RLWm1/942knCTdgnvkVcY4dLpL +jksA/dIckCPYoV4ajAJfMMlFK4nq/ljLQpLGFSVPICvu1HDOlUjPIsyy1Q1XzvdtHQH +Qif+SFoTbp3aki5f5NLTFAXGDP2WXiSiolfoL1LkMnpwO3nlWEDDVh+9k895+p15vm1 WQpQx3bSt0izYyCtmYUp9DwHe9CDce5dga1O9JVZfNAIZMmu2z8rAVURMNk6e/38kccL GD2w== X-Gm-Message-State: APjAAAXE4XqPwS67jJEilHnGMpu6KmZ18S1SHyWUfr3CKpRWgU4q3+xw RmSPd9FJEWyrYBlTUuq+W6iDvQIzhuh8KA== X-Google-Smtp-Source: APXvYqw+2OQ+sZvjYumUPaYQwCXE8no2bbyyt52OXUUrSEYV1JKTWqsZ6SxPTK7IDq4YwH5r+CnRhg== X-Received: by 2002:a17:902:7d86:: with SMTP id a6mr5765573plm.212.1579616022005; Tue, 21 Jan 2020 06:13:42 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:41 -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 v4 08/10] net: sched: pie: fix alignment in struct instances Date: Tue, 21 Jan 2020 19:42:47 +0530 Message-Id: <20200121141250.26989-9-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 c0a4df01c0a0..637b0fcb1238 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 Tue Jan 21 14:12:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226594 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=MIKvIhqd; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829WL0xNcz9sRG for ; Wed, 22 Jan 2020 01:13:50 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729293AbgAUONt (ORCPT ); Tue, 21 Jan 2020 09:13:49 -0500 Received: from mail-pf1-f193.google.com ([209.85.210.193]:43184 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727508AbgAUONt (ORCPT ); Tue, 21 Jan 2020 09:13:49 -0500 Received: by mail-pf1-f193.google.com with SMTP id x6so1561179pfo.10 for ; Tue, 21 Jan 2020 06:13:48 -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=bdm+4BSIcf8bgfwJebtu/elHs9NZAQK9LdWCsO2OdCI=; b=MIKvIhqda1QhkU1xKqo7Nl/6xOfd6URhhY0XVWVt3QpE8AyRu/u2ih7JuKLR9bd1cC YjqT8HERJhFQVMz33x/nAoArfqkO4NrD9/76VdQx1sDHwlKyyg5qS2mQnGr0eyisozBX VlH2otTR4W7CeEeBHpWT0zwJTYPiYmTX95/EDiqTLEVzDnw8FvaLFhLYN5pDGupTGrKF /LAzUjqfmo/Qa8avvgXVpWsukVNv9QM5wC+2YUFCmaYiX18qvpP0JdRVosif65hIc0mp LR8/gPgUhbKMv8KQk24Zy7QRtIJpqtbNyQE059Bq0pEEltz5S6bH2OCZNbOrVpFPZuxn XuPw== 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=bdm+4BSIcf8bgfwJebtu/elHs9NZAQK9LdWCsO2OdCI=; b=q0TDYShunMV0UO3WD5mrgaAcQkJEzSkCUvoFa2ZDs92t3SsdCd2UE4YLJrzuseRB1G itHkHigtjo8YC1c/WYFbe83SNH78MbV8F8XQ3Q7rFryR7f9unZ8btDKAdfiDjrZwLO24 8w9CRTSSRD0fAa5nJXwKzR+rvF42oHJN5/cj5TtrbUyfnKRXQNcKRXgY0piKexfA4oh2 8GnlcoPoYfp552CQWXlIQYP6NtxDMSqJIDTJ9UtXbq5s/MrIUHCpD/PitNswvUjfQ6UA 1POXC/g+QArxpU8R+VUVzGqxigOua8S/eeepu8f3kSaNZYBD+l8Ch9pGc4bkGOhRb4ym OJPQ== X-Gm-Message-State: APjAAAVHelus7m87XYBfOeLMAs7DNebvfGeuAwN0jhBGtVHje1D+8Lvs 2PK9sibLgw8rzT7FT6aq4qNPcZ18ns9nJA== X-Google-Smtp-Source: APXvYqy2Fj1wyaYqHeQpi8W+uIqjvF3cF3B/fksfGddyzQYoivJI7C/GOx1sQPRVM1a3G+m9MyQ3+A== X-Received: by 2002:a62:296:: with SMTP id 144mr4804237pfc.120.1579616027186; Tue, 21 Jan 2020 06:13:47 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:46 -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 v4 09/10] net: sched: pie: export symbols to be reused by FQ-PIE Date: Tue, 21 Jan 2020 19:42:48 +0530 Message-Id: <20200121141250.26989-10-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 65f0e8b2193a..824b6684eeb4 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 637b0fcb1238..258f9c08be21 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 Tue Jan 21 14:12:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gautam Ramakrishnan X-Patchwork-Id: 1226595 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=GCyH3FS+; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4829WS3Xb0z9sRQ for ; Wed, 22 Jan 2020 01:13:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729327AbgAUONz (ORCPT ); Tue, 21 Jan 2020 09:13:55 -0500 Received: from mail-pj1-f67.google.com ([209.85.216.67]:35758 "EHLO mail-pj1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729304AbgAUONz (ORCPT ); Tue, 21 Jan 2020 09:13:55 -0500 Received: by mail-pj1-f67.google.com with SMTP id s7so1612956pjc.0 for ; Tue, 21 Jan 2020 06:13:54 -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=/rhmdh0yPZrvT6FbuTHnGrbia1zPmgNlu99MuGZYSeg=; b=GCyH3FS+H7xv9j21WzFpbER3DbZcsjgHpcvD2valmgw7z4y+R87fBi7C9YPkoax5PO YRDF6LokB6uKiDe/sTue4fugeqNAdt5SsMEo9K9oHlNlI9kSKvH9rJEwIaoxUlyxe/w1 aE3jMpdngA29Tm4A2Qr9RyibZ7Sxj0LS2RU2QmKaV9BdNbSFHegDE7tSH2x42TNQfgea cbFOiullI+2RD/Qh0xRXpK/E4O4b44dREHiU2pnaAUaLKgpp38aaYk76K2ShxQVVys8C LAhdpIQj1JYdx9ozu01piIvFMqQcBxG1qmMKf4xaJ5kJlznn3p8YAh3xh85AgYEW0Y5X qE5w== 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=/rhmdh0yPZrvT6FbuTHnGrbia1zPmgNlu99MuGZYSeg=; b=UAy/eIFBJDIYlW5PFc9EQ8gAj7PsOGDm5XOyIEgT4iROhajybI/aUHaax5KX+uHdve gzPBQckK22vnKDCYKVIR7zYoCt0Lt2aRKHMxcY6BegMNhmhWD8QZkiiBF243Bv/gwQQK 7Yth8AzTy84fHBlN8JtUSFiPXE8m7ujl9eJlqZl004zetbFIXLe9HOq3ov0RJEMUWOUz iGjqA3X8wHY/l4Z1VHVJzZi29uOfpWp8jM3yHfeFKLX5s5Jh+Bb+Qv6D/sArIokn03jp EKaoDBJaDuRZCTxLkQfuAlNuZ9w31fUxJ1YLL4PbldSYL717FShyytm7GlgFWZHA8S93 EYQQ== X-Gm-Message-State: APjAAAXeHZGJmHH/imPEgIQAC7EeAKBp/10ElP7M5lbbTyhtsFja8KuL y/gHsE1MtUBzqTUStGla9Seh+KTxKMDXNQ== X-Google-Smtp-Source: APXvYqy+HV/EFaeqolKfEnAHmnnLr0vwlH51ygQf5aLMgb+EK6M5xo+wEAOEFumdYaulz604kmsX3Q== X-Received: by 2002:a17:902:7613:: with SMTP id k19mr5838535pll.7.1579616033659; Tue, 21 Jan 2020 06:13:53 -0800 (PST) Received: from localhost.localdomain ([223.186.212.224]) by smtp.gmail.com with ESMTPSA id y203sm44836443pfb.65.2020.01.21.06.13.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Jan 2020 06:13:53 -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 v4 10/10] net: sched: add Flow Queue PIE packet scheduler Date: Tue, 21 Jan 2020 19:42:49 +0530 Message-Id: <20200121141250.26989-11-gautamramk@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200121141250.26989-1-gautamramk@gmail.com> References: <20200121141250.26989-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 | 559 +++++++++++++++++++++++++++++++++ 5 files changed, 606 insertions(+) create mode 100644 net/sched/sch_fq_pie.c diff --git a/include/net/pie.h b/include/net/pie.h index 824b6684eeb4..a28a0cf3e517 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..f2441b7a33f2 --- /dev/null +++ b/net/sched/sch_fq_pie.c @@ -0,0 +1,559 @@ +// 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 + * @head: first packet in the flow + * @tail: last packet in the flow + * @flowchain: flowchain for the 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 + */ +struct fq_pie_flow { + struct sk_buff *head; + struct sk_buff *tail; + struct list_head flowchain; + struct pie_vars vars; + s32 deficit; + u32 backlog; + u32 qlen; +}; + +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 pie_params p_params; + struct pie_stats stats; + struct list_head old_flows; + struct list_head new_flows; + struct timer_list adapt_timer; + u32 ecn_prob; + u32 flows_cnt; + u32 quantum; + u32 memory_limit; + u32 new_flow_count; + u32 memory_usage; + u32 overmemory; +}; + +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++; + __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); + + 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");