From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6F099C43381 for ; Wed, 20 Feb 2019 19:32:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3BDD32089F for ; Wed, 20 Feb 2019 19:32:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=Mellanox.com header.i=@Mellanox.com header.b="tOwgmYfo" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727086AbfBTTco (ORCPT ); Wed, 20 Feb 2019 14:32:44 -0500 Received: from mail-eopbgr00045.outbound.protection.outlook.com ([40.107.0.45]:11872 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726994AbfBTTck (ORCPT ); Wed, 20 Feb 2019 14:32:40 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yfJDAb+FqXQkRxLkIuhDVt0f8uFukp7fEuD8pVpyBXY=; b=tOwgmYfoeZnNKslPyT6tMADRtj+uSM/OdMXGI8vaupB+zJiiUv7efTXBXQMmQibrl/ZCVSxdaOsH9lJ/WGkXmwm5eIacdkb16X7g8058ck6tQw0dq8lA/2w1v9hU3Rh88JcRRQsC6JPv4nUx+BNj6nS3TFvzFtPfscOk2NjeXLU= Received: from AM6PR05MB5240.eurprd05.prod.outlook.com (20.177.196.214) by AM6PR05MB4871.eurprd05.prod.outlook.com (20.177.34.223) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1622.19; Wed, 20 Feb 2019 19:32:29 +0000 Received: from AM6PR05MB5240.eurprd05.prod.outlook.com ([fe80::3542:889c:3a85:3866]) by AM6PR05MB5240.eurprd05.prod.outlook.com ([fe80::3542:889c:3a85:3866%5]) with mapi id 15.20.1643.014; Wed, 20 Feb 2019 19:32:29 +0000 From: Ido Schimmel To: "netdev@vger.kernel.org" CC: "davem@davemloft.net" , Jiri Pirko , Petr Machata , mlxsw , Ido Schimmel Subject: [PATCH net-next 10/10] mlxsw: spectrum_buffers: Reject overlarge headroom size requests Thread-Topic: [PATCH net-next 10/10] mlxsw: spectrum_buffers: Reject overlarge headroom size requests Thread-Index: AQHUyVMEH+Q75KUehUGJ8S21r4seng== Date: Wed, 20 Feb 2019 19:32:29 +0000 Message-ID: <20190220193141.16498-11-idosch@mellanox.com> References: <20190220193141.16498-1-idosch@mellanox.com> In-Reply-To: <20190220193141.16498-1-idosch@mellanox.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: AM6PR10CA0061.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:209:80::38) To AM6PR05MB5240.eurprd05.prod.outlook.com (2603:10a6:20b:64::22) authentication-results: spf=none (sender IP is ) smtp.mailfrom=idosch@mellanox.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.20.1 x-originating-ip: [77.138.249.209] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: f8872a84-d5b0-43ae-df60-08d6976a26d1 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600110)(711020)(4605104)(4618075)(2017052603328)(7153060)(7193020);SRVR:AM6PR05MB4871; x-ms-traffictypediagnostic: AM6PR05MB4871: x-microsoft-exchange-diagnostics: =?iso-8859-1?Q?1;AM6PR05MB4871;23:UhoTvo6uYwvm79dUDvrl8s8F3Sk/srS88AQSIlc?= =?iso-8859-1?Q?yjQJg160OHG/+nBhhlCHKXpffM9F8pCn2rXi2YA9KmlBA6W3hru9xfDmCb?= =?iso-8859-1?Q?OfSZRYWz/A5/MK6NGP3c8e/aiyyN+oL6fAtcNN5JNg9PGlrXN6/GzzQrbu?= =?iso-8859-1?Q?etY8n9aVyVEnhE6FuTSnNAmAEFAIVwh3OSHbXPlzK+34ZLqJPN0Ql8vtfi?= =?iso-8859-1?Q?Pe1CFdCQREgv5G4FSiRCd1G/rzZxIODDXbMIrTWAF1elnf6zoCICIpiWMu?= =?iso-8859-1?Q?zd4DhyJpUQyzXprN1qsSqe3ZVozB8VnSEIIBckHpn8cUPMFEIcpZA9dhVl?= =?iso-8859-1?Q?38yaxzYL1jpTWlDMpN54NrFECafklMlfR7zmA+wrAdjCHYR7qi/BwZItsi?= =?iso-8859-1?Q?ntweWzeoXSu4D5RPUbxNpUtHbcfbocTgMhtNlE6lda2PJN9WidXm4Qis+r?= =?iso-8859-1?Q?JEYK1mBqurhrk25HY8zCEqEWl+JnnJN6/7Y6qhft5VKbKAbA52pF6Z4v8k?= =?iso-8859-1?Q?MHT9Kx/AeybEf4jebmKLK0kY59SpEBmqCoxZqbbe6kWzXHxujx8dxo7OjP?= =?iso-8859-1?Q?sSrqp8WvcOoR9O5odGkrdUw5vxE4m9NcjwC5won8YoQcgl+KdvOj5ToyIr?= =?iso-8859-1?Q?G2IXacbhF4+2G9bp4l4I8MSGHuGDFexN89QTG5tjekskxMUoFuFNMLUZeM?= =?iso-8859-1?Q?Tf+HubE3XwA0cAiWnuZHMymU197cLHTO+ljyyiC9nltDuhdzHYvSwxCVzd?= =?iso-8859-1?Q?NHpF2qr9EwFEmKeqEf5Kfd9OTX19Gdb8Sr1JW7T4BYgb899+QDivWgzBNs?= =?iso-8859-1?Q?cfMPGp82UoM9A50cckBokOvZHnDaiztEYN1eazfEqRqu6uRJs24nNnbSdg?= =?iso-8859-1?Q?M8FvMMLTGAX35KvgksIsg0Ri3DSR5i/h5YmsLN+I4u4fD754NfQG5tsLVl?= =?iso-8859-1?Q?Og+Qxf3nLFbnY3t8Glzve7ZQ0xk84+frGmahViwDPGHQba2glg3IZyLOeE?= =?iso-8859-1?Q?mfXCW8kyfjZwq6rpemReipXi95qRiH+WTxHAsUvbMj/xL0EP0OOZtkxxVo?= =?iso-8859-1?Q?uY0eTAqdkQbz07D8N6Mq5EuqgBcn2yFJtq3tNDY08Z3pe1cyBVhSQy8fv6?= =?iso-8859-1?Q?Dz/MmHf2q0ltZIJEIllS2j6+lFjRVEy6fyDZl0fGCx4Xyoryym8d66YFtU?= =?iso-8859-1?Q?jzUTYhSv78XklFwgpPH4/Tw2xHPAHGR1Uz89P3VMez/CGjZ9AQy0GnExHK?= =?iso-8859-1?Q?UPJ6Myp8MREHpyuE7WLQ/MaKPLg5praSVsqyhci0FEL/UAkno6ujTI2q35?= =?iso-8859-1?Q?c0H3H4lGFpzjH7r60VcOVXksR66YEe7BoSXsQiVSpTVoRy4gLak8JeRsAn?= =?iso-8859-1?Q?CYf2VZfxBjKY1mxQ3seog3SVIGYOwuh9WD0whxx1AI3WqgrYd5w=3D=3D?= x-microsoft-antispam-prvs: x-forefront-prvs: 0954EE4910 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(136003)(376002)(396003)(39860400002)(346002)(366004)(199004)(189003)(486006)(86362001)(446003)(2616005)(4326008)(2351001)(478600001)(2906002)(105586002)(106356001)(11346002)(107886003)(476003)(68736007)(6916009)(54906003)(316002)(25786009)(6506007)(26005)(102836004)(386003)(53936002)(186003)(6116002)(3846002)(52116002)(99286004)(97736004)(2501003)(256004)(81156014)(6512007)(6486002)(50226002)(5640700003)(81166006)(305945005)(8936002)(7736002)(8676002)(1730700003)(14454004)(76176011)(1076003)(5660300002)(71190400001)(71200400001)(66066001)(14444005)(36756003)(6436002)(309714004);DIR:OUT;SFP:1101;SCL:1;SRVR:AM6PR05MB4871;H:AM6PR05MB5240.eurprd05.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: BHnAu0v/NaUEFckVaoo0b9LzZIbeWro0jIdPJtwEXTJospoU0xV8ENYGzTUTsNoT3d76r0RMHF86l/zEroJCFqUcLrHIarIEuCvle5yusASW7oMqXN+q2kOA5O/ZqTU43PedkU4XUCRlUziMP45ytjfvXH+i07jnbIQh9I6fm1lFX36OfISeGX8oxX6JXKJfgNKnGe0UEyYSEft7txxKtn6DZN9lhcRPcXd+PLre3NuofF8B+QqpfUJgV8SzCeutO/1MufUUSUTeAG5559drYTQJzsxt2BqFBOGTOF5UGnZ6y1KH3aBzXs8OORQRnF+XKF8+HVF7jbzB80lK5YZCzUvJNbLG/gR0SSvjmXkvbviLFt73GuyXVAXlsr4vvdXfZ/7gCgTWgMTHIic8d1U3D2y+Khr0WjAahoQT7c1lqUQ= Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: f8872a84-d5b0-43ae-df60-08d6976a26d1 X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Feb 2019 19:32:28.0841 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR05MB4871 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Petr Machata cap_max_headroom_size holds maximum headroom size supported. Overstepping that limit might under certain conditions lead to ASIC freeze. Query and store the value, and add mlxsw_sp_sb_max_headroom_cells() for obtaining the stored value. In __mlxsw_sp_port_headroom_set(), reject requests where the total port buffer is larger than the advertised maximum. Signed-off-by: Petr Machata Signed-off-by: Ido Schimmel --- drivers/net/ethernet/mellanox/mlxsw/resources.h | 2 ++ drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 13 ++++++++++++- drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 1 + .../ethernet/mellanox/mlxsw/spectrum_buffers.c | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/resources.h b/drivers/net/= ethernet/mellanox/mlxsw/resources.h index b8b3a01c2a9e..773ef7fdb285 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/resources.h +++ b/drivers/net/ethernet/mellanox/mlxsw/resources.h @@ -26,6 +26,7 @@ enum mlxsw_res_id { MLXSW_RES_ID_MAX_LAG_MEMBERS, MLXSW_RES_ID_MAX_BUFFER_SIZE, MLXSW_RES_ID_CELL_SIZE, + MLXSW_RES_ID_MAX_HEADROOM_SIZE, MLXSW_RES_ID_ACL_MAX_TCAM_REGIONS, MLXSW_RES_ID_ACL_MAX_TCAM_RULES, MLXSW_RES_ID_ACL_MAX_REGIONS, @@ -79,6 +80,7 @@ static u16 mlxsw_res_ids[] =3D { [MLXSW_RES_ID_MAX_LAG_MEMBERS] =3D 0x2521, [MLXSW_RES_ID_MAX_BUFFER_SIZE] =3D 0x2802, /* Bytes */ [MLXSW_RES_ID_CELL_SIZE] =3D 0x2803, /* Bytes */ + [MLXSW_RES_ID_MAX_HEADROOM_SIZE] =3D 0x2811, /* Bytes */ [MLXSW_RES_ID_ACL_MAX_TCAM_REGIONS] =3D 0x2901, [MLXSW_RES_ID_ACL_MAX_TCAM_RULES] =3D 0x2902, [MLXSW_RES_ID_ACL_MAX_REGIONS] =3D 0x2903, diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/e= thernet/mellanox/mlxsw/spectrum.c index c1ec4f89973b..f018b0607dac 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -852,8 +852,12 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port = *mlxsw_sp_port, int mtu, u8 pfc_en =3D !!my_pfc ? my_pfc->pfc_en : 0; u16 delay =3D !!my_pfc ? my_pfc->delay : 0; char pbmc_pl[MLXSW_REG_PBMC_LEN]; + u32 taken_headroom_cells =3D 0; + u32 max_headroom_cells; int i, j, err; =20 + max_headroom_cells =3D mlxsw_sp_sb_max_headroom_cells(mlxsw_sp); + mlxsw_reg_pbmc_pack(pbmc_pl, mlxsw_sp_port->local_port, 0, 0); err =3D mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(pbmc), pbmc_pl); if (err) @@ -864,6 +868,7 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *= mlxsw_sp_port, int mtu, bool pfc =3D false; u16 thres_cells; u16 delay_cells; + u16 total_cells; bool lossy; =20 for (j =3D 0; j < IEEE_8021QAZ_MAX_TCS; j++) { @@ -881,7 +886,13 @@ int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port = *mlxsw_sp_port, int mtu, thres_cells =3D mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu); delay_cells =3D mlxsw_sp_pg_buf_delay_get(mlxsw_sp, mtu, delay, pfc, pause_en); - mlxsw_sp_pg_buf_pack(pbmc_pl, i, thres_cells + delay_cells, + total_cells =3D thres_cells + delay_cells; + + taken_headroom_cells +=3D total_cells; + if (taken_headroom_cells > max_headroom_cells) + return -ENOBUFS; + + mlxsw_sp_pg_buf_pack(pbmc_pl, i, total_cells, thres_cells, lossy); } =20 diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/e= thernet/mellanox/mlxsw/spectrum.h index 976843917c95..8bb83d0facc2 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h @@ -373,6 +373,7 @@ int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_= port *mlxsw_core_port, u32 *p_cur, u32 *p_max); u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells); u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes); +u32 mlxsw_sp_sb_max_headroom_cells(const struct mlxsw_sp *mlxsw_sp); =20 extern const struct mlxsw_sp_sb_vals mlxsw_sp1_sb_vals; extern const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals; diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drive= rs/net/ethernet/mellanox/mlxsw/spectrum_buffers.c index 65ef4a9f6afb..9a79b5e11597 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c @@ -85,6 +85,7 @@ struct mlxsw_sp_sb { struct mlxsw_sp_sb_pr *prs; struct mlxsw_sp_sb_port *ports; u32 cell_size; + u32 max_headroom_cells; u64 sb_size; }; =20 @@ -113,6 +114,11 @@ u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_= sp, u32 bytes) return DIV_ROUND_UP(bytes, mlxsw_sp->sb->cell_size); } =20 +u32 mlxsw_sp_sb_max_headroom_cells(const struct mlxsw_sp *mlxsw_sp) +{ + return mlxsw_sp->sb->max_headroom_cells; +} + static struct mlxsw_sp_sb_pr *mlxsw_sp_sb_pr_get(struct mlxsw_sp *mlxsw_sp= , u16 pool_index) { @@ -789,6 +795,7 @@ const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals =3D { =20 int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp) { + u32 max_headroom_size; u16 ing_pool_count; u16 eg_pool_count; int err; @@ -799,12 +806,21 @@ int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp) if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_BUFFER_SIZE)) return -EIO; =20 + if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_HEADROOM_SIZE)) + return -EIO; + mlxsw_sp->sb =3D kzalloc(sizeof(*mlxsw_sp->sb), GFP_KERNEL); if (!mlxsw_sp->sb) return -ENOMEM; mlxsw_sp->sb->cell_size =3D MLXSW_CORE_RES_GET(mlxsw_sp->core, CELL_SIZE)= ; mlxsw_sp->sb->sb_size =3D MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_BUFFER_SIZE); + max_headroom_size =3D MLXSW_CORE_RES_GET(mlxsw_sp->core, + MAX_HEADROOM_SIZE); + /* Round down, because this limit must not be overstepped. */ + mlxsw_sp->sb->max_headroom_cells =3D max_headroom_size / + mlxsw_sp->sb->cell_size; + err =3D mlxsw_sp_sb_ports_init(mlxsw_sp); if (err) goto err_sb_ports_init; --=20 2.20.1