From patchwork Wed Feb 20 19:32:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ido Schimmel X-Patchwork-Id: 1045556 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=mellanox.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b="tOwgmYfo"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 444SRx6SFXz9s6w for ; Thu, 21 Feb 2019 06:32:45 +1100 (AEDT) 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=3BAM6PR05MB4871=3B23?= =?iso-8859-1?q?=3AUhoTvo6uYwvm79dUDvrl8s8F3Sk/srS88AQSIlcyjQJg160O?= =?iso-8859-1?q?HG/+nBhhlCHKXpffM9F8pCn2rXi2YA9KmlBA6W3hru9xfDmCbOf?= =?iso-8859-1?q?SZRYWz/A5/MK6NGP3c8e/aiyyN+oL6fAtcNN5JNg9PGlrXN6/Gz?= =?iso-8859-1?q?zQrbuetY8n9aVyVEnhE6FuTSnNAmAEFAIVwh3OSHbXPlzK+34ZL?= =?iso-8859-1?q?qJPN0Ql8vtfiPe1CFdCQREgv5G4FSiRCd1G/rzZxIODDXbMIrTW?= =?iso-8859-1?q?AF1elnf6zoCICIpiWMuzd4DhyJpUQyzXprN1qsSqe3ZVozB8VnS?= =?iso-8859-1?q?EIIBckHpn8cUPMFEIcpZA9dhVl38yaxzYL1jpTWlDMpN54NrFEC?= =?iso-8859-1?q?afklMlfR7zmA+wrAdjCHYR7qi/BwZItsintweWzeoXSu4D5RPUb?= =?iso-8859-1?q?xNpUtHbcfbocTgMhtNlE6lda2PJN9WidXm4Qis+rJEYK1mBqurh?= =?iso-8859-1?q?rk25HY8zCEqEWl+JnnJN6/7Y6qhft5VKbKAbA52pF6Z4v8kMHT9?= =?iso-8859-1?q?Kx/AeybEf4jebmKLK0kY59SpEBmqCoxZqbbe6kWzXHxujx8dxo7?= =?iso-8859-1?q?OjPsSrqp8WvcOoR9O5odGkrdUw5vxE4m9NcjwC5won8YoQcgl+K?= =?iso-8859-1?q?dvOj5ToyIrG2IXacbhF4+2G9bp4l4I8MSGHuGDFexN89QTG5tje?= =?iso-8859-1?q?kskxMUoFuFNMLUZeMTf+HubE3XwA0cAiWnuZHMymU197cLHTO+l?= =?iso-8859-1?q?jyyiC9nltDuhdzHYvSwxCVzdNHpF2qr9EwFEmKeqEf5Kfd9OTX1?= =?iso-8859-1?q?9Gdb8Sr1JW7T4BYgb899+QDivWgzBNscfMPGp82UoM9A50cckBo?= =?iso-8859-1?q?kOvZHnDaiztEYN1eazfEqRqu6uRJs24nNnbSdgM8FvMMLTGAX35?= =?iso-8859-1?q?KvgksIsg0Ri3DSR5i/h5YmsLN+I4u4fD754NfQG5tsLVlOg+Qxf?= =?iso-8859-1?q?3nLFbnY3t8Glzve7ZQ0xk84+frGmahViwDPGHQba2glg3IZyLOe?= =?iso-8859-1?q?EmfXCW8kyfjZwq6rpemReipXi95qRiH+WTxHAsUvbMj/xL0EP0O?= =?iso-8859-1?q?OZtkxxVouY0eTAqdkQbz07D8N6Mq5EuqgBcn2yFJtq3tNDY08Z3?= =?iso-8859-1?q?pe1cyBVhSQy8fv6Dz/MmHf2q0ltZIJEIllS2j6+lFjRVEy6fyDZ?= =?iso-8859-1?q?l0fGCx4Xyoryym8d66YFtUjzUTYhSv78XklFwgpPH4/Tw2xHPAH?= =?iso-8859-1?q?GR1Uz89P3VMez/CGjZ9AQy0GnExHKUPJ6Myp8MREHpyuE7WLQ/M?= =?iso-8859-1?q?aKPLg5praSVsqyhci0FEL/UAkno6ujTI2q35c0H3H4lGFpzjH7r?= =?iso-8859-1?q?60VcOVXksR66YEe7BoSXsQiVSpTVoRy4gLak8JeRsAnCYf2VZfx?= =?iso-8859-1?q?BjKY1mxQ3seog3SVIGYOwuh9WD0whxx1AI3WqgrYd5w=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= 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[] = { [MLXSW_RES_ID_MAX_LAG_MEMBERS] = 0x2521, [MLXSW_RES_ID_MAX_BUFFER_SIZE] = 0x2802, /* Bytes */ [MLXSW_RES_ID_CELL_SIZE] = 0x2803, /* Bytes */ + [MLXSW_RES_ID_MAX_HEADROOM_SIZE] = 0x2811, /* Bytes */ [MLXSW_RES_ID_ACL_MAX_TCAM_REGIONS] = 0x2901, [MLXSW_RES_ID_ACL_MAX_TCAM_RULES] = 0x2902, [MLXSW_RES_ID_ACL_MAX_REGIONS] = 0x2903, diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/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 = !!my_pfc ? my_pfc->pfc_en : 0; u16 delay = !!my_pfc ? my_pfc->delay : 0; char pbmc_pl[MLXSW_REG_PBMC_LEN]; + u32 taken_headroom_cells = 0; + u32 max_headroom_cells; int i, j, err; + max_headroom_cells = mlxsw_sp_sb_max_headroom_cells(mlxsw_sp); + mlxsw_reg_pbmc_pack(pbmc_pl, mlxsw_sp_port->local_port, 0, 0); err = 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 = false; u16 thres_cells; u16 delay_cells; + u16 total_cells; bool lossy; for (j = 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 = mlxsw_sp_pg_buf_threshold_get(mlxsw_sp, mtu); delay_cells = 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 = thres_cells + delay_cells; + + taken_headroom_cells += total_cells; + if (taken_headroom_cells > max_headroom_cells) + return -ENOBUFS; + + mlxsw_sp_pg_buf_pack(pbmc_pl, i, total_cells, thres_cells, lossy); } diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/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); 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/drivers/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; }; @@ -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); } +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 = { 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; + if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_HEADROOM_SIZE)) + return -EIO; + mlxsw_sp->sb = kzalloc(sizeof(*mlxsw_sp->sb), GFP_KERNEL); if (!mlxsw_sp->sb) return -ENOMEM; mlxsw_sp->sb->cell_size = MLXSW_CORE_RES_GET(mlxsw_sp->core, CELL_SIZE); mlxsw_sp->sb->sb_size = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_BUFFER_SIZE); + max_headroom_size = 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 = max_headroom_size / + mlxsw_sp->sb->cell_size; + err = mlxsw_sp_sb_ports_init(mlxsw_sp); if (err) goto err_sb_ports_init;