From patchwork Mon Jun 20 15:26:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dima Chumak X-Patchwork-Id: 12887765 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10BAAC433EF for ; Mon, 20 Jun 2022 15:27:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241614AbiFTP1h (ORCPT ); Mon, 20 Jun 2022 11:27:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57958 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234611AbiFTP1f (ORCPT ); Mon, 20 Jun 2022 11:27:35 -0400 Received: from NAM11-CO1-obe.outbound.protection.outlook.com (mail-co1nam11on2068.outbound.protection.outlook.com [40.107.220.68]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 24F49CD for ; Mon, 20 Jun 2022 08:27:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Y7Ca/bjdFdRWwrpdk3OlnQ3TTQMIqqTobrWj6UcXY4LNkkXAihJh98aj5znJ8s9rjYTpQvC7p/0jq9fqbb0lan3YVVTY2r0DprLOvYiMjXVC9vr2gOyLRahrUh5EwHKKORYEjGgvpZS/zDmfvoy6PkoW+gz73o79h21OvY9aYSP1LK0guiiQXmCak0rItcRR4aLS5UXk+SZovWBJz5jiNF4+eEw5rgkcDzNavIbRayOl0gAvIHa0/9PDczW+Z+cJwNPGAtSuPa5QyBhN39efwH6C7iAmemNjPZa1+PwwbJIIV1YVEqnmZ0Mmf02o8ErsuqLyy2BVjLoM/ZZIGs+3RA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=uhr5kYS54HvYUqUu7g2ruMA2nxBQjWC3dBq0Be8nQVg=; b=ly20smVMH3AQIUYupeUUXDk8rovbAixOMr6YYhNhrt4XSCb12wd41Kx9bAd15FLhQcy2Pa7mPCNoCScQysc4MiXOe0ENGms7scNT8Z+ZOOkPir/DSUoPTO9jyMOhPyLXd1OqYEnW6tK6qangHSN5RSLDG8l8bGZiqwcqZSHY23uRTCQE5Xp6jeFU4o1GpVHKTSTXNEeINlyrQXuLaWwxpaPapvGMQl6ENiFqIga3nm4T5pDnTQhDECYJO+u7W6dNo3F8iDUbM+yesyd09MOAW9I74VeJ33nZ/jUhkzovCJdiIMlq63PBHfRv6t7TRb07w0Nyd74vYy0ehNrOHFPH2g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.236) smtp.rcpttodomain=redhat.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uhr5kYS54HvYUqUu7g2ruMA2nxBQjWC3dBq0Be8nQVg=; b=mFaQsKMpotPurIAGfY1LR8dcbJKsPeyG4+jb0moBWPBsIBbpftosnu4ryhUb2W3dpRPvhboQelEtMQXt0Qiof05LV41il2TYVSTKbnUsxtf/YBBeYaO0uifO2v5VYNACLLfvlCiUxPAF01rKcTlHYdDmXbaGct/tP/yXpgpTrFro03+2CTAGanlbUJX69wh98mwMXeRFXc5dnJhLVn4pqRTeUsx/ZTaDJKSBtbnBb4EjeOF1Q9R+2b841pyEn61ViTdUDcJLmsXsuJJUe6d1uv3hjnEpAwo8wyeJ+nCWcDe6gtVKv8FSs1dFQomiqA+e4J7jQoCeB91sfKg7EMmlEQ== Received: from BN6PR16CA0047.namprd16.prod.outlook.com (2603:10b6:405:14::33) by PH7PR12MB6561.namprd12.prod.outlook.com (2603:10b6:510:213::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.15; Mon, 20 Jun 2022 15:27:32 +0000 Received: from BN8NAM11FT015.eop-nam11.prod.protection.outlook.com (2603:10b6:405:14:cafe::a3) by BN6PR16CA0047.outlook.office365.com (2603:10b6:405:14::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.22 via Frontend Transport; Mon, 20 Jun 2022 15:27:32 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.236) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.236 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.236; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (12.22.5.236) by BN8NAM11FT015.mail.protection.outlook.com (10.13.176.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5353.14 via Frontend Transport; Mon, 20 Jun 2022 15:27:31 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by DRHQMAIL109.nvidia.com (10.27.9.19) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Mon, 20 Jun 2022 15:27:31 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Mon, 20 Jun 2022 08:27:30 -0700 Received: from vdi.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.22 via Frontend Transport; Mon, 20 Jun 2022 08:27:28 -0700 From: Dima Chumak To: Jakub Kicinski CC: Jiri Pirko , "David S. Miller" , Eric Dumazet , Paolo Abeni , , Dima Chumak Subject: [PATCH net-next 1/5] devlink: Introduce limit_type attr for rate objects Date: Mon, 20 Jun 2022 18:26:43 +0300 Message-ID: <20220620152647.2498927-2-dchumak@nvidia.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220620152647.2498927-1-dchumak@nvidia.com> References: <20220620152647.2498927-1-dchumak@nvidia.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 396bdf91-843d-4072-891c-08da52d164e5 X-MS-TrafficTypeDiagnostic: PH7PR12MB6561:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: c6OJ/xhVLfPR9P1ke8kT9RvhZUY7JKzIis32/zGPPpk9XPI5FnKTsOGTFuW8sseengmqYdM66KEd3N4Gp7pGH3K4reeZXVoSmQdUsNeeyHXN5/ocl5tUAo+t1HSr1I0anKdRKLX6CqSYLxLwFnFh7LIA8ImOSnS0ac5hBPVAkkw6aHPMsxkvELIcaDe2kNLXvwXaJG9uADUD3EQd8F50cev2jb2fBZNfZqMN1qcscztrkS9Yyk3L35eUDNZ4+QJOl2kNAcV2x8upSUFp20BJPVD/QAz9GadBOt0DScfODySVnZeVjevQCUZndm8UBOD1jq4gPtHCggZuk+Lmfu6whR3+gREtC6k4+kD/DPOYi3Eo4N4EkLAPukEEmE2Aem5h4zWYIfes7oWNO9XMNreo10nx0ws6RsCvYGsS1n86XnJymcaXnUwn/50siZObIyuBRFBlUl1p6lFmtiX0tFYqMfDtRrd6yDGqXKthLmBhR1tCj1qjL6mZnV/GbPKqh0sjXVAuXRf4kL7srUd1rikUrgqq/jevkdbw/PQJDQe5UbxG+kW5AmqDtD4H2qzx3cvKEgY3AgMX4pnVqR4Dom+wjIk2Imza8wYduhghQHFJuHFGtbE3S5CsGu0xQb56/4P5q/uA0c94zdp27+c/s2/6rcbPbtqZkqkRnB0ViKwDoT6a6arWa3f1TPsLQI86mu1NS8kyZLM1BPQf5oVXkylT/heBa4K2CRxWdhO29baax+Briw1/liM00Y8pYJDaI2UK X-Forefront-Antispam-Report: CIP:12.22.5.236;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230016)(4636009)(396003)(376002)(39860400002)(346002)(136003)(46966006)(40470700004)(36840700001)(40460700003)(8676002)(4326008)(36860700001)(36756003)(336012)(7696005)(107886003)(47076005)(6666004)(70206006)(81166007)(26005)(40480700001)(1076003)(70586007)(54906003)(86362001)(83380400001)(2906002)(478600001)(356005)(41300700001)(426003)(8936002)(5660300002)(316002)(2616005)(82740400003)(186003)(30864003)(6916009)(82310400005)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2022 15:27:31.8097 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 396bdf91-843d-4072-891c-08da52d164e5 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[12.22.5.236];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT015.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB6561 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Lay foundation to support different kinds of rate limiting that may be performed by rate objects. Existing rate limiting type is dubbed as 'shaping' and it is assumed by default when limit_type attribute isn't set explicitly. Following patch in the series will introduce new limit type 'police'. Leaf rate objects inherit their limit_type from a parent node object if it hasn't been explicitly set for the leaf object. Signed-off-by: Dima Chumak --- .../net/ethernet/mellanox/mlx5/core/esw/qos.c | 28 +++- include/net/devlink.h | 12 +- include/uapi/linux/devlink.h | 7 + net/core/devlink.c | 123 ++++++++++++++---- 4 files changed, 140 insertions(+), 30 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c index 694c54066955..50bd4536fab1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c @@ -874,8 +874,8 @@ int mlx5_esw_devlink_rate_node_tx_max_set(struct devlink_rate *rate_node, void * int mlx5_esw_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv, struct netlink_ext_ack *extack) { - struct mlx5_esw_rate_group *group; struct mlx5_eswitch *esw; + void *group; int err = 0; esw = mlx5_devlink_eswitch_get(rate_node->devlink); @@ -890,7 +890,17 @@ int mlx5_esw_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv, goto unlock; } - group = esw_qos_create_rate_group(esw, extack); + switch (rate_node->limit_type) { + case DEVLINK_RATE_LIMIT_TYPE_UNSET: + group = ERR_PTR(-EINVAL); + break; + case DEVLINK_RATE_LIMIT_TYPE_SHAPING: + group = esw_qos_create_rate_group(esw, extack); + break; + default: + group = ERR_PTR(-EOPNOTSUPP); + } + if (IS_ERR(group)) { err = PTR_ERR(group); goto unlock; @@ -905,7 +915,6 @@ int mlx5_esw_devlink_rate_node_new(struct devlink_rate *rate_node, void **priv, int mlx5_esw_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv, struct netlink_ext_ack *extack) { - struct mlx5_esw_rate_group *group = priv; struct mlx5_eswitch *esw; int err; @@ -914,7 +923,18 @@ int mlx5_esw_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv, return PTR_ERR(esw); mutex_lock(&esw->state_lock); - err = esw_qos_destroy_rate_group(esw, group, extack); + + switch (rate_node->limit_type) { + case DEVLINK_RATE_LIMIT_TYPE_UNSET: + err = -EINVAL; + break; + case DEVLINK_RATE_LIMIT_TYPE_SHAPING: + err = esw_qos_destroy_rate_group(esw, priv, extack); + break; + default: + err = -EOPNOTSUPP; + } + mutex_unlock(&esw->state_lock); return err; } diff --git a/include/net/devlink.h b/include/net/devlink.h index 2a2a2a0c93f7..4fe8e657da44 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -98,13 +98,21 @@ struct devlink_port_attrs { }; }; +struct devlink_rate_shaping_attrs { + u64 tx_max; + u64 tx_share; +}; + struct devlink_rate { struct list_head list; + enum devlink_rate_limit_type limit_type; enum devlink_rate_type type; struct devlink *devlink; void *priv; - u64 tx_share; - u64 tx_max; + + union { /* on limit_type */ + struct devlink_rate_shaping_attrs shaping_attrs; + }; struct devlink_rate *parent; union { diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index b3d40a5d72ff..53aad0d09231 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -221,6 +221,11 @@ enum devlink_rate_type { DEVLINK_RATE_TYPE_NODE, }; +enum devlink_rate_limit_type { + DEVLINK_RATE_LIMIT_TYPE_UNSET, + DEVLINK_RATE_LIMIT_TYPE_SHAPING, +}; + enum devlink_param_cmode { DEVLINK_PARAM_CMODE_RUNTIME, DEVLINK_PARAM_CMODE_DRIVERINIT, @@ -576,6 +581,8 @@ enum devlink_attr { DEVLINK_ATTR_LINECARD_TYPE, /* string */ DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES, /* nested */ + DEVLINK_ATTR_RATE_LIMIT_TYPE, /* u16 */ + /* add new attributes above here, update the policy in devlink.c */ __DEVLINK_ATTR_MAX, diff --git a/net/core/devlink.c b/net/core/devlink.c index db61f3a341cb..756d95c72b4d 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -354,6 +354,18 @@ devlink_rate_is_node(struct devlink_rate *devlink_rate) return devlink_rate->type == DEVLINK_RATE_TYPE_NODE; } +static inline bool +devlink_rate_is_unset(struct devlink_rate *devlink_rate) +{ + return devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_UNSET; +} + +static inline bool +devlink_rate_is_shaping(struct devlink_rate *devlink_rate) +{ + return devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_SHAPING; +} + static struct devlink_rate * devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info) { @@ -1093,13 +1105,27 @@ static int devlink_nl_rate_fill(struct sk_buff *msg, goto nla_put_failure; } - if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_SHARE, - devlink_rate->tx_share, DEVLINK_ATTR_PAD)) + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_LIMIT_TYPE, + devlink_rate->limit_type, DEVLINK_ATTR_PAD)) goto nla_put_failure; - if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_MAX, - devlink_rate->tx_max, DEVLINK_ATTR_PAD)) - goto nla_put_failure; + if (devlink_rate_is_unset(devlink_rate)) { + /* For backward compatibility with older user-space clients that + * don't understatnd DEVLINK_ATTR_RATE_LIMIT_TYPE, report tx_max + * and tx_share as being "unlimited". + */ + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_MAX, 0, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_SHARE, 0, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + } else if (devlink_rate_is_shaping(devlink_rate)) { + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_MAX, + devlink_rate->shaping_attrs.tx_max, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_SHARE, + devlink_rate->shaping_attrs.tx_share, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + } if (devlink_rate->parent) if (nla_put_string(msg, DEVLINK_ATTR_RATE_PARENT_NODE_NAME, @@ -1850,6 +1876,12 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate, return -EEXIST; } + if (parent->limit_type != devlink_rate->limit_type) { + NL_SET_ERR_MSG_MOD(info->extack, + "Parent and object should be of the same limit_type"); + return -EINVAL; + } + if (devlink_rate_is_leaf(devlink_rate)) err = ops->rate_leaf_parent_set(devlink_rate, parent, devlink_rate->priv, parent->priv, @@ -1873,44 +1905,82 @@ static int devlink_nl_rate_set(struct devlink_rate *devlink_rate, struct genl_info *info) { struct nlattr *nla_parent, **attrs = info->attrs; - int err = -EOPNOTSUPP; - u64 rate; + struct devlink_rate *parent; + int err = 0; + u16 new_limit_type; + u64 new_val; + + nla_parent = attrs[DEVLINK_ATTR_RATE_PARENT_NODE_NAME]; + + if (attrs[DEVLINK_ATTR_RATE_LIMIT_TYPE]) { + new_limit_type = nla_get_u16(attrs[DEVLINK_ATTR_RATE_LIMIT_TYPE]); + if (devlink_rate_is_unset(devlink_rate)) + devlink_rate->limit_type = new_limit_type; + if (devlink_rate->limit_type != new_limit_type) { + if (devlink_rate_is_node(devlink_rate)) { + NL_SET_ERR_MSG_MOD(info->extack, + "Cannot change limit_type of the rate node object, delete and add a new one instead."); + return -EINVAL; + } + NL_SET_ERR_MSG_MOD(info->extack, + "Cannot change limit_type of the rate leaf object, reset current rate attributes first."); + return -EBUSY; + } + } + + if (devlink_rate_is_unset(devlink_rate)) { + if (nla_parent) { + parent = devlink_rate_node_get_by_name(devlink_rate->devlink, + nla_data(nla_parent)); + if (!IS_ERR(parent)) + devlink_rate->limit_type = parent->limit_type; + else + devlink_rate->limit_type = DEVLINK_RATE_LIMIT_TYPE_SHAPING; + } else { + devlink_rate->limit_type = DEVLINK_RATE_LIMIT_TYPE_SHAPING; + } + } + + if (attrs[DEVLINK_ATTR_RATE_TX_SHARE] && devlink_rate_is_shaping(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]); - if (attrs[DEVLINK_ATTR_RATE_TX_SHARE]) { - rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_SHARE]); if (devlink_rate_is_leaf(devlink_rate)) err = ops->rate_leaf_tx_share_set(devlink_rate, devlink_rate->priv, - rate, info->extack); + new_val, info->extack); else if (devlink_rate_is_node(devlink_rate)) err = ops->rate_node_tx_share_set(devlink_rate, devlink_rate->priv, - rate, info->extack); + new_val, info->extack); if (err) return err; - devlink_rate->tx_share = rate; + devlink_rate->shaping_attrs.tx_share = new_val; } if (attrs[DEVLINK_ATTR_RATE_TX_MAX]) { - rate = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]); + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_MAX]); + if (devlink_rate_is_leaf(devlink_rate)) err = ops->rate_leaf_tx_max_set(devlink_rate, devlink_rate->priv, - rate, info->extack); + new_val, info->extack); else if (devlink_rate_is_node(devlink_rate)) err = ops->rate_node_tx_max_set(devlink_rate, devlink_rate->priv, - rate, info->extack); + new_val, info->extack); if (err) return err; - devlink_rate->tx_max = rate; + devlink_rate->shaping_attrs.tx_max = new_val; } - nla_parent = attrs[DEVLINK_ATTR_RATE_PARENT_NODE_NAME]; - if (nla_parent) { - err = devlink_nl_rate_parent_node_set(devlink_rate, info, - nla_parent); - if (err) - return err; - } + if (nla_parent) + err = devlink_nl_rate_parent_node_set(devlink_rate, info, nla_parent); - return 0; + /* reset limit_type when all attrs have been cleared, relevant only for + * leaf objects as node objects get deleted altogether + */ + if (devlink_rate_is_leaf(devlink_rate) && !devlink_rate->parent && + ((devlink_rate_is_shaping(devlink_rate) && + !devlink_rate->shaping_attrs.tx_max && !devlink_rate->shaping_attrs.tx_share))) + devlink_rate->limit_type = DEVLINK_RATE_LIMIT_TYPE_UNSET; + + return err; } static bool devlink_rate_set_ops_supported(const struct devlink_ops *ops, @@ -2002,6 +2072,10 @@ static int devlink_nl_cmd_rate_new_doit(struct sk_buff *skb, rate_node->devlink = devlink; rate_node->type = DEVLINK_RATE_TYPE_NODE; + if (info->attrs[DEVLINK_ATTR_RATE_LIMIT_TYPE]) + rate_node->limit_type = nla_get_u16(info->attrs[DEVLINK_ATTR_RATE_LIMIT_TYPE]); + if (rate_node->limit_type == DEVLINK_RATE_LIMIT_TYPE_UNSET) + rate_node->limit_type = DEVLINK_RATE_LIMIT_TYPE_SHAPING; rate_node->name = nla_strdup(info->attrs[DEVLINK_ATTR_RATE_NODE_NAME], GFP_KERNEL); if (!rate_node->name) { err = -ENOMEM; @@ -9000,6 +9074,7 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_RATE_PARENT_NODE_NAME] = { .type = NLA_NUL_STRING }, [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32 }, [DEVLINK_ATTR_LINECARD_TYPE] = { .type = NLA_NUL_STRING }, + [DEVLINK_ATTR_RATE_LIMIT_TYPE] = { .type = NLA_U16 }, }; static const struct genl_small_ops devlink_nl_ops[] = { From patchwork Mon Jun 20 15:26:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dima Chumak X-Patchwork-Id: 12887766 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71601CCA480 for ; Mon, 20 Jun 2022 15:27:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243391AbiFTP1r (ORCPT ); Mon, 20 Jun 2022 11:27:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231253AbiFTP1i (ORCPT ); Mon, 20 Jun 2022 11:27:38 -0400 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2071.outbound.protection.outlook.com [40.107.236.71]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1B210CD for ; Mon, 20 Jun 2022 08:27:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Jpuw49YJ3ScMZlyo3FI9/W/55ZrWOMekkvmVmIpNmYNSvTqJhPEhzcZhVDG2XZGntSzVVva8yNm7+OR0+4WyzCO7OiOO1OeYWIQHMxe9l1rh4Lu81BCr1NkP5DYmXnH7LBeHEL8qeXwXiyr9NTndz+1SuOZmAFVUqdf8qRmJsoWS8gPFn4WvN/Q3f689FTYiKXtlDyEKqGvupZvZwTe+UxVTTQLcXrZ6Jzr4yzFmVDyHtVhvG9R1ebz4aLENZ0zdmPelAKDTKvM4SPH5Wmi3HN3rrO9Y639m79QPNLimXcliZtU+ybtf8f4KP4vmE6JyVjGp9A2jWsMQm1tt5lvJtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=MxaMopFfJn+PW9v0NtqQrUp08dvJqPtzc91D3SpGAxs=; b=RYJM39d/zQkDF4DNrkLagrpzF+1oERRV2/t/4dpeB0tSHnY2iy192mfvyD4jvma0SUQw47qPJ4RAnSXcMF9nspr7gDPh7yT0NWHaPnIdg91XosCt96hr/nwYGbildTxZ4i3/9sgHtMazWO9DindaxGG5tApsBJ/9aoEpEPL/+UCoELZpg2ipc2diA+0e2IPfroOXESU4HIjAcXC5g9H3NxJlZFKQs8PlwFMYCVv6FnxlMQRzIvJctlffzaaDi5JZPsPZql9v6gEKMbp2xvKD0Hmms2tVCr8ap1FBeovO3YmTbhQHk7gVV1dmXcNiCqYfakDg1NT6wQ5r3wIBGeM75Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.235) smtp.rcpttodomain=redhat.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MxaMopFfJn+PW9v0NtqQrUp08dvJqPtzc91D3SpGAxs=; b=bAxeImz2JorPV1Uam8Y6JY8aDR3mkI4PhVRXl1i7m0c8hEJnpnr3Wdk/sjRb6YJWzz6IRqZUpCmq9BjQKvr++e5+3sIcds4+ijOwnyZH+FluQ5QzK7yRGZQ9JgsTqoHy64YMEHVViGltA3pvwwnqoiTuZZpWs3pUSmPgMn3G0HFIxUXDH9YyXanuc9cogGJWO1LxRJoe5mQH/SiATPWv1Lo65ygqtpCWJNGvGE6rbz6F5LQf1pNKCnxTjWWpjFM46k87Tbse36sND6Lm8A2VjESyOF/q+4J7fhHDj7XMZ0/KxGDLQK5jThfbgpCegpHeEF45zUBxgf0KtU/ZQ8PVnw== Received: from MWHPR1701CA0005.namprd17.prod.outlook.com (2603:10b6:301:14::15) by SN1PR12MB2382.namprd12.prod.outlook.com (2603:10b6:802:2e::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.19; Mon, 20 Jun 2022 15:27:34 +0000 Received: from CO1NAM11FT022.eop-nam11.prod.protection.outlook.com (2603:10b6:301:14:cafe::31) by MWHPR1701CA0005.outlook.office365.com (2603:10b6:301:14::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.22 via Frontend Transport; Mon, 20 Jun 2022 15:27:34 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.235) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.235 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.235; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (12.22.5.235) by CO1NAM11FT022.mail.protection.outlook.com (10.13.175.199) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5353.14 via Frontend Transport; Mon, 20 Jun 2022 15:27:33 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by DRHQMAIL107.nvidia.com (10.27.9.16) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Mon, 20 Jun 2022 15:27:33 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Mon, 20 Jun 2022 08:27:32 -0700 Received: from vdi.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.22 via Frontend Transport; Mon, 20 Jun 2022 08:27:31 -0700 From: Dima Chumak To: Jakub Kicinski CC: Jiri Pirko , "David S. Miller" , Eric Dumazet , Paolo Abeni , , Dima Chumak Subject: [PATCH net-next 2/5] devlink: Introduce police rate limit type Date: Mon, 20 Jun 2022 18:26:44 +0300 Message-ID: <20220620152647.2498927-3-dchumak@nvidia.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220620152647.2498927-1-dchumak@nvidia.com> References: <20220620152647.2498927-1-dchumak@nvidia.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0c17e0e5-8348-4e81-d429-08da52d165f9 X-MS-TrafficTypeDiagnostic: SN1PR12MB2382:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DpSLOopqLMNT+A7itlUhYy1VUofaHFAyQdJIl8va36loHZpcOY4ZOOwCrkpGRpnQbh1YZFY2gO1Mdw0OYG3zu2L9z6h0CqZVtOCYWALf38gYVAlPQclTkRhdJmHDEhDhwMfeEgRQPASPcUqSoXJprQ72sUnNH31iFYuW6s24tQpr5/IIwPrVx4Hws4u9g8OuHlJ+LiGy5NwL71i5AFH3acqcXRH/3D3qQNNtsLgPX/xvdduU5T7vCThrhbQDC7mmfXQOfjCxyvAss/KxN9YcpZH4UBBVCVt9TwjsqRM8UhlLFm7gVbvAByqHJt4x0H/e/H1VstmixXqc4HzkXqdg0plfDKLgTdpopNeaeCZsh+7JynnJyRUbr5XkgWBn8kT4fR8eqtL2Gi5jwGGSSk+fD4tW+ixLUvCcIidMJwqCdO06la5Kr0LB0CnSY0XAbrDPfcHePdboehvVdGKzUAEAWu1IN/FVoTaLRGMxXZLni6R86iElDzC898law6ten90aE6z73VcrT4B6ydayYZT7b+EEChzJlmeFJsjovAk7R8xuRPUllI34bJH1WxgbWEVB6yFlaHpt03r5YCuoDeGpgmvlLw+xGMvJXebvCiyectBmF+1sr5LJlTORzqqXjzRfveV47sc5JMk+LUXmGFNDofTdLXyldntCV6gUaX5oCXmB2cf4YfCw6paOaGGt1jaV295A4dA525gK1uwqkhr+Pg== X-Forefront-Antispam-Report: CIP:12.22.5.235;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230016)(4636009)(46966006)(36840700001)(40470700004)(54906003)(26005)(316002)(6916009)(36756003)(498600001)(82310400005)(4326008)(70206006)(70586007)(6666004)(107886003)(1076003)(2616005)(83380400001)(186003)(8936002)(47076005)(426003)(336012)(356005)(36860700001)(2906002)(81166007)(86362001)(8676002)(7696005)(5660300002)(40460700003)(30864003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2022 15:27:33.7454 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0c17e0e5-8348-4e81-d429-08da52d165f9 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[12.22.5.235];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT022.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB2382 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Define a new DEVLINK_RATE_LIMIT_TYPE_POLICE along with the related devlink_rate object attributes and their devlink_ops. The new attributes are optional and specific to 'limit_type police' only. Driver implementations are allowed to support any or none of them. Example of limiting inbound traffic with the new limit type: $ devlink port function rate set netdevsim/netdevsim10/1 \ limit_type police rx_max 10mbit rx_burst 1mb Signed-off-by: Dima Chumak --- include/net/devlink.h | 40 +++++++ include/uapi/linux/devlink.h | 8 ++ net/core/devlink.c | 223 ++++++++++++++++++++++++++++++++++- 3 files changed, 268 insertions(+), 3 deletions(-) diff --git a/include/net/devlink.h b/include/net/devlink.h index 4fe8e657da44..3de1cc42b10c 100644 --- a/include/net/devlink.h +++ b/include/net/devlink.h @@ -103,6 +103,17 @@ struct devlink_rate_shaping_attrs { u64 tx_share; }; +struct devlink_rate_police_attrs { + u64 tx_max; + u64 tx_burst; + u64 rx_max; + u64 rx_burst; + u64 tx_pkts; + u64 tx_pkts_burst; + u64 rx_pkts; + u64 rx_pkts_burst; +}; + struct devlink_rate { struct list_head list; enum devlink_rate_limit_type limit_type; @@ -112,6 +123,7 @@ struct devlink_rate { union { /* on limit_type */ struct devlink_rate_shaping_attrs shaping_attrs; + struct devlink_rate_police_attrs police_attrs; }; struct devlink_rate *parent; @@ -1501,10 +1513,38 @@ struct devlink_ops { u64 tx_share, struct netlink_ext_ack *extack); int (*rate_leaf_tx_max_set)(struct devlink_rate *devlink_rate, void *priv, u64 tx_max, struct netlink_ext_ack *extack); + int (*rate_leaf_tx_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 tx_burst, struct netlink_ext_ack *extack); + int (*rate_leaf_rx_max_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_max, struct netlink_ext_ack *extack); + int (*rate_leaf_rx_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_burst, struct netlink_ext_ack *extack); + int (*rate_leaf_tx_pkts_set)(struct devlink_rate *devlink_rate, void *priv, + u64 tx_pkts, struct netlink_ext_ack *extack); + int (*rate_leaf_tx_pkts_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 tx_pkts_burst, struct netlink_ext_ack *extack); + int (*rate_leaf_rx_pkts_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_pkts, struct netlink_ext_ack *extack); + int (*rate_leaf_rx_pkts_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_pkts_burst, struct netlink_ext_ack *extack); int (*rate_node_tx_share_set)(struct devlink_rate *devlink_rate, void *priv, u64 tx_share, struct netlink_ext_ack *extack); int (*rate_node_tx_max_set)(struct devlink_rate *devlink_rate, void *priv, u64 tx_max, struct netlink_ext_ack *extack); + int (*rate_node_tx_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 tx_burst, struct netlink_ext_ack *extack); + int (*rate_node_rx_max_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_max, struct netlink_ext_ack *extack); + int (*rate_node_rx_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_burst, struct netlink_ext_ack *extack); + int (*rate_node_tx_pkts_set)(struct devlink_rate *devlink_rate, void *priv, + u64 tx_pkts, struct netlink_ext_ack *extack); + int (*rate_node_tx_pkts_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 tx_pkts_burst, struct netlink_ext_ack *extack); + int (*rate_node_rx_pkts_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_pkts, struct netlink_ext_ack *extack); + int (*rate_node_rx_pkts_burst_set)(struct devlink_rate *devlink_rate, void *priv, + u64 rx_pkts_burst, struct netlink_ext_ack *extack); int (*rate_node_new)(struct devlink_rate *rate_node, void **priv, struct netlink_ext_ack *extack); int (*rate_node_del)(struct devlink_rate *rate_node, void *priv, diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h index 53aad0d09231..4903f7b6dc93 100644 --- a/include/uapi/linux/devlink.h +++ b/include/uapi/linux/devlink.h @@ -224,6 +224,7 @@ enum devlink_rate_type { enum devlink_rate_limit_type { DEVLINK_RATE_LIMIT_TYPE_UNSET, DEVLINK_RATE_LIMIT_TYPE_SHAPING, + DEVLINK_RATE_LIMIT_TYPE_POLICE, }; enum devlink_param_cmode { @@ -582,6 +583,13 @@ enum devlink_attr { DEVLINK_ATTR_LINECARD_SUPPORTED_TYPES, /* nested */ DEVLINK_ATTR_RATE_LIMIT_TYPE, /* u16 */ + DEVLINK_ATTR_RATE_TX_BURST, /* u64 */ + DEVLINK_ATTR_RATE_RX_MAX, /* u64 */ + DEVLINK_ATTR_RATE_RX_BURST, /* u64 */ + DEVLINK_ATTR_RATE_TX_PKTS, /* u64 */ + DEVLINK_ATTR_RATE_TX_PKTS_BURST, /* u64 */ + DEVLINK_ATTR_RATE_RX_PKTS, /* u64 */ + DEVLINK_ATTR_RATE_RX_PKTS_BURST, /* u64 */ /* add new attributes above here, update the policy in devlink.c */ diff --git a/net/core/devlink.c b/net/core/devlink.c index 756d95c72b4d..c74cdd0bd44d 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c @@ -366,6 +366,12 @@ devlink_rate_is_shaping(struct devlink_rate *devlink_rate) return devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_SHAPING; } +static inline bool +devlink_rate_is_police(struct devlink_rate *devlink_rate) +{ + return devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_POLICE; +} + static struct devlink_rate * devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info) { @@ -1125,6 +1131,31 @@ static int devlink_nl_rate_fill(struct sk_buff *msg, if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_SHARE, devlink_rate->shaping_attrs.tx_share, DEVLINK_ATTR_PAD)) goto nla_put_failure; + } else if (devlink_rate_is_police(devlink_rate)) { + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_MAX, + devlink_rate->shaping_attrs.tx_max, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_BURST, + devlink_rate->police_attrs.tx_burst, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_RX_MAX, + devlink_rate->police_attrs.rx_max, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_RX_BURST, + devlink_rate->police_attrs.rx_burst, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_PKTS, + devlink_rate->police_attrs.tx_pkts, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_TX_PKTS_BURST, + devlink_rate->police_attrs.tx_pkts_burst, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_RX_PKTS, + devlink_rate->police_attrs.rx_pkts, DEVLINK_ATTR_PAD)) + goto nla_put_failure; + if (nla_put_u64_64bit(msg, DEVLINK_ATTR_RATE_RX_PKTS_BURST, + devlink_rate->police_attrs.rx_pkts_burst, DEVLINK_ATTR_PAD)) + goto nla_put_failure; } if (devlink_rate->parent) @@ -1966,7 +1997,110 @@ static int devlink_nl_rate_set(struct devlink_rate *devlink_rate, new_val, info->extack); if (err) return err; - devlink_rate->shaping_attrs.tx_max = new_val; + + if (devlink_rate_is_police(devlink_rate)) + devlink_rate->police_attrs.tx_max = new_val; + else + devlink_rate->shaping_attrs.tx_max = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_TX_BURST] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_BURST]); + + if (devlink_rate_is_leaf(devlink_rate)) + err = ops->rate_leaf_tx_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + else if (devlink_rate_is_node(devlink_rate)) + err = ops->rate_node_tx_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + if (err) + return err; + devlink_rate->police_attrs.tx_burst = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_RX_MAX] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_RX_MAX]); + + if (devlink_rate_is_leaf(devlink_rate)) { + err = ops->rate_leaf_rx_max_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + } else if (devlink_rate_is_node(devlink_rate)) { + err = ops->rate_node_rx_max_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + } + if (err) + return err; + devlink_rate->police_attrs.rx_max = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_RX_BURST] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_RX_BURST]); + + if (devlink_rate_is_leaf(devlink_rate)) + err = ops->rate_leaf_rx_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + else if (devlink_rate_is_node(devlink_rate)) + err = ops->rate_node_rx_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + if (err) + return err; + devlink_rate->police_attrs.rx_burst = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_TX_PKTS] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_PKTS]); + + if (devlink_rate_is_leaf(devlink_rate)) + err = ops->rate_leaf_tx_pkts_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + else if (devlink_rate_is_node(devlink_rate)) + err = ops->rate_node_tx_pkts_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + if (err) + return err; + devlink_rate->police_attrs.tx_pkts = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_TX_PKTS_BURST] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_TX_PKTS_BURST]); + + if (devlink_rate_is_leaf(devlink_rate)) + err = ops->rate_leaf_tx_pkts_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + else if (devlink_rate_is_node(devlink_rate)) + err = ops->rate_node_tx_pkts_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + if (err) + return err; + devlink_rate->police_attrs.tx_pkts_burst = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_RX_PKTS] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_RX_PKTS]); + + if (devlink_rate_is_leaf(devlink_rate)) + err = ops->rate_leaf_rx_pkts_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + else if (devlink_rate_is_node(devlink_rate)) + err = ops->rate_node_rx_pkts_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + if (err) + return err; + devlink_rate->police_attrs.rx_pkts = new_val; + } + + if (attrs[DEVLINK_ATTR_RATE_RX_PKTS_BURST] && devlink_rate_is_police(devlink_rate)) { + new_val = nla_get_u64(attrs[DEVLINK_ATTR_RATE_RX_PKTS_BURST]); + + if (devlink_rate_is_leaf(devlink_rate)) + err = ops->rate_leaf_rx_pkts_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + else if (devlink_rate_is_node(devlink_rate)) + err = ops->rate_node_rx_pkts_burst_set(devlink_rate, devlink_rate->priv, + new_val, info->extack); + if (err) + return err; + devlink_rate->police_attrs.rx_pkts_burst = new_val; } if (nla_parent) @@ -1977,7 +2111,12 @@ static int devlink_nl_rate_set(struct devlink_rate *devlink_rate, */ if (devlink_rate_is_leaf(devlink_rate) && !devlink_rate->parent && ((devlink_rate_is_shaping(devlink_rate) && - !devlink_rate->shaping_attrs.tx_max && !devlink_rate->shaping_attrs.tx_share))) + !devlink_rate->shaping_attrs.tx_max && !devlink_rate->shaping_attrs.tx_share) || + (devlink_rate_is_police(devlink_rate) && + !devlink_rate->police_attrs.tx_max && !devlink_rate->police_attrs.tx_burst && + !devlink_rate->police_attrs.rx_max && !devlink_rate->police_attrs.rx_burst && + !devlink_rate->police_attrs.tx_pkts && !devlink_rate->police_attrs.tx_pkts_burst && + !devlink_rate->police_attrs.rx_pkts && !devlink_rate->police_attrs.rx_pkts_burst))) devlink_rate->limit_type = DEVLINK_RATE_LIMIT_TYPE_UNSET; return err; @@ -1995,7 +2134,43 @@ static bool devlink_rate_set_ops_supported(const struct devlink_ops *ops, return false; } if (attrs[DEVLINK_ATTR_RATE_TX_MAX] && !ops->rate_leaf_tx_max_set) { - NL_SET_ERR_MSG_MOD(info->extack, "TX max set isn't supported for the leafs"); + NL_SET_ERR_MSG_MOD(info->extack, + "TX max set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_TX_BURST] && !ops->rate_leaf_tx_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "TX burst set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_MAX] && !ops->rate_leaf_rx_max_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX max set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_BURST] && !ops->rate_leaf_rx_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX burst set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_TX_PKTS] && !ops->rate_leaf_tx_pkts_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "TX pkts set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_TX_PKTS_BURST] && !ops->rate_leaf_tx_pkts_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "TX pkts burst set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_PKTS] && !ops->rate_leaf_rx_pkts_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX pkts set isn't supported for the leafs"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_PKTS_BURST] && !ops->rate_leaf_rx_pkts_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX pkts burst set isn't supported for the leafs"); return false; } if (attrs[DEVLINK_ATTR_RATE_PARENT_NODE_NAME] && @@ -2012,6 +2187,41 @@ static bool devlink_rate_set_ops_supported(const struct devlink_ops *ops, NL_SET_ERR_MSG_MOD(info->extack, "TX max set isn't supported for the nodes"); return false; } + if (attrs[DEVLINK_ATTR_RATE_TX_BURST] && !ops->rate_node_tx_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "TX burst set isn't supported for the nodes"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_MAX] && !ops->rate_node_rx_max_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX max set isn't supported for the nodes"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_BURST] && !ops->rate_node_rx_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX burst set isn't supported for the nodes"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_TX_PKTS] && !ops->rate_node_tx_pkts_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "TX pkts set isn't supported for the nodes"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_TX_PKTS_BURST] && !ops->rate_node_tx_pkts_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "TX pkts burst set isn't supported for the nodes"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_PKTS] && !ops->rate_node_rx_pkts_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX pkts set isn't supported for the nodes"); + return false; + } + if (attrs[DEVLINK_ATTR_RATE_RX_PKTS_BURST] && !ops->rate_node_rx_pkts_burst_set) { + NL_SET_ERR_MSG_MOD(info->extack, + "RX pkts burst set isn't supported for the nodes"); + return false; + } if (attrs[DEVLINK_ATTR_RATE_PARENT_NODE_NAME] && !ops->rate_node_parent_set) { NL_SET_ERR_MSG_MOD(info->extack, "Parent set isn't supported for the nodes"); @@ -9075,6 +9285,13 @@ static const struct nla_policy devlink_nl_policy[DEVLINK_ATTR_MAX + 1] = { [DEVLINK_ATTR_LINECARD_INDEX] = { .type = NLA_U32 }, [DEVLINK_ATTR_LINECARD_TYPE] = { .type = NLA_NUL_STRING }, [DEVLINK_ATTR_RATE_LIMIT_TYPE] = { .type = NLA_U16 }, + [DEVLINK_ATTR_RATE_TX_BURST] = { .type = NLA_U64 }, + [DEVLINK_ATTR_RATE_RX_MAX] = { .type = NLA_U64 }, + [DEVLINK_ATTR_RATE_RX_BURST] = { .type = NLA_U64 }, + [DEVLINK_ATTR_RATE_TX_PKTS] = { .type = NLA_U64 }, + [DEVLINK_ATTR_RATE_TX_PKTS_BURST] = { .type = NLA_U64 }, + [DEVLINK_ATTR_RATE_RX_PKTS] = { .type = NLA_U64 }, + [DEVLINK_ATTR_RATE_RX_PKTS_BURST] = { .type = NLA_U64 }, }; static const struct genl_small_ops devlink_nl_ops[] = { From patchwork Mon Jun 20 15:26:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dima Chumak X-Patchwork-Id: 12887767 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 464E5CCA482 for ; Mon, 20 Jun 2022 15:27:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242149AbiFTP1s (ORCPT ); Mon, 20 Jun 2022 11:27:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242146AbiFTP1j (ORCPT ); Mon, 20 Jun 2022 11:27:39 -0400 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2050.outbound.protection.outlook.com [40.107.237.50]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4E1E4D3 for ; Mon, 20 Jun 2022 08:27:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PvlxD4iBk24xARFvifErQ0xf8EuPyPkW9tDXtuIeE8UP0u8XRVQOXUl2jxszJnjDMnDvNAzcsR95eQ+Q1Tzfx4LSJXkaIVbwZAlzRvR/0j71P4sqTdSBrAMtkK3C+4whcdJrstI39QXaKUFEy9xoqrY1u5c0AxxV5O1iLBeQkxTVFKuCsE9S7B6Cs8s05duV77R+21C/dptfvwuTH2sqA5zNRgyxYjwM7vgrQw3W7fAhNs4JL2W2mraXuohnA6bb+Xufiwl9knVdi5mzF0bK6BBnGmkJ1i+zCAE/1Rvr3FDSfKXziWPPioKc7WpoNH+ok55UQZGef7e5If/WhaTekg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Q2IkDA7s4raVIaTyWbDni5VG92xByPaaVraDmd9/XFA=; b=bXzbdM0n/MEqsdZyIpsXvfO69/pvDKkNwsMHbg8fS7h+52o4DsbmRqG6xO4nJFCP2NKeypL4XKURaM/IXZD6u3n8MZA2Rs4GjXUuFXI9xF7b9eblHJvJAhBS0Xv+ae3A0Ty0lBXN2a95LkmHNUJsxq8vGYzGn76hCxFLDj2/Jkm7fSm18Lo5krMp5QgzyLOBH5nt/6p2Fw5b4xhMingxmsfMZDnwOWI2NcA4++JiBl6buc6C6sBeyffN0RrUHstRvYc5RoiLne20OQnmT5nHxQl4MOt6J0MWztpxxcOxu8/S0Dd/HeoUPHmgFemc4sSCRt4JUJgVKboxrH3rkXOPeA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.238) smtp.rcpttodomain=redhat.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Q2IkDA7s4raVIaTyWbDni5VG92xByPaaVraDmd9/XFA=; b=WqzzbAON4KOsjeEsgch7TSMkGsCuQTiPVoBAFPdtRcAel46U6vM2spDWVn4hb1VydNNklxVie88L/emIOcWlNWcsRqJOhiV6X/8luMkseZgXxfeh2JjFT+ZZJyafm0EC7MEzTMHx+zVuEEADCjqnOrR7FTHVg9L09ACvJNuUaYuhdFs6cyY9/sAwd/xkoppH6EP28iWXv53a/tQtmPOjFQagWcJY65Irv7De0QuqLFBMZu205eVaOZs6WwBWUtizSeGMHgs/0KFATvuzDEEV+EzZD6TMOoo0E0OoeCIVnNr8R7Q3j+NHQ+k3iz9LVk34tSWovpwlKR+ZITm20yUz0g== Received: from CO2PR04CA0197.namprd04.prod.outlook.com (2603:10b6:104:5::27) by SJ1PR12MB6316.namprd12.prod.outlook.com (2603:10b6:a03:455::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.15; Mon, 20 Jun 2022 15:27:36 +0000 Received: from CO1NAM11FT046.eop-nam11.prod.protection.outlook.com (2603:10b6:104:5:cafe::d9) by CO2PR04CA0197.outlook.office365.com (2603:10b6:104:5::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5293.13 via Frontend Transport; Mon, 20 Jun 2022 15:27:36 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.238) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.238 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.238; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (12.22.5.238) by CO1NAM11FT046.mail.protection.outlook.com (10.13.174.203) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5353.14 via Frontend Transport; Mon, 20 Jun 2022 15:27:36 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by DRHQMAIL105.nvidia.com (10.27.9.14) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Mon, 20 Jun 2022 15:27:36 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Mon, 20 Jun 2022 08:27:35 -0700 Received: from vdi.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.22 via Frontend Transport; Mon, 20 Jun 2022 08:27:33 -0700 From: Dima Chumak To: Jakub Kicinski CC: Jiri Pirko , "David S. Miller" , Eric Dumazet , Paolo Abeni , , Dima Chumak Subject: [PATCH net-next 3/5] netdevsim: Support devlink rate limit_type police Date: Mon, 20 Jun 2022 18:26:45 +0300 Message-ID: <20220620152647.2498927-4-dchumak@nvidia.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220620152647.2498927-1-dchumak@nvidia.com> References: <20220620152647.2498927-1-dchumak@nvidia.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2db89bb5-1158-4e49-dbf7-08da52d16780 X-MS-TrafficTypeDiagnostic: SJ1PR12MB6316:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 1lYKU4l+InKKPTW8wfNF00SpDAqGPXcRGvPL+kTkZn/u3Hxs+kZglnmwG6gTutx48J58HhptwJ8oWkJReMPcpPODSf6kyzf4BD/5krnGU1hFq2Xjev8ZF/i+k6qzb4Czq5pyaYYbbzeQvSNq4RpNnUrVx6opDdRLhLMpseFg3ztX9a15OJ49Ra3oJjJO5q0mZqDLYz85KpmT+rTyc7imQNLB6BSH9yJJlRUznhxU3hwwkwCSHESnF6DQE2D9pjUXIYQiYpRkgPILe97zl9sv3mQuWNSVBAQAfvLhJoGU7/dvW9F7iVnhQ/UbiRJCvVS8ZZh04d44IfobXIwSMlzIpUJiwUlYT9KWxQ6UHSrdB9rGxrqFXyCTdImvUqBKUQ4+5k0bGt/MQLT0Eyh6UkySl9JmoOetQWOFSp0v1OOikofgxyCzx44ZplUgzJVECNc2liW7RGl7aoFATrdKIrnWJ86u7+E1QpZcdYNq+q/rePemeSNfLKOeLmqNuyF3pD3nM76j+GjbgEfbKsl6WEfjBxNSRpUssC5dRwE+F3k5QlZkFHMDtbzTm8xQ9M6rWy8T1SasWjmNNUUz66j7Jhz3x/z7MA6p+EQBK3R+tw6+TQqiJuptFJr8e8iUTyZ8I1IpwPSBsIwGKD4KU/WHyJ5cbmjPQb8NUWkW6D5rvqHjpdGqjQfVo+JL0bYYbJET6+114Dk+eCkWDLGIVEoo7rcHYn4e8A3NwQyqgp/T3ga4dUI= X-Forefront-Antispam-Report: CIP:12.22.5.238;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230016)(4636009)(346002)(376002)(396003)(136003)(39860400002)(36840700001)(46966006)(40470700004)(30864003)(70586007)(426003)(8676002)(1076003)(6666004)(478600001)(47076005)(336012)(82310400005)(316002)(70206006)(83380400001)(81166007)(356005)(8936002)(41300700001)(5660300002)(36756003)(107886003)(7696005)(82740400003)(26005)(2616005)(86362001)(40460700003)(2906002)(186003)(36860700001)(6916009)(54906003)(40480700001)(4326008)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2022 15:27:36.3081 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2db89bb5-1158-4e49-dbf7-08da52d16780 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[12.22.5.238];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT046.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ1PR12MB6316 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Implement devlink_ops that enable setting devlink_rate attributes for the new DEVLINK_RATE_LIMIT_TYPE_POLICE type of rate objects via devlink API. The new rate values of VF ports and rate nodes are exposed to netdevsim debugfs. Signed-off-by: Dima Chumak --- drivers/net/netdevsim/dev.c | 211 ++++++++++++++++++++++++++++-- drivers/net/netdevsim/netdevsim.h | 11 +- 2 files changed, 207 insertions(+), 15 deletions(-) diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index 57a3ac893792..9ac78ab09a58 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -406,10 +406,24 @@ static int nsim_dev_port_debugfs_init(struct nsim_dev *nsim_dev, if (nsim_dev_port_is_vf(nsim_dev_port)) { unsigned int vf_id = nsim_dev_port_index_to_vf_index(port_index); - debugfs_create_u16("tx_share", 0400, nsim_dev_port->ddir, + debugfs_create_u64("tx_share", 0400, nsim_dev_port->ddir, &nsim_dev->vfconfigs[vf_id].min_tx_rate); - debugfs_create_u16("tx_max", 0400, nsim_dev_port->ddir, + debugfs_create_u64("tx_max", 0400, nsim_dev_port->ddir, &nsim_dev->vfconfigs[vf_id].max_tx_rate); + debugfs_create_u64("tx_burst", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].tx_burst); + debugfs_create_u64("rx_max", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].rx_max); + debugfs_create_u64("rx_burst", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].rx_burst); + debugfs_create_u64("tx_pkts", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].tx_pkts); + debugfs_create_u64("tx_pkts_burst", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].tx_pkts_burst); + debugfs_create_u64("rx_pkts", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].rx_pkts); + debugfs_create_u64("rx_pkts_burst", 0400, nsim_dev_port->ddir, + &nsim_dev->vfconfigs[vf_id].rx_pkts_burst); nsim_dev_port->rate_parent = debugfs_create_file("rate_parent", 0400, nsim_dev_port->ddir, @@ -1192,20 +1206,106 @@ static int nsim_leaf_tx_max_set(struct devlink_rate *devlink_rate, void *priv, int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); int err; - err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack); - if (err) - return err; + if (devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_SHAPING) { + err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack); + if (err) + return err; + } nsim_dev->vfconfigs[vf_id].max_tx_rate = tx_max; return 0; } +static int nsim_leaf_tx_burst_set(struct devlink_rate *rate_leaf, void *priv, + u64 tx_burst, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].tx_burst = tx_burst; + return 0; +} + +static int nsim_leaf_rx_max_set(struct devlink_rate *rate_leaf, void *priv, + u64 rx_max, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].rx_max = rx_max; + return 0; +} + +static int nsim_leaf_rx_burst_set(struct devlink_rate *rate_leaf, void *priv, + u64 rx_burst, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].rx_burst = rx_burst; + return 0; +} + +static int nsim_leaf_tx_pkts_set(struct devlink_rate *rate_leaf, void *priv, + u64 tx_pkts, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].tx_pkts = tx_pkts; + return 0; +} + +static int nsim_leaf_tx_pkts_burst_set(struct devlink_rate *rate_leaf, void *priv, + u64 tx_pkts_burst, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].tx_pkts_burst = tx_pkts_burst; + return 0; +} + +static int nsim_leaf_rx_pkts_set(struct devlink_rate *rate_leaf, void *priv, + u64 rx_pkts, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].rx_pkts = rx_pkts; + return 0; +} + +static int nsim_leaf_rx_pkts_burst_set(struct devlink_rate *rate_leaf, void *priv, + u64 rx_pkts_burst, struct netlink_ext_ack *extack) +{ + struct nsim_dev_port *nsim_dev_port = priv; + struct nsim_dev *nsim_dev = nsim_dev_port->ns->nsim_dev; + int vf_id = nsim_dev_port_index_to_vf_index(nsim_dev_port->port_index); + + nsim_dev->vfconfigs[vf_id].rx_pkts_burst = rx_pkts_burst; + return 0; +} + struct nsim_rate_node { struct dentry *ddir; struct dentry *rate_parent; char *parent_name; - u16 tx_share; - u16 tx_max; + u64 tx_share; + u64 tx_max; + u64 tx_burst; + u64 rx_max; + u64 rx_burst; + u64 tx_pkts; + u64 tx_pkts_burst; + u64 rx_pkts; + u64 rx_pkts_burst; }; static int nsim_node_tx_share_set(struct devlink_rate *devlink_rate, void *priv, @@ -1228,14 +1328,79 @@ static int nsim_node_tx_max_set(struct devlink_rate *devlink_rate, void *priv, struct nsim_rate_node *nsim_node = priv; int err; - err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack); - if (err) - return err; + if (devlink_rate->limit_type == DEVLINK_RATE_LIMIT_TYPE_SHAPING) { + err = nsim_rate_bytes_to_units("tx_max", &tx_max, extack); + if (err) + return err; + } nsim_node->tx_max = tx_max; return 0; } +static int nsim_node_tx_burst_set(struct devlink_rate *rate_node, void *priv, + u64 tx_burst, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->tx_burst = tx_burst; + return 0; +} + +static int nsim_node_rx_max_set(struct devlink_rate *rate_node, void *priv, + u64 rx_max, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->rx_max = rx_max; + return 0; +} + +static int nsim_node_rx_burst_set(struct devlink_rate *rate_node, void *priv, + u64 rx_burst, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->rx_burst = rx_burst; + return 0; +} + +static int nsim_node_tx_pkts_set(struct devlink_rate *rate_node, void *priv, + u64 tx_pkts, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->tx_pkts = tx_pkts; + return 0; +} + +static int nsim_node_tx_pkts_burst_set(struct devlink_rate *rate_node, void *priv, + u64 tx_pkts_burst, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->tx_pkts_burst = tx_pkts_burst; + return 0; +} + +static int nsim_node_rx_pkts_set(struct devlink_rate *rate_node, void *priv, + u64 rx_pkts, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->rx_pkts = rx_pkts; + return 0; +} + +static int nsim_node_rx_pkts_burst_set(struct devlink_rate *rate_node, void *priv, + u64 rx_pkts_burst, struct netlink_ext_ack *extack) +{ + struct nsim_rate_node *nsim_node = priv; + + nsim_node->rx_pkts_burst = rx_pkts_burst; + return 0; +} + static int nsim_rate_node_new(struct devlink_rate *node, void **priv, struct netlink_ext_ack *extack) { @@ -1253,13 +1418,19 @@ static int nsim_rate_node_new(struct devlink_rate *node, void **priv, nsim_node->ddir = debugfs_create_dir(node->name, nsim_dev->nodes_ddir); - debugfs_create_u16("tx_share", 0400, nsim_node->ddir, &nsim_node->tx_share); - debugfs_create_u16("tx_max", 0400, nsim_node->ddir, &nsim_node->tx_max); + debugfs_create_u64("tx_share", 0400, nsim_node->ddir, &nsim_node->tx_share); + debugfs_create_u64("tx_max", 0400, nsim_node->ddir, &nsim_node->tx_max); + debugfs_create_u64("tx_burst", 0400, nsim_node->ddir, &nsim_node->tx_burst); + debugfs_create_u64("rx_max", 0400, nsim_node->ddir, &nsim_node->rx_max); + debugfs_create_u64("rx_burst", 0400, nsim_node->ddir, &nsim_node->rx_burst); + debugfs_create_u64("tx_pkts", 0400, nsim_node->ddir, &nsim_node->tx_pkts); + debugfs_create_u64("tx_pkts_burst", 0400, nsim_node->ddir, &nsim_node->tx_pkts_burst); + debugfs_create_u64("rx_pkts", 0400, nsim_node->ddir, &nsim_node->rx_pkts); + debugfs_create_u64("rx_pkts_burst", 0400, nsim_node->ddir, &nsim_node->rx_pkts_burst); nsim_node->rate_parent = debugfs_create_file("rate_parent", 0400, nsim_node->ddir, &nsim_node->parent_name, &nsim_dev_rate_parent_fops); - *priv = nsim_node; return 0; } @@ -1337,8 +1508,22 @@ static const struct devlink_ops nsim_dev_devlink_ops = { .trap_policer_counter_get = nsim_dev_devlink_trap_policer_counter_get, .rate_leaf_tx_share_set = nsim_leaf_tx_share_set, .rate_leaf_tx_max_set = nsim_leaf_tx_max_set, + .rate_leaf_tx_burst_set = nsim_leaf_tx_burst_set, + .rate_leaf_rx_max_set = nsim_leaf_rx_max_set, + .rate_leaf_rx_burst_set = nsim_leaf_rx_burst_set, + .rate_leaf_tx_pkts_set = nsim_leaf_tx_pkts_set, + .rate_leaf_tx_pkts_burst_set = nsim_leaf_tx_pkts_burst_set, + .rate_leaf_rx_pkts_set = nsim_leaf_rx_pkts_set, + .rate_leaf_rx_pkts_burst_set = nsim_leaf_rx_pkts_burst_set, .rate_node_tx_share_set = nsim_node_tx_share_set, .rate_node_tx_max_set = nsim_node_tx_max_set, + .rate_node_tx_burst_set = nsim_node_tx_burst_set, + .rate_node_rx_max_set = nsim_node_rx_max_set, + .rate_node_rx_burst_set = nsim_node_rx_burst_set, + .rate_node_tx_pkts_set = nsim_node_tx_pkts_set, + .rate_node_tx_pkts_burst_set = nsim_node_tx_pkts_burst_set, + .rate_node_rx_pkts_set = nsim_node_rx_pkts_set, + .rate_node_rx_pkts_burst_set = nsim_node_rx_pkts_burst_set, .rate_node_new = nsim_rate_node_new, .rate_node_del = nsim_rate_node_del, .rate_leaf_parent_set = nsim_rate_leaf_parent_set, diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index 0b122872b2c9..2040b95e5f93 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -241,8 +241,15 @@ struct nsim_dev_port { struct nsim_vf_config { int link_state; - u16 min_tx_rate; - u16 max_tx_rate; + u64 min_tx_rate; + u64 max_tx_rate; + u64 tx_burst; + u64 rx_max; + u64 rx_burst; + u64 tx_pkts; + u64 tx_pkts_burst; + u64 rx_pkts; + u64 rx_pkts_burst; u16 vlan; __be16 vlan_proto; u16 qos; From patchwork Mon Jun 20 15:26:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dima Chumak X-Patchwork-Id: 12887768 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F2194C43334 for ; Mon, 20 Jun 2022 15:27:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242360AbiFTP1s (ORCPT ); Mon, 20 Jun 2022 11:27:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242342AbiFTP1p (ORCPT ); Mon, 20 Jun 2022 11:27:45 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2047.outbound.protection.outlook.com [40.107.243.47]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBFE0219 for ; Mon, 20 Jun 2022 08:27:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Xq1q6wjijHWpufGri6YwmcugzXMmjjSgEKAD4JPurrX9Y1QR5uNtcMBbMIFEWrB7fkWXaJZFUPfNA+wSj1G1rQih2bKt79MG1Rbr1xb18izsEHxZ9JnkKTCXEk14Kub05u1AIEawEypitB9t/LfqJvni+YQr5CKSwz0Y0mKVjAzaxKdz3kO5ZHBASPziS+FkiS6CX1squDkzg62bV/og6fJsBc6wIgT9hme22DZLFSYjv3O7Ekkhsu1P6dtJBw8Z0iRDtze2EyAOboO78R+G/rLNh0AZj410CciepCLuPLjD+ANb/CSRIyHG4vKu/EofJqJKTcsDzvdVisILSZt7cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=j651VUBtk9j3cjpSaA+14XhYLr5unDGdfaCvNVzsnCo=; b=T5DqtcbNGXLtTEMrmxE1y+LVZvihUxxSeMhcEcV7AC/mJOyZigRj6YiPHsOA/wMeyDlIGO09oJLA2W6gFtgcyBUBwSY6Zfd3zJDiNybzPfMUH4qJbGFs7CjpPZG422pUzn4qOIrKigc0RqGDwKXAVlMnNE0N9/TUuseJaO2bukUp8AbVrAjCnr5OlH4+4RKbpflMdixjhJ22ZfXBLWbSRuwa8AvZsVikJ4trle5J5lLOvIEvtSuO/x+1JVwlt525PQBcJyS/Vf4+iepaxIvXTAW2cKcWjIOABoC9qtf2wV+m5qHa+tRtA4nUMS5uNV9SXUwIZEyx27upgeyHihRA/g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.234) smtp.rcpttodomain=redhat.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=j651VUBtk9j3cjpSaA+14XhYLr5unDGdfaCvNVzsnCo=; b=ZcBUfbFoETvJk+yebG1y+8j/uqiNQHOPKpWlyWth9Tz92kLG4afKx6k41SY6D3yjegtEr0e6DYNNHmjnPlAv4a+U9h00hVOtK3L8dN7k+KRU845FbfqjLHSf5BSqia6WHiuzrFBqSMovo+whmcdtCNIK1wwLwUOOMHUFD63yW127A4rF0qpUIvTQWR2TrM5optvmmmMnNGZLIu89MiEXvimsJsSyq4uWxA/FXPnroCnH7a//YD/pXC1QMhbf2y0kY6khtRZVQMIqhJVC8oa1ergVMD2yiXphcWFdi92hTQ5LglCyRARAyhrlK734XdiKpAkUimUxkfPB8WNv8sJlwA== Received: from MWHPR15CA0066.namprd15.prod.outlook.com (2603:10b6:301:4c::28) by DM4PR12MB5722.namprd12.prod.outlook.com (2603:10b6:8:5d::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.18; Mon, 20 Jun 2022 15:27:39 +0000 Received: from CO1NAM11FT065.eop-nam11.prod.protection.outlook.com (2603:10b6:301:4c:cafe::f6) by MWHPR15CA0066.outlook.office365.com (2603:10b6:301:4c::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.22 via Frontend Transport; Mon, 20 Jun 2022 15:27:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.234) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.234 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.234; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (12.22.5.234) by CO1NAM11FT065.mail.protection.outlook.com (10.13.174.62) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5353.14 via Frontend Transport; Mon, 20 Jun 2022 15:27:38 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by DRHQMAIL101.nvidia.com (10.27.9.10) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Mon, 20 Jun 2022 15:27:38 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Mon, 20 Jun 2022 08:27:37 -0700 Received: from vdi.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.22 via Frontend Transport; Mon, 20 Jun 2022 08:27:35 -0700 From: Dima Chumak To: Jakub Kicinski CC: Jiri Pirko , "David S. Miller" , Eric Dumazet , Paolo Abeni , , Dima Chumak Subject: [PATCH net-next 4/5] selftest: netdevsim: Add devlink rate police sub-test Date: Mon, 20 Jun 2022 18:26:46 +0300 Message-ID: <20220620152647.2498927-5-dchumak@nvidia.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220620152647.2498927-1-dchumak@nvidia.com> References: <20220620152647.2498927-1-dchumak@nvidia.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a74e5a58-57a2-4c9b-e411-08da52d168f0 X-MS-TrafficTypeDiagnostic: DM4PR12MB5722:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 0eSoCQaXPDkJAerN6AnZGM3vhzgxmU5aEdhQUiON+SmXyKlXoqeWcDH70i0UV0mhH4hJnF1Lqm3Dnvr5WfZxD4B8dpwhbIx7MfoKPlw8IkAr+oynB8t8hvKf3Pp0FD7WqTEp1+GOaK947m9Gtx3II7FkECXG3k9Uhl9I3LjPaTn2NvF5aV3v5hLBFN6ezGAiQT78UrjN0KCTofRVokWg+qA8FUp99AZwv9gPltyLzh4cEpbCuTBiAiKVLUFQRhCem2N6qkdlsRtrEWFVAL3U/j57iWv33bIgDA572bZQ/WcuEH2dDtdhL2TReN2bQLuwgC8nWhQGzBS6SonajUetaNbW1n6QRs1BT/nNJ8zzWDF6RUqEauVngvsIMzoKboPmCrAqPKwIBgPfcVzroTLM4Y2OwPTcy/x93CDYtLgT0skTtF+lmsC76PJUP/2fDKoyfR6ofD3frv4/CByo/J+uiKE5huezHrcqw3ol3leBL558blk7rTGcvVVelFuo5pLnnAcMIpjE9q5IQtxE6+Xib4ksQV0ZSldKzGT54BxRqHSLTbdCnOv8k64UcmNv7GEOKrwH4gMCvP7eGIX4hdqU8uIENKMdMhP+yqwCCV1zB5V9auylGcqLLN1mtYEYqw9gT+z8qWZsTx7PJuoEUI4OktbbTGF9xM1fZYzKdu6hd120ssxWO0T5y3+I5/lhiLIYOjTXE23ImRLkeeUD3sY5tzYRPkgym96oPoSfvjq4K+MNM1cPwiycDIX0d25DIorR X-Forefront-Antispam-Report: CIP:12.22.5.234;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230016)(4636009)(346002)(39860400002)(376002)(396003)(136003)(40470700004)(36840700001)(46966006)(316002)(2906002)(8676002)(82740400003)(4326008)(1076003)(47076005)(478600001)(2616005)(26005)(83380400001)(6916009)(7696005)(54906003)(40460700003)(70206006)(70586007)(107886003)(8936002)(6666004)(82310400005)(40480700001)(5660300002)(36756003)(36860700001)(356005)(186003)(336012)(41300700001)(81166007)(426003)(86362001)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2022 15:27:38.7356 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a74e5a58-57a2-4c9b-e411-08da52d168f0 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[12.22.5.234];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT065.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB5722 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Test verifies that netdevsim VFs and groups can set and retrieve the new rate limit_type police attributes via devlink API. Signed-off-by: Dima Chumak --- .../drivers/net/netdevsim/devlink.sh | 215 ++++++++++++++++-- 1 file changed, 200 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/drivers/net/netdevsim/devlink.sh b/tools/testing/selftests/drivers/net/netdevsim/devlink.sh index 9de1d123f4f5..40392dcbb30e 100755 --- a/tools/testing/selftests/drivers/net/netdevsim/devlink.sh +++ b/tools/testing/selftests/drivers/net/netdevsim/devlink.sh @@ -534,6 +534,15 @@ rate_attr_set() devlink port function rate set $handle $name $value$units } +rate_police_attr_set() +{ + local handle=$1 + local name=$2 + local value=$3 + + devlink port function rate set $handle limit_type police $name $value +} + rate_attr_get() { local handle=$1 @@ -542,7 +551,7 @@ rate_attr_get() cmd_jq "devlink port function rate show $handle -j" '.[][].'$name } -rate_attr_tx_rate_check() +rate_attr_shaping_rate_check() { local handle=$1 local name=$2 @@ -563,6 +572,35 @@ rate_attr_tx_rate_check() check_err $? "Unexpected $name attr value $api_value != $rate" } +rate_attr_police_rate_check() +{ + local handle=$1 + local name=$2 + local rate=$3 + local debug_file=$4 + + rate_police_attr_set $handle $name $rate + check_err $? "Failed to set $name value" + + local debug_value=$(cat $debug_file) + check_err $? "Failed to read $name value from debugfs" + + # undo bits->bytes conversion forced by devlink + case $name in ([rt]x_max) debug_value=$((debug_value * 8)) ;; esac + + [ "$debug_value" == "$rate" ] + check_err $? "Unexpected $name debug value $debug_value != $rate" + + local api_value=$(rate_attr_get $handle $name) + check_err $? "Failed to get $name attr value" + + # undo bits->bytes conversion forced by devlink + case $name in ([rt]x_max) api_value=$((api_value * 8)) ;; esac + + [ "$api_value" == "$rate" ] + check_err $? "Unexpected $name attr value $api_value != $rate" +} + rate_attr_parent_check() { local handle=$1 @@ -586,8 +624,9 @@ rate_attr_parent_check() rate_node_add() { local handle=$1 + local limit_type=${2:+limit_type $2} - devlink port function rate add $handle + devlink port function rate add $handle $limit_type } rate_node_del() @@ -597,21 +636,14 @@ rate_node_del() devlink port function rate del $handle } -rate_test() +rate_shaping_test() { - RET=0 - - echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs - devlink dev eswitch set $DL_HANDLE mode switchdev - local leafs=`rate_leafs_get $DL_HANDLE` - local num_leafs=`echo $leafs | wc -w` - [ "$num_leafs" == "$VF_COUNT" ] - check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs" + local leafs=$1 rate=10 for r_obj in $leafs do - rate_attr_tx_rate_check $r_obj tx_share $rate \ + rate_attr_shaping_rate_check $r_obj tx_share $rate \ $DEBUGFS_DIR/ports/${r_obj##*/}/tx_share rate=$(($rate+10)) done @@ -619,11 +651,19 @@ rate_test() rate=100 for r_obj in $leafs do - rate_attr_tx_rate_check $r_obj tx_max $rate \ + rate_attr_shaping_rate_check $r_obj tx_max $rate \ $DEBUGFS_DIR/ports/${r_obj##*/}/tx_max rate=$(($rate+100)) done + for r_obj in $leafs + do + rate_attr_shaping_rate_check $r_obj tx_share 0 \ + $DEBUGFS_DIR/ports/${r_obj##*/}/tx_share + rate_attr_shaping_rate_check $r_obj tx_max 0 \ + $DEBUGFS_DIR/ports/${r_obj##*/}/tx_max + done + local node1_name='group1' local node1="$DL_HANDLE/$node1_name" rate_node_add "$node1" @@ -634,11 +674,11 @@ rate_test() check_err $? "Expected 1 rate node in output but got $num_nodes" local node_tx_share=10 - rate_attr_tx_rate_check $node1 tx_share $node_tx_share \ + rate_attr_shaping_rate_check $node1 tx_share $node_tx_share \ $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_share local node_tx_max=100 - rate_attr_tx_rate_check $node1 tx_max $node_tx_max \ + rate_attr_shaping_rate_check $node1 tx_max $node_tx_max \ $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max rate_node_del "$node1" @@ -668,6 +708,151 @@ rate_test() check_err $? "Failed to unset $r_obj parent node" rate_node_del "$node1" check_err $? "Failed to delete node $node1" +} + +rate_police_test() +{ + local leafs=$1 + + local rate=$((100 * 1000**2 * 8)) + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj tx_max $rate \ + $DEBUGFS_DIR/ports/${r_obj##*/}/tx_max + rate=$(($rate + 10 * 1000**2 * 8)) + done + + local size=$((1024**2)) + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj tx_burst $size \ + $DEBUGFS_DIR/ports/${r_obj##*/}/tx_burst + size=$(($size * 2)) + done + + rate=$((100 * 1000**2 * 8)) + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj rx_max $rate \ + $DEBUGFS_DIR/ports/${r_obj##*/}/rx_max + rate=$(($rate + 10 * 1000**2 * 8)) + done + + size=$((1024**2)) + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj rx_burst $size \ + $DEBUGFS_DIR/ports/${r_obj##*/}/rx_burst + size=$(($size * 2)) + done + + local packets=1000 + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj tx_pkts $packets \ + $DEBUGFS_DIR/ports/${r_obj##*/}/tx_pkts + packets=$(($packets * 2)) + done + + size=$((1024**2)) + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj tx_pkts_burst $size \ + $DEBUGFS_DIR/ports/${r_obj##*/}/tx_pkts_burst + size=$(($size * 2)) + done + + packets=1000 + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj rx_pkts $packets \ + $DEBUGFS_DIR/ports/${r_obj##*/}/rx_pkts + packets=$(($packets * 2)) + done + + size=$((1024**2)) + for r_obj in $leafs + do + rate_attr_police_rate_check $r_obj rx_pkts_burst $size \ + $DEBUGFS_DIR/ports/${r_obj##*/}/rx_pkts_burst + size=$(($size * 2)) + done + + local node1_name='group1' + local node1="$DL_HANDLE/$node1_name" + rate_node_add "$node1" police + check_err $? "Failed to add node $node1" + + local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w` + [ $num_nodes == 1 ] + check_err $? "Expected 1 rate node in output but got $num_nodes" + + rate_attr_police_rate_check $node1 tx_max $((200 * 1000**2 * 8)) \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max + + rate_attr_police_rate_check $node1 tx_burst $((2 * 1024**2)) \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_burst + + rate_attr_police_rate_check $node1 rx_max $((300 * 1000**2 * 8)) \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_max + + rate_attr_police_rate_check $node1 rx_burst $((3 * 1024**2)) \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_burst + + rate_attr_police_rate_check $node1 tx_pkts 4000 \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_pkts + + rate_attr_police_rate_check $node1 tx_pkts_burst $((4 * 1024**2)) \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_pkts_burst + + rate_attr_police_rate_check $node1 rx_pkts 5000 \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_pkts + + rate_attr_police_rate_check $node1 rx_pkts_burst $((5 * 1024**2)) \ + $DEBUGFS_DIR/rate_nodes/${node1##*/}/rx_pkts_burst + + rate_node_del "$node1" + check_err $? "Failed to delete node $node1" + num_nodes=`rate_nodes_get $DL_HANDLE | wc -w` + [ $num_nodes == 0 ] + check_err $? "Expected 0 rate node but got $num_nodes" + + rate_node_add "$node1" police + check_err $? "Failed to add node $node1" + + rate_attr_parent_check $r_obj $node1_name \ + $DEBUGFS_DIR/ports/${r_obj##*/}/rate_parent + + local node2_name='group2' + local node2="$DL_HANDLE/$node2_name" + rate_node_add "$node2" police + check_err $? "Failed to add node $node2" + + rate_attr_parent_check $node2 $node1_name \ + $DEBUGFS_DIR/rate_nodes/$node2_name/rate_parent + rate_node_del "$node2" + check_err $? "Failed to delete node $node2" + rate_attr_set "$r_obj" noparent + check_err $? "Failed to unset $r_obj parent node" + rate_node_del "$node1" + check_err $? "Failed to delete node $node1" +} + +rate_test() +{ + RET=0 + + echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs + devlink dev eswitch set $DL_HANDLE mode switchdev + local leafs=`rate_leafs_get $DL_HANDLE` + local num_leafs=`echo $leafs | wc -w` + [ "$num_leafs" == "$VF_COUNT" ] + check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs" + + rate_shaping_test "$leafs" + if devlink port function rate help |& grep -qF 'limit_type police' ; then + rate_police_test "$leafs" + fi log_test "rate test" } From patchwork Mon Jun 20 15:26:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dima Chumak X-Patchwork-Id: 12887769 X-Patchwork-Delegate: kuba@kernel.org Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D33E7CCA47C for ; Mon, 20 Jun 2022 15:27:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229447AbiFTP1t (ORCPT ); Mon, 20 Jun 2022 11:27:49 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242523AbiFTP1q (ORCPT ); Mon, 20 Jun 2022 11:27:46 -0400 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12on2072.outbound.protection.outlook.com [40.107.243.72]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E6A1C2FB for ; Mon, 20 Jun 2022 08:27:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=caswboHwZ8SYJXSOBhZG6V386MID2tcD4VLUfhE+4t9uUrnpcZW5aqZ/gR8XYMTr69za9fM/+HnFuAzkslPQLuQRJf2DUKTtomrXySAEbkXpq2RUDamHrsgKav0p/+AGz6CcIBrosnD2+IL4MHBebTOpy4AyWjSblqKVxKTkkfNqZMoLzftF1rWJbYM3mez2onM8Cys0K7TMUUeLS2AV38rdKfXBsO9URT1SmwnoRqlrmIKfxnmIGetSlCSOv5iskHwNXwRvt+/zYSCnSKDgEHkAvSfQbsBPBXec4ar4qmdS38sw1B04QIYcPN3zaZK0N3MglfEDsa10ZT4/RCFFhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=9Hg0xx6yGg4OXL36NOoXNuIoVqtntLEa4fCW+vC2sRY=; b=BAZSa5dHgkzXZiFX6dw5BG/AOT5yIgAzz74PbS1mh3qSixm+QkWUxzCs7oIxenPHKCLkdrk9IFJX5IbJKLef7jV7UDJnpX2JZqlMm17XIU7w4sNIY8uTuUunLtNSQWuCLJz7hstM8pDkPJ4TJGo47cGiYS5ofnKLBsPmAS6pFqckdv/EWc3tinibrXSZWRtrCxB2De3d7Emdjo32SsqVay1HMXxpamm0pRMUV1NyUy3RPb2tZsDbRA6ibVtMO3fZwwZ+8szrn++OD7r6vqmO/xKmpMtP+RBSO+VLXDRqV+O2Y9etmcgafyvksPO+JTyBLIaj//VTRo3pG+sFDBodLQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.236) smtp.rcpttodomain=redhat.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9Hg0xx6yGg4OXL36NOoXNuIoVqtntLEa4fCW+vC2sRY=; b=e8RihOSWqK8zNCgFB3W+n5FHA5A5LPpG7wPTXzpcnHYzbJjvnFpCx4cJNPf0AN5Tatad9PGHLr2bcp9fYKWnckKX64xmWUWG9EzIW+zLUAAR2zpV+cZL48HaB3v/wzndsfaQRST/WQU4DGCiors0CZ3P9GbABqtb1kfD4pih98niguywiUKsF7nEciVRLMu1f4rK2JtC/rruZxZICWkLKcRqNJoIq5u55U1zv6KPP/YC1mVQnMZswDLIvO4oIDJ5HTEsyjv5z6BQUb8I5mGBwIStS12pcKE5iv1Ejb6LU6rm2U+yWBDjBzHFl9Z0SfMoAQUVsEcvn6uTQCCrbOxQvA== Received: from BN6PR14CA0042.namprd14.prod.outlook.com (2603:10b6:404:13f::28) by SN6PR12MB2783.namprd12.prod.outlook.com (2603:10b6:805:78::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.20; Mon, 20 Jun 2022 15:27:41 +0000 Received: from BN8NAM11FT036.eop-nam11.prod.protection.outlook.com (2603:10b6:404:13f:cafe::ac) by BN6PR14CA0042.outlook.office365.com (2603:10b6:404:13f::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.16 via Frontend Transport; Mon, 20 Jun 2022 15:27:41 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.236) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.236 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.236; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (12.22.5.236) by BN8NAM11FT036.mail.protection.outlook.com (10.13.177.168) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5353.14 via Frontend Transport; Mon, 20 Jun 2022 15:27:41 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by DRHQMAIL109.nvidia.com (10.27.9.19) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Mon, 20 Jun 2022 15:27:40 +0000 Received: from drhqmail201.nvidia.com (10.126.190.180) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Mon, 20 Jun 2022 08:27:40 -0700 Received: from vdi.nvidia.com (10.127.8.13) by mail.nvidia.com (10.126.190.180) with Microsoft SMTP Server id 15.2.986.22 via Frontend Transport; Mon, 20 Jun 2022 08:27:38 -0700 From: Dima Chumak To: Jakub Kicinski CC: Jiri Pirko , "David S. Miller" , Eric Dumazet , Paolo Abeni , , Dima Chumak Subject: [PATCH net-next 5/5] Documentation: devlink rate objects limit_type Date: Mon, 20 Jun 2022 18:26:47 +0300 Message-ID: <20220620152647.2498927-6-dchumak@nvidia.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220620152647.2498927-1-dchumak@nvidia.com> References: <20220620152647.2498927-1-dchumak@nvidia.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 53e4f69b-26c7-4b0a-75f2-08da52d16a71 X-MS-TrafficTypeDiagnostic: SN6PR12MB2783:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: d+T3Z7+f1c3YRVTdqDseQnPNKvW3dTxkpMyoKsQP71U4u7zYvcXQV8PPh9FtTWJZAmQ7ufVmRAsKY4ClHdD20DT3rRPJw+Lhw55LtMOvAO3ZGgtXYZTyF6UaQHPz0NX6SmyKaTc21/0eB4DO13DZqBXHilanSR/Hm+ja/7cvajl0SNUx13yP4yEPKQEhbIqn7XqXcGl17Io/efOxMFvMmsfsyIwZJkDGEQKw3vLGmcYweJ8SbE/BNGPR9XGUaBJMnuqYK5wAzxlMSKOxJJgosBwIn07Uy0sP8miqRL+BDFkvtwQBFmK1Xs4FFKnQKAwunMRB1AK9YqxIVWhkO34xsctED8DRFxMqGOOJX+//cz+w8smr3P4PY9cJAdk3KWbkN6hzJlGIHcDr4l0l6HorJOJnGOQlsA/UTtg0FjWhROqReladKi+vtCrIr4JZ3OmBJ4+yMcNDF0tnhsQ6SHx9bDKFx1sSKhoTXuVjvK10XzHX4CwMf91LAW85LugeMlLkyHQvcNLO2Vy5lpw+fapb/lE4n2gEhYH3awFTyoWf8A2aRB1tAhRcvtknXTVWPcBJMuAgDMYObXufD01DwQMbVjeRxRmURGJz+NoMzI+r0JBJDhWbouOBvFjIzKlpiOYRh04JgVl2aIZdIEStPX29dLcbzo2TjJmJSUvvKNv+zGe6ABe5s2L+FS6kdV4WA/KuFIZDlle9VG2Y44QtmqI0gVOHIAxqa1UJiXONmNDQwjlbXrckh9O6shzJNEcgWAFA X-Forefront-Antispam-Report: CIP:12.22.5.236;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230016)(4636009)(376002)(136003)(346002)(39860400002)(396003)(36840700001)(40470700004)(46966006)(336012)(426003)(70206006)(47076005)(4326008)(8676002)(6666004)(186003)(1076003)(54906003)(40480700001)(41300700001)(70586007)(36756003)(26005)(2616005)(107886003)(83380400001)(6916009)(7696005)(36860700001)(8936002)(478600001)(5660300002)(86362001)(82310400005)(40460700003)(2906002)(316002)(81166007)(356005)(82740400003)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2022 15:27:41.2091 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 53e4f69b-26c7-4b0a-75f2-08da52d16a71 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[12.22.5.236];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN8NAM11FT036.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR12MB2783 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org X-Patchwork-Delegate: kuba@kernel.org Add devlink rate limit_type attribute information in devlink port documentation. Add devlink rate 'limit_type police' attributes in netdevsim devlink documentation. Signed-off-by: Dima Chumak --- .../networking/devlink/devlink-port.rst | 44 +++++++++++++++++-- .../networking/devlink/netdevsim.rst | 3 +- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Documentation/networking/devlink/devlink-port.rst b/Documentation/networking/devlink/devlink-port.rst index 7627b1da01f2..c2cd97a4ec4f 100644 --- a/Documentation/networking/devlink/devlink-port.rst +++ b/Documentation/networking/devlink/devlink-port.rst @@ -184,20 +184,58 @@ This is done through rate objects, which can be one of the two types: API allows to configure following rate object's parameters: +``limit_type`` + Type of rate limiting performed by a rate object. Supported types are + ``shaping`` and ``police``. Shaping type is a form of back pressure mechanism + that can delay traffic until there is a capacity, available at the lower + level, to process it. Police type is a simple packet counting and immediate + dropping of those packets that exceed the threshold. Some of the parameters + may be specific only to one of the limit types. + ``tx_share`` Minimum TX rate value shared among all other rate objects, or rate objects - that parts of the parent group, if it is a part of the same group. + that parts of the parent group, if it is a part of the same group. Specific to + ``shaping`` limit type. ``tx_max`` Maximum TX rate value. +``tx_burst`` + Size of a bucket that's used to buffer spikes when traffic exceeds ``tx_max`` + limit. Specific to ``police`` limit type. + +``rx_max`` + Maximum RX rate value. + +``rx_burst`` + Size of a bucket that's used to buffer spikes when traffic exceeds ``rx_max`` + limit. Specific to ``police`` limit type. + +``tx_pkts`` + Maximum TX rate in packets per second. + +``tx_pkts_burst`` + Size of a bucket that's used to buffer spikes when traffic exceeds ``tx_pkts`` + limit. Specific to ``police`` limit type. + +``rx_pkts`` + Maximum RX rate in packets per second. + +``rx_pkts_burst`` + Size of a bucket that's used to buffer spikes when traffic exceeds ``rx_pkts`` + limit. Specific to ``police`` limit type. + ``parent`` Parent node name. Parent node rate limits are considered as additional limits to all node children limits. ``tx_max`` is an upper limit for children. - ``tx_share`` is a total bandwidth distributed among children. + ``tx_share`` is a total bandwidth distributed among children. It's important + that ``limit_type`` of a child object and the parent node should match. In + other words, it's only possible to group rate objects of the same + ``limit_type``. Driver implementations are allowed to support both or either rate object types -and setting methods of their parameters. +and setting methods of their parameters. The same holds for limit types, a +driver implementation may support all or only some of them. Terms and Definitions ===================== diff --git a/Documentation/networking/devlink/netdevsim.rst b/Documentation/networking/devlink/netdevsim.rst index 8a292fb5aaea..32d3171ff281 100644 --- a/Documentation/networking/devlink/netdevsim.rst +++ b/Documentation/networking/devlink/netdevsim.rst @@ -64,7 +64,8 @@ The ``netdevsim`` driver supports rate objects management, which includes: - registerging/unregistering leaf rate objects per VF devlink port; - creation/deletion node rate objects; -- setting tx_share and tx_max rate values for any rate object type; +- setting limit_type, tx_share, tx_max, tx_burst, rx_max, rx_burst, tx_pkts, + tx_pkts_burst, rx_pkts and rx_pkts_burst rate values for any rate object type; - setting parent node for any rate object type. Rate nodes and it's parameters are exposed in ``netdevsim`` debugfs in RO mode.