From nobody Thu Jun 25 02:01:46 2026 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 AFB53C4332F for ; Thu, 24 Feb 2022 10:29:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233461AbiBXKaK (ORCPT ); Thu, 24 Feb 2022 05:30:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233450AbiBXKaH (ORCPT ); Thu, 24 Feb 2022 05:30:07 -0500 Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1anam02on2086.outbound.protection.outlook.com [40.107.96.86]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC51A1F7677; Thu, 24 Feb 2022 02:29:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=jkvElXNxF/jCoif0pj50fu+5NQ6Zys3W0kVQdWE0eKEqzt9JAgbNuXOfMPlyBc9Vr3DTp9zYyh0ltpcw6AX1ave1nZPG4s4fYIZO2UCNm4pAQ+vPHXo7k2TFA0lmlQfv9VKRYzqTzKO95v7bxnIlQe1Rr+4Mczqh4n2g52qpRaYpeauPO25o3QRRqN7FTIngPLF+xKzL4dvD6wdEXvsR2Nc+YolOFwDYzK+SVu7uNvY/lsvMTp3y2cMQ16BNgiDW4pnrJgupHUu/bG++95GyxnAhzziPOB6Kn32frtP6OWcM1ah1SApZzDDRk3DQq/2UxAd0otGI0BiLPg4ul2Zkzw== 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=UYPsdyjqULzgWzqG/b68gTHjkreYemgeuy1deHa+7ww=; b=AI9862E5IEIUvV12kwoyPX6rE9jeKbx1xqKTOpbkZEwBZQw+vEvGczmX0YDNYqzC231BdlxTv0Efq+UmTIuRA3mMbp1QC1tcnNKz4qZrssPoFprv/l8Rio/UJ/fVz3d0I35BntjqwFtMpZISORkcYUnu8S9Ri3jviFiQRP7cGddQ1QWL+DP58tdqOHa2QlAxcrJ+PCZjwzdw8w1VFM30qbPDBaeKgr/d3CHrekZcw6w3Kkpn2Z9YFPIyEsRStCEmshzDsIbgsA1sY7aVXVin1TALQSXGR6SLckGMZG3ydnmn00eNgjzY9SynWIAs9juLHQtkrkx/kiSMk0AbpMJvZQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.236) smtp.rcpttodomain=chelsio.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=UYPsdyjqULzgWzqG/b68gTHjkreYemgeuy1deHa+7ww=; b=X4vBM53eySzEw9aRoO/+GVK6bNr0YGSoy6An54BqvgtewWgNz6VW9JhD34o2rM4gxL/tPqcpfhu1tJlUV3ORHn6sc6+62BdnZ/BI5dnU8xm5sgtz/yiLATpMeJr6VyK8br5DVZusg9tmwt4VXp4+N4EJyNR+XpAnt796Tmj3Tah4NrQnxRj2CKc0Xm8ZCXBmizyNU5VG3d8NaVLXw0b+1e9QK5iSX4yJeupH8L3AHISf2hAnkphS95HLc5HL22e0XLEkG0qZeQ6ddANxoYk1mLqNEJ+9FtulruEh6Cj0WfMe2L0SF1C/H5stQfjy8Gphq9dhOtMCb19tWBcMnnrPrQ== Received: from DS7PR07CA0017.namprd07.prod.outlook.com (2603:10b6:5:3af::14) by DM6PR12MB3787.namprd12.prod.outlook.com (2603:10b6:5:1c1::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5017.22; Thu, 24 Feb 2022 10:29:32 +0000 Received: from DM6NAM11FT033.eop-nam11.prod.protection.outlook.com (2603:10b6:5:3af:cafe::2f) by DS7PR07CA0017.outlook.office365.com (2603:10b6:5:3af::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5017.22 via Frontend Transport; Thu, 24 Feb 2022 10:29: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; Received: from mail.nvidia.com (12.22.5.236) by DM6NAM11FT033.mail.protection.outlook.com (10.13.172.221) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5017.22 via Frontend Transport; Thu, 24 Feb 2022 10:29:32 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by DRHQMAIL109.nvidia.com (10.27.9.19) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Thu, 24 Feb 2022 10:29:26 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.9; Thu, 24 Feb 2022 02:29:25 -0800 Received: from vdi.nvidia.com (10.127.8.14) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.986.9 via Frontend Transport; Thu, 24 Feb 2022 02:29:19 -0800 From: Jianbo Liu To: , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , Jianbo Liu Subject: [PATCH net-next v3 1/2] net: flow_offload: add tc police action parameters Date: Thu, 24 Feb 2022 10:29:07 +0000 Message-ID: <20220224102908.5255-2-jianbol@nvidia.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20220224102908.5255-1-jianbol@nvidia.com> References: <20220224102908.5255-1-jianbol@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3a051f8c-6024-4abe-afd8-08d9f7808be6 X-MS-TrafficTypeDiagnostic: DM6PR12MB3787: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: uYH5Pq3fud71qVu/yZsPQSygbN9yiSxbFOAukJB0h+ckLlVi8GkdTrIhbcgcnXl5Z1+jpCXIBE83wc+2W9tW6vZrOW4TDyPPLWasXdrV9B6WgT5yO+DSvGzKLad0KFM07u9doG3axDVCp5yRqjFYfPi8wuptbHB7r1LurxzPJM+8kzwT28y9VYu4k1Llfotg7lmnHHUx5JCwAO/vnei/AHdxXqZOjN1d2iHO4P7UoGKPWYRRkA5jck0DE7mBw+x5wsq/RmcTm6bz6qB+kdaMMf2kfacqg8hQLmzURRzMskCmlhAEsV7chd96KTWoLDw7UAy6a+C7q2+IdGKc8pxOi6Pb8c8Ltp+taahnDH8MuVONL6pjprZzTTwAVY/ZAFpDXHBCyLIPJZrLypX8KFB5SrJqM/4G+CTHdvz6AxLCJPeaveTBYvtDOv7gj9e1KoNfmyrmNuu/WHa/bfca0omYsBsYRpdHZPlI6fKzRPbeo4F4C/tbYHjshYBg5BcTICInO7logwchz1wjEiAsHEcp/TKgG0TphJHonyW175AUAkQ4FdurwJ31wpWrE2cuh6TQpfrM0xMeQ7E8m68fXQpV3CUNQLbZxeLhIn2ORZCmMnkK+xp6/30p0wO4wTlVA/S54brLOAfktS3fEpQgN2JjujAa3N7ZNUnrYr4Z3cBRjIMXXmSaAgFqtKZSu03+352wE8vViS3+3E0m6OALRKCVVg== X-Forefront-Antispam-Report: CIP:12.22.5.236;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230001)(4636009)(36840700001)(40470700004)(46966006)(7416002)(36860700001)(83380400001)(82310400004)(7696005)(8936002)(5660300002)(47076005)(508600001)(110136005)(6666004)(4326008)(8676002)(107886003)(1076003)(336012)(26005)(2616005)(54906003)(186003)(70586007)(36756003)(40460700003)(2906002)(86362001)(356005)(316002)(426003)(70206006)(81166007)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2022 10:29:32.3255 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3a051f8c-6024-4abe-afd8-08d9f7808be6 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: DM6NAM11FT033.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB3787 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" The current police offload action entry is missing exceed/notexceed actions and parameters that can be configured by tc police action. Add the missing parameters as a pre-step for offloading police actions to hardware. Signed-off-by: Jianbo Liu Signed-off-by: Roi Dayan Reviewed-by: Ido Schimmel --- include/net/flow_offload.h | 9 +++++++ include/net/tc_act/tc_police.h | 30 ++++++++++++++++++++++ net/sched/act_police.c | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h index 5b8c54eb7a6b..74f44d44abe3 100644 --- a/include/net/flow_offload.h +++ b/include/net/flow_offload.h @@ -148,6 +148,8 @@ enum flow_action_id { FLOW_ACTION_MPLS_MANGLE, FLOW_ACTION_GATE, FLOW_ACTION_PPPOE_PUSH, + FLOW_ACTION_JUMP, + FLOW_ACTION_PIPE, NUM_FLOW_ACTIONS, }; =20 @@ -235,9 +237,16 @@ struct flow_action_entry { struct { /* FLOW_ACTION_POLICE */ u32 burst; u64 rate_bytes_ps; + u64 peakrate_bytes_ps; + u32 avrate; + u16 overhead; u64 burst_pkt; u64 rate_pkt_ps; u32 mtu; + struct { + enum flow_action_id act_id; + u32 extval; + } exceed, notexceed; } police; struct { /* FLOW_ACTION_CT */ int action; diff --git a/include/net/tc_act/tc_police.h b/include/net/tc_act/tc_police.h index 72649512dcdd..283bde711a42 100644 --- a/include/net/tc_act/tc_police.h +++ b/include/net/tc_act/tc_police.h @@ -159,4 +159,34 @@ static inline u32 tcf_police_tcfp_mtu(const struct tc_= action *act) return params->tcfp_mtu; } =20 +static inline u64 tcf_police_peakrate_bytes_ps(const struct tc_action *act) +{ + struct tcf_police *police =3D to_police(act); + struct tcf_police_params *params; + + params =3D rcu_dereference_protected(police->params, + lockdep_is_held(&police->tcf_lock)); + return params->peak.rate_bytes_ps; +} + +static inline u32 tcf_police_tcfp_ewma_rate(const struct tc_action *act) +{ + struct tcf_police *police =3D to_police(act); + struct tcf_police_params *params; + + params =3D rcu_dereference_protected(police->params, + lockdep_is_held(&police->tcf_lock)); + return params->tcfp_ewma_rate; +} + +static inline u16 tcf_police_rate_overhead(const struct tc_action *act) +{ + struct tcf_police *police =3D to_police(act); + struct tcf_police_params *params; + + params =3D rcu_dereference_protected(police->params, + lockdep_is_held(&police->tcf_lock)); + return params->rate.overhead; +} + #endif /* __NET_TC_POLICE_H */ diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 0923aa2b8f8a..a2275eef6877 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c @@ -405,20 +405,66 @@ static int tcf_police_search(struct net *net, struct = tc_action **a, u32 index) return tcf_idr_search(tn, a, index); } =20 +static int tcf_police_act_to_flow_act(int tc_act, u32 *extval) +{ + int act_id =3D -EOPNOTSUPP; + + if (!TC_ACT_EXT_OPCODE(tc_act)) { + if (tc_act =3D=3D TC_ACT_OK) + act_id =3D FLOW_ACTION_ACCEPT; + else if (tc_act =3D=3D TC_ACT_SHOT) + act_id =3D FLOW_ACTION_DROP; + else if (tc_act =3D=3D TC_ACT_PIPE) + act_id =3D FLOW_ACTION_PIPE; + } else if (TC_ACT_EXT_CMP(tc_act, TC_ACT_GOTO_CHAIN)) { + act_id =3D FLOW_ACTION_GOTO; + *extval =3D tc_act & TC_ACT_EXT_VAL_MASK; + } else if (TC_ACT_EXT_CMP(tc_act, TC_ACT_JUMP)) { + act_id =3D FLOW_ACTION_JUMP; + *extval =3D tc_act & TC_ACT_EXT_VAL_MASK; + } + + return act_id; +} + static int tcf_police_offload_act_setup(struct tc_action *act, void *entry= _data, u32 *index_inc, bool bind) { if (bind) { struct flow_action_entry *entry =3D entry_data; + struct tcf_police *police =3D to_police(act); + struct tcf_police_params *p; + int act_id; + + p =3D rcu_dereference_protected(police->params, + lockdep_is_held(&police->tcf_lock)); =20 entry->id =3D FLOW_ACTION_POLICE; entry->police.burst =3D tcf_police_burst(act); entry->police.rate_bytes_ps =3D tcf_police_rate_bytes_ps(act); + entry->police.peakrate_bytes_ps =3D tcf_police_peakrate_bytes_ps(act); + entry->police.avrate =3D tcf_police_tcfp_ewma_rate(act); + entry->police.overhead =3D tcf_police_rate_overhead(act); entry->police.burst_pkt =3D tcf_police_burst_pkt(act); entry->police.rate_pkt_ps =3D tcf_police_rate_pkt_ps(act); entry->police.mtu =3D tcf_police_tcfp_mtu(act); + + act_id =3D tcf_police_act_to_flow_act(police->tcf_action, + &entry->police.exceed.extval); + if (act_id < 0) + return act_id; + + entry->police.exceed.act_id =3D act_id; + + act_id =3D tcf_police_act_to_flow_act(p->tcfp_result, + &entry->police.notexceed.extval); + if (act_id < 0) + return act_id; + + entry->police.notexceed.act_id =3D act_id; + *index_inc =3D 1; } else { struct flow_offload_action *fl_action =3D entry_data; --=20 2.26.2 From nobody Thu Jun 25 02:01:46 2026 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 0283BC433EF for ; Thu, 24 Feb 2022 10:29:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233472AbiBXKaP (ORCPT ); Thu, 24 Feb 2022 05:30:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48862 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233452AbiBXKaJ (ORCPT ); Thu, 24 Feb 2022 05:30:09 -0500 Received: from NAM10-DM6-obe.outbound.protection.outlook.com (mail-dm6nam10on2081.outbound.protection.outlook.com [40.107.93.81]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5BEE4208317; Thu, 24 Feb 2022 02:29:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GyCEUkps0YcX0W3Z3RcWj33d0aDcnQ+Psg23jnzFOvfyi4Yt81vZXt5JIaEXiDV6fC/0r6AuWjRI/62DCoq8majRXoJ29zByTggtPdTpCqaOwG/EhY6d0IaKuzWe8QDQFoBDx98fJGy9VvfI5dAbvblaYvKHq6Ab8mKKtv9fTTfFFum1U0aF973c7D4E435ZpdFCqvYiklEFV3mU56xsTXXX0P0Qfuw21XK7igEekcm0HnbrOXSh004WYE5lVB+d/j34VVzcgRq0ftoycR3Sri07eweOWp3yVFMFfNeRmgbc3qULzkB0YXbslELGgdjUmOrTGdppIVGW2E7aj2+vWA== 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=9sG4sMU+f25ko6uxOEJjSbo0JnXZk9jB0T28nQTkAUo=; b=mFhQcw2bI4wLv3xVqhEFhv+b3q1lD2aLcZVQa8Tp6JpT57OqP8TZp7NyK8ppJOykrsbaYrkEJxNx1f70KNSnmU3ccTnf8ngp7WHIvZAcg9h4cf/uYyLcZ5K6RopReFIoPFWiQhXMXuShz2REy9YYDpVA6S0l13Ru/TtcZG+RPBPO0F0JFY5jeLNLMuOjmDDGoUJjt6lixGt/M8H2PY77OIPpeOrCqBDbXmxniu/RDkG+ltZdrl+2haGG2PgNHn2hNnehK5wDn75NrNVLInkSsOMC74nqoecOAVbSNPtEip0REG6/AgZiQD0aRObj9QjqesCiEEcqINWvH/7fhTd3Wg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.236) smtp.rcpttodomain=chelsio.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=9sG4sMU+f25ko6uxOEJjSbo0JnXZk9jB0T28nQTkAUo=; b=MoQk0dzU6GQ92REp7Hw7/SyFO2xVKOIABM3c/J23JXeJ4l4QWj7XxEmiimvxKNM7dLGQnRe7HCW8wsVSypd3rC9ktOVS0MZA7thhAbrbTXPsCNNvBIRavDe0oQQs51YH+Ck56T2ZyTHaXa1paH6hAtWhmG/gZ3SPVzdtCqT+/0XEfB2M0EGFovgtpj2+Fz6nuj7zluw7ODXfrPqcaWGl6rt3GRtjHXzwOlEcPd0+y65C5bAdeJNJuKvhWZj6ETPMtsl41REycLIbfkgofmBS2nbOxUJ8u9pMmFcAoMqWoY5buCgIVBHD0TEIkAotPNNTCOjNfye5YLX2bMw/Q0cZbg== Received: from DS7PR07CA0003.namprd07.prod.outlook.com (2603:10b6:5:3af::11) by MN2PR12MB4063.namprd12.prod.outlook.com (2603:10b6:208:1dc::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5017.22; Thu, 24 Feb 2022 10:29:34 +0000 Received: from DM6NAM11FT033.eop-nam11.prod.protection.outlook.com (2603:10b6:5:3af:cafe::d6) by DS7PR07CA0003.outlook.office365.com (2603:10b6:5:3af::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5017.21 via Frontend Transport; Thu, 24 Feb 2022 10:29:34 +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; Received: from mail.nvidia.com (12.22.5.236) by DM6NAM11FT033.mail.protection.outlook.com (10.13.172.221) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5017.22 via Frontend Transport; Thu, 24 Feb 2022 10:29:34 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by DRHQMAIL109.nvidia.com (10.27.9.19) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Thu, 24 Feb 2022 10:29:33 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.9; Thu, 24 Feb 2022 02:29:33 -0800 Received: from vdi.nvidia.com (10.127.8.14) by mail.nvidia.com (10.129.68.9) with Microsoft SMTP Server id 15.2.986.9 via Frontend Transport; Thu, 24 Feb 2022 02:29:26 -0800 From: Jianbo Liu To: , , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , Jianbo Liu Subject: [PATCH net-next v3 2/2] flow_offload: reject offload for all drivers with invalid police parameters Date: Thu, 24 Feb 2022 10:29:08 +0000 Message-ID: <20220224102908.5255-3-jianbol@nvidia.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20220224102908.5255-1-jianbol@nvidia.com> References: <20220224102908.5255-1-jianbol@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ccc2b240-6cdd-450b-af7c-08d9f7808d2f X-MS-TrafficTypeDiagnostic: MN2PR12MB4063: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: jMCLY0ySn+bqzd/opXzLflec0HHRwpIeE4Zj7FSvdkqR+pznQG6JCU6U0OuQoipb5sO66fy5XZY2aJAWDebcWPZuYTatUTNVjeGnAPrQihtNzvM2h/y2+5+jGuRPSXBCjFud9MjCNYfLvOqTGspbSNVF1Abxt4lBUyu1SKFOPXBPHzpQIfXodT2WVp+iFqqhsc/4MKwDKBJ7hZrJcmfKWLuoJaAT7RvZT5hArfmvqc7qLBkSQ455swX805UFO4nTo1fobDMBdTRPzVbj/LMl3dDsDXh4ZYSN7mUm8ydmw6hj5THGFE/E/YEmU1qfyoCDkVH63W5X1DHxe8AZ1ZgmtGrkaB6u/xRIxtEo7cuW3ADtuQMjBvp3mR0BkPuezqm4HdRgoJAIzQgNb7BMx3iTz27AnH6Qtlm60MgGQ1v3xYuEf031VAwWG8oxC/jEqmWNW+9UCrfd/Fh6rpInhbkdZPXvnK2HDcQHwR1yCqZooEn9LO7KL+kQP5Ghr9Ezjh1iAv/RhopBrNSM4QtFwn7k2m98ubtnmYDpNeYE5/8iIek3PLihEAEKdoylrBlEWpKKw9T4IaAFTpOWgXSrYjQ2+GlyIZ5wQeor45Z/y8DHLxKs7gwI31mozLWDkuiS56DSefC/JcXidSP4rIu86rABrtttG4ctophTl6yDOeWIzmRsPCVbBjgRztJ8RUc/rAguasVsEiwp3OVrmUKIsjQLEw== X-Forefront-Antispam-Report: CIP:12.22.5.236;CTRY:US;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:mail.nvidia.com;PTR:InfoNoRecords;CAT:NONE;SFS:(13230001)(4636009)(46966006)(40470700004)(36840700001)(40460700003)(86362001)(508600001)(7696005)(8936002)(36756003)(81166007)(30864003)(5660300002)(426003)(336012)(2906002)(54906003)(110136005)(7416002)(83380400001)(107886003)(316002)(26005)(4326008)(70586007)(1076003)(8676002)(36860700001)(2616005)(186003)(82310400004)(356005)(6666004)(70206006)(47076005)(36900700001);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2022 10:29:34.4973 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ccc2b240-6cdd-450b-af7c-08d9f7808d2f 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: DM6NAM11FT033.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4063 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" As more police parameters are passed to flow_offload, driver can check them to make sure hardware handles packets in the way indicated by tc. The conform-exceed control should be drop/pipe or drop/ok. Besides, for drop/ok, the police should be the last action. As hardware can't configure peakrate/avrate/overhead, offload should not be supported if any of them is configured. Signed-off-by: Jianbo Liu Reviewed-by: Ido Schimmel --- drivers/net/dsa/sja1105/sja1105_flower.c | 47 +++++++++++++-- .../chelsio/cxgb4/cxgb4_tc_matchall.c | 59 +++++++++++++++---- .../net/ethernet/freescale/enetc/enetc_qos.c | 47 +++++++++++++-- .../ethernet/marvell/octeontx2/nic/otx2_tc.c | 43 ++++++++++++++ .../net/ethernet/mellanox/mlx5/core/en_tc.c | 48 +++++++++++++-- .../ethernet/mellanox/mlxsw/spectrum_flower.c | 47 +++++++++++++-- drivers/net/ethernet/mscc/ocelot_flower.c | 14 +++-- drivers/net/ethernet/mscc/ocelot_net.c | 10 ++-- drivers/net/ethernet/mscc/ocelot_police.c | 41 +++++++++++++ drivers/net/ethernet/mscc/ocelot_police.h | 5 ++ .../ethernet/netronome/nfp/flower/qos_conf.c | 40 +++++++++++++ include/net/flow_offload.h | 6 ++ 12 files changed, 369 insertions(+), 38 deletions(-) diff --git a/drivers/net/dsa/sja1105/sja1105_flower.c b/drivers/net/dsa/sja= 1105/sja1105_flower.c index 7dcdd784aea4..fad5afe3819c 100644 --- a/drivers/net/dsa/sja1105/sja1105_flower.c +++ b/drivers/net/dsa/sja1105/sja1105_flower.c @@ -300,6 +300,46 @@ static int sja1105_flower_parse_key(struct sja1105_pri= vate *priv, return -EOPNOTSUPP; } =20 +static int sja1105_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + if (act->police.rate_pkt_ps) { + NL_SET_ERR_MSG_MOD(extack, + "QoS offload not support packets per second"); + return -EOPNOTSUPP; + } + + return 0; +} + int sja1105_cls_flower_add(struct dsa_switch *ds, int port, struct flow_cls_offload *cls, bool ingress) { @@ -321,12 +361,9 @@ int sja1105_cls_flower_add(struct dsa_switch *ds, int = port, flow_action_for_each(i, act, &rule->action) { switch (act->id) { case FLOW_ACTION_POLICE: - if (act->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, - "QoS offload not support packets per second"); - rc =3D -EOPNOTSUPP; + rc =3D sja1105_policer_validate(&rule->action, act, extack); + if (rc) goto out; - } =20 rc =3D sja1105_flower_policer(priv, port, extack, cookie, &key, diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c b/drive= rs/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c index 28fd2de9e4cf..1672d3afe5be 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_matchall.c @@ -8,6 +8,46 @@ #include "cxgb4_filter.h" #include "cxgb4_tc_flower.h" =20 +static int cxgb4_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + if (act->police.rate_pkt_ps) { + NL_SET_ERR_MSG_MOD(extack, + "QoS offload not support packets per second"); + return -EOPNOTSUPP; + } + + return 0; +} + static int cxgb4_matchall_egress_validate(struct net_device *dev, struct tc_cls_matchall_offload *cls) { @@ -48,11 +88,10 @@ static int cxgb4_matchall_egress_validate(struct net_de= vice *dev, flow_action_for_each(i, entry, actions) { switch (entry->id) { case FLOW_ACTION_POLICE: - if (entry->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, - "QoS offload not support packets per second"); - return -EOPNOTSUPP; - } + ret =3D cxgb4_policer_validate(actions, entry, extack); + if (ret) + return ret; + /* Convert bytes per second to bits per second */ if (entry->police.rate_bytes_ps * 8 > max_link_rate) { NL_SET_ERR_MSG_MOD(extack, @@ -150,11 +189,11 @@ static int cxgb4_matchall_alloc_tc(struct net_device = *dev, flow_action_for_each(i, entry, &cls->rule->action) if (entry->id =3D=3D FLOW_ACTION_POLICE) break; - if (entry->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, - "QoS offload not support packets per second"); - return -EOPNOTSUPP; - } + + ret =3D cxgb4_policer_validate(&cls->rule->action, entry, extack); + if (ret) + return ret; + /* Convert from bytes per second to Kbps */ p.u.params.maxrate =3D div_u64(entry->police.rate_bytes_ps * 8, 1000); p.u.params.channel =3D pi->tx_chan; diff --git a/drivers/net/ethernet/freescale/enetc/enetc_qos.c b/drivers/net= /ethernet/freescale/enetc/enetc_qos.c index 3555c12edb45..6782a76aeaf6 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc_qos.c +++ b/drivers/net/ethernet/freescale/enetc/enetc_qos.c @@ -1074,6 +1074,46 @@ static struct actions_fwd *enetc_check_flow_actions(= u64 acts, return NULL; } =20 +static int enetc_psfp_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + if (act->police.rate_pkt_ps) { + NL_SET_ERR_MSG_MOD(extack, + "QoS offload not support packets per second"); + return -EOPNOTSUPP; + } + + return 0; +} + static int enetc_psfp_parse_clsflower(struct enetc_ndev_priv *priv, struct flow_cls_offload *f) { @@ -1230,11 +1270,10 @@ static int enetc_psfp_parse_clsflower(struct enetc_= ndev_priv *priv, =20 /* Flow meter and max frame size */ if (entryp) { - if (entryp->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second"= ); - err =3D -EOPNOTSUPP; + err =3D enetc_psfp_policer_validate(&rule->action, entryp, extack); + if (err) goto free_sfi; - } + if (entryp->police.burst) { fmi =3D kzalloc(sizeof(*fmi), GFP_KERNEL); if (!fmi) { diff --git a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c b/drivers= /net/ethernet/marvell/octeontx2/nic/otx2_tc.c index 626961a41089..8c90be81677d 100644 --- a/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c +++ b/drivers/net/ethernet/marvell/octeontx2/nic/otx2_tc.c @@ -190,6 +190,40 @@ static int otx2_tc_validate_flow(struct otx2_nic *nic, return 0; } =20 +static int otx2_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + return 0; +} + static int otx2_tc_egress_matchall_install(struct otx2_nic *nic, struct tc_cls_matchall_offload *cls) { @@ -212,6 +246,10 @@ static int otx2_tc_egress_matchall_install(struct otx2= _nic *nic, entry =3D &cls->rule->action.entries[0]; switch (entry->id) { case FLOW_ACTION_POLICE: + err =3D otx2_policer_validate(&cls->rule->action, entry, extack); + if (err) + return err; + if (entry->police.rate_pkt_ps) { NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second"= ); return -EOPNOTSUPP; @@ -315,6 +353,7 @@ static int otx2_tc_parse_actions(struct otx2_nic *nic, u8 nr_police =3D 0; bool pps =3D false; u64 rate; + int err; int i; =20 if (!flow_action_has_entries(flow_action)) { @@ -355,6 +394,10 @@ static int otx2_tc_parse_actions(struct otx2_nic *nic, return -EOPNOTSUPP; } =20 + err =3D otx2_policer_validate(flow_action, act, extack); + if (err) + return err; + if (act->police.rate_bytes_ps > 0) { rate =3D act->police.rate_bytes_ps * 8; burst =3D act->police.burst; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/= ethernet/mellanox/mlx5/core/en_tc.c index 1287193a019b..69a2f8d52b2b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -4170,6 +4170,46 @@ static int apply_police_params(struct mlx5e_priv *pr= iv, u64 rate, return err; } =20 +static int mlx5e_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + if (act->police.rate_pkt_ps) { + NL_SET_ERR_MSG_MOD(extack, + "QoS offload not support packets per second"); + return -EOPNOTSUPP; + } + + return 0; +} + static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv, struct flow_action *flow_action, struct netlink_ext_ack *extack) @@ -4197,10 +4237,10 @@ static int scan_tc_matchall_fdb_actions(struct mlx5= e_priv *priv, flow_action_for_each(i, act, flow_action) { switch (act->id) { case FLOW_ACTION_POLICE: - if (act->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second= "); - return -EOPNOTSUPP; - } + err =3D mlx5e_policer_validate(flow_action, act, extack); + if (err) + return err; + err =3D apply_police_params(priv, act->police.rate_bytes_ps, extack); if (err) return err; diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c b/driver= s/net/ethernet/mellanox/mlxsw/spectrum_flower.c index bb417db773b9..8c31b73088bb 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_flower.c @@ -15,6 +15,46 @@ #include "spectrum.h" #include "core_acl_flex_keys.h" =20 +static int mlxsw_sp_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + if (act->police.rate_pkt_ps) { + NL_SET_ERR_MSG_MOD(extack, + "QoS offload not support packets per second"); + return -EOPNOTSUPP; + } + + return 0; +} + static int mlxsw_sp_flower_parse_actions(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_flow_block *block, struct mlxsw_sp_acl_rule_info *rulei, @@ -191,10 +231,9 @@ static int mlxsw_sp_flower_parse_actions(struct mlxsw_= sp *mlxsw_sp, return -EOPNOTSUPP; } =20 - if (act->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, "QoS offload not support packets per second= "); - return -EOPNOTSUPP; - } + err =3D mlxsw_sp_policer_validate(flow_action, act, extack); + if (err) + return err; =20 /* The kernel might adjust the requested burst size so * that it is not exactly a power of two. Re-adjust it diff --git a/drivers/net/ethernet/mscc/ocelot_flower.c b/drivers/net/ethern= et/mscc/ocelot_flower.c index 949858891973..70191ba9d8af 100644 --- a/drivers/net/ethernet/mscc/ocelot_flower.c +++ b/drivers/net/ethernet/mscc/ocelot_flower.c @@ -6,6 +6,7 @@ #include #include #include +#include "ocelot_police.h" #include "ocelot_vcap.h" =20 /* Arbitrarily chosen constants for encoding the VCAP block and lookup num= ber @@ -217,6 +218,7 @@ static int ocelot_flower_parse_action(struct ocelot *oc= elot, int port, bool ingress, struct flow_cls_offload *f, struct ocelot_vcap_filter *filter) { + const struct flow_action *action =3D &f->rule->action; struct netlink_ext_ack *extack =3D f->common.extack; bool allow_missing_goto_target =3D false; const struct flow_action_entry *a; @@ -244,7 +246,7 @@ static int ocelot_flower_parse_action(struct ocelot *oc= elot, int port, filter->goto_target =3D -1; filter->type =3D OCELOT_VCAP_FILTER_DUMMY; =20 - flow_action_for_each(i, a, &f->rule->action) { + flow_action_for_each(i, a, action) { switch (a->id) { case FLOW_ACTION_DROP: if (filter->block_id !=3D VCAP_IS2) { @@ -296,11 +298,11 @@ static int ocelot_flower_parse_action(struct ocelot *= ocelot, int port, "Last action must be GOTO"); return -EOPNOTSUPP; } - if (a->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, - "QoS offload not support packets per second"); - return -EOPNOTSUPP; - } + + err =3D ocelot_policer_validate(action, a, extack); + if (err) + return err; + filter->action.police_ena =3D true; =20 pol_ix =3D a->hw_index + ocelot->vcap_pol.base; diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/= mscc/ocelot_net.c index e271b6225b72..e6467831d05a 100644 --- a/drivers/net/ethernet/mscc/ocelot_net.c +++ b/drivers/net/ethernet/mscc/ocelot_net.c @@ -14,6 +14,7 @@ #include #include #include "ocelot.h" +#include "ocelot_police.h" #include "ocelot_vcap.h" #include "ocelot_fdma.h" =20 @@ -258,11 +259,10 @@ static int ocelot_setup_tc_cls_matchall(struct ocelot= _port_private *priv, return -EEXIST; } =20 - if (action->police.rate_pkt_ps) { - NL_SET_ERR_MSG_MOD(extack, - "QoS offload not support packets per second"); - return -EOPNOTSUPP; - } + err =3D ocelot_policer_validate(&f->rule->action, action, + extack); + if (err) + return err; =20 pol.rate =3D (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8; pol.burst =3D action->police.burst; diff --git a/drivers/net/ethernet/mscc/ocelot_police.c b/drivers/net/ethern= et/mscc/ocelot_police.c index 6f5068c1041a..a65606bb84a0 100644 --- a/drivers/net/ethernet/mscc/ocelot_police.c +++ b/drivers/net/ethernet/mscc/ocelot_police.c @@ -154,6 +154,47 @@ int qos_policer_conf_set(struct ocelot *ocelot, int po= rt, u32 pol_ix, return 0; } =20 +int ocelot_policer_validate(const struct flow_action *action, + const struct flow_action_entry *a, + struct netlink_ext_ack *extack) +{ + if (a->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (a->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + a->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (a->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, a)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but police action= is not last"); + return -EOPNOTSUPP; + } + + if (a->police.peakrate_bytes_ps || + a->police.avrate || a->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + if (a->police.rate_pkt_ps) { + NL_SET_ERR_MSG_MOD(extack, + "Offload does not support packets per second"); + return -EOPNOTSUPP; + } + + return 0; +} +EXPORT_SYMBOL(ocelot_policer_validate); + int ocelot_port_policer_add(struct ocelot *ocelot, int port, struct ocelot_policer *pol) { diff --git a/drivers/net/ethernet/mscc/ocelot_police.h b/drivers/net/ethern= et/mscc/ocelot_police.h index 7adb05f71999..7552995f8b17 100644 --- a/drivers/net/ethernet/mscc/ocelot_police.h +++ b/drivers/net/ethernet/mscc/ocelot_police.h @@ -8,6 +8,7 @@ #define _MSCC_OCELOT_POLICE_H_ =20 #include "ocelot.h" +#include =20 enum mscc_qos_rate_mode { MSCC_QOS_RATE_MODE_DISABLED, /* Policer/shaper disabled */ @@ -33,4 +34,8 @@ struct qos_policer_conf { int qos_policer_conf_set(struct ocelot *ocelot, int port, u32 pol_ix, struct qos_policer_conf *conf); =20 +int ocelot_policer_validate(const struct flow_action *action, + const struct flow_action_entry *a, + struct netlink_ext_ack *extack); + #endif /* _MSCC_OCELOT_POLICE_H_ */ diff --git a/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c b/drivers= /net/ethernet/netronome/nfp/flower/qos_conf.c index 784c6dbf8bc4..6c8f0e114307 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c +++ b/drivers/net/ethernet/netronome/nfp/flower/qos_conf.c @@ -67,6 +67,40 @@ struct nfp_police_stats_reply { __be64 drop_pkts; }; =20 +static int nfp_policer_validate(const struct flow_action *action, + const struct flow_action_entry *act, + struct netlink_ext_ack *extack) +{ + if (act->police.exceed.act_id !=3D FLOW_ACTION_DROP) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when exceed action is not drop"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id !=3D FLOW_ACTION_PIPE && + act->police.notexceed.act_id !=3D FLOW_ACTION_ACCEPT) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is not pipe or ok"); + return -EOPNOTSUPP; + } + + if (act->police.notexceed.act_id =3D=3D FLOW_ACTION_ACCEPT && + !flow_action_is_last_entry(action, act)) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when conform action is ok, but action is not= last"); + return -EOPNOTSUPP; + } + + if (act->police.peakrate_bytes_ps || + act->police.avrate || act->police.overhead) { + NL_SET_ERR_MSG_MOD(extack, + "Offload not supported when peakrate/avrate/overhead is configured"= ); + return -EOPNOTSUPP; + } + + return 0; +} + static int nfp_flower_install_rate_limiter(struct nfp_app *app, struct net_device *ne= tdev, struct tc_cls_matchall_offload *flow, @@ -86,6 +120,7 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, str= uct net_device *netdev, u32 pps_num =3D 0; u32 burst; u64 rate; + int err; =20 if (!nfp_netdev_is_nfp_repr(netdev)) { NL_SET_ERR_MSG_MOD(extack, "unsupported offload: qos rate limit offload = not supported on higher level port"); @@ -132,6 +167,11 @@ nfp_flower_install_rate_limiter(struct nfp_app *app, s= truct net_device *netdev, "unsupported offload: qos rate limit offload requires police actio= n"); return -EOPNOTSUPP; } + + err =3D nfp_policer_validate(&flow->rule->action, action, extack); + if (err) + return err; + if (action->police.rate_bytes_ps > 0) { if (bps_num++) { NL_SET_ERR_MSG_MOD(extack, diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h index 74f44d44abe3..92267d23083e 100644 --- a/include/net/flow_offload.h +++ b/include/net/flow_offload.h @@ -311,6 +311,12 @@ static inline bool flow_offload_has_one_action(const s= truct flow_action *action) return action->num_entries =3D=3D 1; } =20 +static inline bool flow_action_is_last_entry(const struct flow_action *act= ion, + const struct flow_action_entry *entry) +{ + return entry =3D=3D &action->entries[action->num_entries - 1]; +} + #define flow_action_for_each(__i, __act, __actions) \ for (__i =3D 0, __act =3D &(__actions)->entries[0]; \ __i < (__actions)->num_entries; \ --=20 2.26.2