From patchwork Fri Sep 10 04:23:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rongwei Liu X-Patchwork-Id: 98538 X-Patchwork-Delegate: rasland@nvidia.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C20CEA0547; Fri, 10 Sep 2021 06:24:13 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 899C340DFD; Fri, 10 Sep 2021 06:24:10 +0200 (CEST) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2082.outbound.protection.outlook.com [40.107.92.82]) by mails.dpdk.org (Postfix) with ESMTP id 2802940DF7 for ; Fri, 10 Sep 2021 06:24:09 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QGJjOsAJjCiiSNVtCSOfpy3b6xFOdfLxPAL6d7fJauAZPhBFkIUSdK6Ff/EXSP4hd+k21DCNS3cWIia5gmsSToqMljncCRX5BZQjubcuiYfuRI58JQBsgX6i/T+D6DpqdeYHwfB73HEhKf0Kvy0GYESG59NRzJLWLOboADkTHsNdtApz8VpIaAQPxFteWwV3zU2IlfQki/Xc4wjyEpvZLgfTud1pEQn4INR3bMvU88twgyaMfZDbCi4FGVhfxKaKEapPAD+PrYODX5fxMD7JzK688vaSppfhE6h4tGbR8V94g79I4qsCn4FYdUiL0xumZlu7LrdX2R5ue9/ovyhG8Q== 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; bh=1cPldtz69Bk7d6NOOJ+s+4NahDSRsiD1t1N/d/+XLAE=; b=Zn7cMUChE63jg5KlCbzSW8reE9lkGJVjdHsOiDd7MOv4CA5rx/8KJvxZM3TIAncobct0IhjM4HBKmQWUns+KxPF4GGoiSFsvZ2QWXjMS+0gqckoil9JPQiNww6dHIqGJmMtlHY/9B8TUqmd+NSlMMstT+W2gtJW0ogRNHj1Rfvap2lmT37Iv6kqRO+2OXiIrOaNJSwJ1PhTqhtmxScXeIlSxPVFMxmECyo2rzXH4uEaUlWXsSamvuJEJhZlzpPQEglxjbHVALaO8bRUYuI+h4Gy3cRnwy2N8OI2rCU1/q1sk12z+s+sSVsn2IqswNe1xna46+0XDHC2Wh1/4XDgV7Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.36) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com; dmarc=pass (p=quarantine sp=none 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=1cPldtz69Bk7d6NOOJ+s+4NahDSRsiD1t1N/d/+XLAE=; b=W8Nb1aNRD8V56kl6r4wmZjn5AToWmipGP7Mx6aoW3Q8KkeMTsl1C/UpcMpUzKW2oH+b3rbyZF4jZdJJCa5jLYNHzI93zNF3JJ4eHbpxctAri4bJzjFoi/FEizACrT+RfXrbAoilAqRrtbjk6BH8/SMIqmGQI08UYuWmhni5emdhlIipinx2h8gomZL8NMLBdABj6TmWg9RlB+Hb7ILil+3sIHdnMZ1pe6qICUpJFDtE4M22UgnVOwRLltnohKqynO4K+4Q3qel1iZg2iGSk0VRzeTeWjJW4qkVMzdxR+k33Kk2eGk9PqoVunIRjycwoQNydemot1WqIblGOTTO5p3A== Received: from DM6PR02CA0142.namprd02.prod.outlook.com (2603:10b6:5:332::9) by DM6PR12MB3372.namprd12.prod.outlook.com (2603:10b6:5:11b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4478.24; Fri, 10 Sep 2021 04:24:06 +0000 Received: from DM6NAM11FT017.eop-nam11.prod.protection.outlook.com (2603:10b6:5:332:cafe::a3) by DM6PR02CA0142.outlook.office365.com (2603:10b6:5:332::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4500.14 via Frontend Transport; Fri, 10 Sep 2021 04:24:06 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.36) smtp.mailfrom=nvidia.com; monjalon.net; dkim=none (message not signed) header.d=none;monjalon.net; dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.112.36 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.36; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.36) by DM6NAM11FT017.mail.protection.outlook.com (10.13.172.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4500.14 via Frontend Transport; Fri, 10 Sep 2021 04:24:06 +0000 Received: from DRHQMAIL107.nvidia.com (10.27.9.16) by HQMAIL101.nvidia.com (172.20.187.10) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 10 Sep 2021 04:24:05 +0000 Received: from nvidia.com (172.20.187.6) by DRHQMAIL107.nvidia.com (10.27.9.16) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Fri, 10 Sep 2021 04:24:03 +0000 From: Rongwei Liu To: , , , , Ray Kinsella CC: , , Jiawei Wang Date: Fri, 10 Sep 2021 07:23:47 +0300 Message-ID: <20210910042347.12820-2-rongweil@nvidia.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210910042347.12820-1-rongweil@nvidia.com> References: <20210910042347.12820-1-rongweil@nvidia.com> MIME-Version: 1.0 X-Originating-IP: [172.20.187.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To DRHQMAIL107.nvidia.com (10.27.9.16) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d704aa62-fc4c-40ec-adc8-08d97412d3e0 X-MS-TrafficTypeDiagnostic: DM6PR12MB3372: X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6430; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 2roG9AiZAst3DFZUK32KhIMc15tB9ZWpE2GLhaLUihBboCRWM7haRgKzcDaQwvr75zno/L2UqooQp/Yn73MBmX2PNI7N3F9C6NsE2nFkAQTzjBbInkP6KXbcG9nWZ5v47C1PXdLsfntk2OWgAIo4Dl2++NghObD5aRufvswURxHhNse4ghgg+dmw3nLwdpgFM4AGID5eHTKcRnnl8sZuZaoRuQzHTCG40fQpZTMQ3ri7s6qm81QbslusNYWphowpeW2uqdcHJJ3aA8HUP0BfNLQvP7PdflYce/RPGHIRDFNRFtbtB/DY15bRrkZbehSRgFkxY5mzDtFtH4B7KuVE4H/+wOTRKzhP54ywN5oQmO5nufR0g6iZKdsm1Dy2CEgWHttSLQmmBRyuUU3a/mYTDwm51E92xVhCWV2ASlWN8q3MpIyujzbl4RGYKRxPakAorPGWq8VkH0zOMEReK1ic0EFYUTuNMkkjDVkdZP7yuJGPrQFX7SfyWd7mF8qR09pN6lMoqPG7f8JovaTma0EH7I+ZvMB5uYLLDdkaEboU5zBVF1lhEpitWAzDR3Gpsx45Xn6A3ha3XUpm3X+lfC78r4Vc/zt9i7pcv9626UAhuOvn4tks6taZCt59FxSoaGLkaczc3ZcTimkgdGEVslbcVpn9+R4NBfKZCLUVisb2ll0pZ/SW8RcB9lOtBovKXftaqknFmJK8+vmusqntxcWfPweNjNi9VxXKPD6qg6l8WIg= X-Forefront-Antispam-Report: CIP:216.228.112.36; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid05.nvidia.com; CAT:NONE; SFS:(4636009)(396003)(376002)(136003)(346002)(39860400002)(36840700001)(46966006)(5660300002)(8676002)(55016002)(426003)(107886003)(47076005)(356005)(2906002)(7636003)(1076003)(186003)(16526019)(26005)(4326008)(6666004)(7696005)(86362001)(30864003)(478600001)(8936002)(82740400003)(36860700001)(54906003)(70206006)(83380400001)(6286002)(36906005)(316002)(36756003)(110136005)(82310400003)(2616005)(336012)(70586007)(309714004); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Sep 2021 04:24:06.0957 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d704aa62-fc4c-40ec-adc8-08d97412d3e0 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.36]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT017.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB3372 Subject: [dpdk-dev] [RFC 1/1] net/mlx5: set txq affinity in round-robin X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Previously, we set txq affinity to 0 and let firmware to perform round-robin when bonding. Firmware uses a global counter to assign txq affinity to different physical ports accord to remainder after division. There are three dis-advantages: 1. The global counter is shared between kernel and dpdk. 2. After restarting pmd or port, the previous counter value is reused, so the new affinity is unpredictable. 3. There is no way to get what affinity is set by firmware. In this update, we will create several TISs up to the number of bonding ports and bind each TIS to one PF port. For each port, it will start to pick up TIS using its port index. Upper layer application can quickly calculate each txq's affinity without querying. At DPDK layer, when creating txq with 2 bonding ports, the affinity is set like: port 0: 1-->2-->1-->2 port 1: 2-->1-->2-->1 port 2: 1-->2-->1-->2 Note: Only applicable to Devx api. Signed-off-by: Jiawei Wang Signed-off-by: Rongwei Liu Acked-by: Ray Kinsella --- drivers/common/mlx5/mlx5_devx_cmds.c | 38 ++++++++++++++++++++++ drivers/common/mlx5/mlx5_devx_cmds.h | 12 +++++++ drivers/common/mlx5/mlx5_prm.h | 26 +++++++++++++++ drivers/common/mlx5/version.map | 1 + drivers/net/mlx5/linux/mlx5_os.c | 37 ++++++++++++++++++++++ drivers/net/mlx5/mlx5.c | 17 +++------- drivers/net/mlx5/mlx5.h | 8 ++++- drivers/net/mlx5/mlx5_devx.c | 47 ++++++++++++++++++++++++++-- drivers/net/mlx5/mlx5_tx.h | 1 + drivers/net/mlx5/mlx5_txpp.c | 4 +-- 10 files changed, 174 insertions(+), 17 deletions(-) diff --git a/drivers/common/mlx5/mlx5_devx_cmds.c b/drivers/common/mlx5/mlx5_devx_cmds.c index 56407cc332..dd04b9820c 100644 --- a/drivers/common/mlx5/mlx5_devx_cmds.c +++ b/drivers/common/mlx5/mlx5_devx_cmds.c @@ -2765,3 +2765,41 @@ mlx5_devx_cmd_create_crypto_login_obj(void *ctx, crypto_login_obj->id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id); return crypto_login_obj; } + +/** + * Query LAG context. + * + * @param[in] ctx + * Pointer to ibv_context, returned from mlx5dv_open_device. + * @param[out] lag_ctx + * Pointer to struct mlx5_devx_lag_context, to be set by the routine. + * + * @return + * 0 on success, a negative value otherwise. + */ +int +mlx5_devx_cmd_query_lag(struct ibv_context *ctx, + struct mlx5_devx_lag_context *lag_ctx) +{ + uint32_t in[MLX5_ST_SZ_DW(query_lag_in)] = {0}; + uint32_t out[MLX5_ST_SZ_DW(query_lag_out)] = {0}; + void *lctx; + int rc; + + MLX5_SET(query_lag_in, in, opcode, MLX5_CMD_OP_QUERY_LAG); + rc = mlx5_glue->devx_general_cmd(ctx, in, sizeof(in), out, sizeof(out)); + if (rc) + goto error; + lctx = MLX5_ADDR_OF(query_lag_out, out, context); + lag_ctx->fdb_selection_mode = MLX5_GET(lag_context, lctx, + fdb_selection_mode); + lag_ctx->lag_state = MLX5_GET(lag_context, lctx, lag_state); + lag_ctx->tx_remap_affinity_2 = MLX5_GET(lag_context, lctx, + tx_remap_affinity_2); + lag_ctx->tx_remap_affinity_1 = MLX5_GET(lag_context, lctx, + tx_remap_affinity_1); + return 0; +error: + rc = (rc > 0) ? -rc : rc; + return rc; +} diff --git a/drivers/common/mlx5/mlx5_devx_cmds.h b/drivers/common/mlx5/mlx5_devx_cmds.h index e576e30f24..641f1b25e3 100644 --- a/drivers/common/mlx5/mlx5_devx_cmds.h +++ b/drivers/common/mlx5/mlx5_devx_cmds.h @@ -184,6 +184,14 @@ struct mlx5_hca_attr { uint32_t umr_indirect_mkey_disabled:1; }; +/* LAG Context. */ +struct mlx5_devx_lag_context { + uint32_t fdb_selection_mode:1; + uint32_t lag_state:3; + uint32_t tx_remap_affinity_1:4; + uint32_t tx_remap_affinity_2:4; +}; + struct mlx5_devx_wq_attr { uint32_t wq_type:4; uint32_t wq_signature:1; @@ -666,4 +674,8 @@ struct mlx5_devx_obj * mlx5_devx_cmd_create_crypto_login_obj(void *ctx, struct mlx5_devx_crypto_login_attr *attr); +__rte_internal +int +mlx5_devx_cmd_query_lag(struct ibv_context *ctx, + struct mlx5_devx_lag_context *lag_ctx); #endif /* RTE_PMD_MLX5_DEVX_CMDS_H_ */ diff --git a/drivers/common/mlx5/mlx5_prm.h b/drivers/common/mlx5/mlx5_prm.h index d361bcf90e..9cccdd7098 100644 --- a/drivers/common/mlx5/mlx5_prm.h +++ b/drivers/common/mlx5/mlx5_prm.h @@ -1048,6 +1048,7 @@ enum { MLX5_CMD_OP_DEALLOC_PD = 0x801, MLX5_CMD_OP_ACCESS_REGISTER = 0x805, MLX5_CMD_OP_ALLOC_TRANSPORT_DOMAIN = 0x816, + MLX5_CMD_OP_QUERY_LAG = 0x842, MLX5_CMD_OP_CREATE_TIR = 0x900, MLX5_CMD_OP_MODIFY_TIR = 0x901, MLX5_CMD_OP_CREATE_SQ = 0X904, @@ -2000,6 +2001,31 @@ struct mlx5_ifc_query_tis_in_bits { u8 reserved_at_60[0x20]; }; +struct mlx5_ifc_lag_context_bits { + u8 fdb_selection_mode[0x1]; + u8 reserved_at_1[0x1c]; + u8 lag_state[0x3]; + u8 reserved_at_20[0x14]; + u8 tx_remap_affinity_2[0x4]; + u8 reserved_at_38[0x4]; + u8 tx_remap_affinity_1[0x4]; +}; + +struct mlx5_ifc_query_lag_in_bits { + u8 opcode[0x10]; + u8 uid[0x10]; + u8 reserved_at_20[0x10]; + u8 op_mod[0x10]; + u8 reserved_at_40[0x40]; +}; + +struct mlx5_ifc_query_lag_out_bits { + u8 status[0x8]; + u8 reserved_at_8[0x18]; + u8 syndrome[0x20]; + struct mlx5_ifc_lag_context_bits context; +}; + struct mlx5_ifc_alloc_transport_domain_out_bits { u8 status[0x8]; u8 reserved_at_8[0x18]; diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map index e5cb6b7060..e169fbaa40 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -53,6 +53,7 @@ INTERNAL { mlx5_devx_cmd_modify_virtq; mlx5_devx_cmd_qp_query_tis_td; mlx5_devx_cmd_query_hca_attr; + mlx5_devx_cmd_query_lag; mlx5_devx_cmd_query_parse_samples; mlx5_devx_cmd_query_virtio_q_counters; # WINDOWS_NO_EXPORT mlx5_devx_cmd_query_virtq; diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 5f8766aa48..f4159021b7 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -977,6 +977,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, uint16_t port_id; struct mlx5_port_info vport_info = { .query_flags = 0 }; int i; + struct mlx5_devx_tis_attr tis_attr = { 0 }; + struct mlx5_devx_lag_context lag_ctx = {0}; /* Determine if this port representor is supposed to be spawned. */ if (switch_info->representor && dpdk_dev->devargs && @@ -1679,6 +1681,41 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, eth_dev->data->representor_id = priv->representor_id; } priv->mp_id.port_id = eth_dev->data->port_id; + tis_attr.transport_domain = sh->td->id; + if (sh->bond.n_port) { + for (i = 0; i < sh->bond.n_port; i++) { + /* + * 0 is auto affinity, non-zero value + * to propose port. + */ + tis_attr.lag_tx_port_affinity = (eth_dev->data->port_id + + i) % sh->bond.n_port + 1; + sh->tis[i] = mlx5_devx_cmd_create_tis(sh->ctx, + &tis_attr); + if (!sh->tis[i]) { + DRV_LOG(ERR, "TIS allocation failure %d", i); + err = ENOMEM; + goto error; + } + } + if (!mlx5_devx_cmd_query_lag(sh->ctx, &lag_ctx)) { + sh->lag.tx_remap_affinity[0] = + lag_ctx.tx_remap_affinity_1; + sh->lag.tx_remap_affinity[1] = + lag_ctx.tx_remap_affinity_2; + } + DRV_LOG(DEBUG, "LAG number of ports : %d, affinity_1 & 2 : %d & %d\n", + sh->bond.n_port, lag_ctx.tx_remap_affinity_1, + lag_ctx.tx_remap_affinity_2); + } else { + tis_attr.lag_tx_port_affinity = 0; + sh->tis[0] = mlx5_devx_cmd_create_tis(sh->ctx, &tis_attr); + if (!sh->tis[0]) { + DRV_LOG(ERR, "TIS allocation failure"); + err = ENOMEM; + goto error; + } + } strlcpy(priv->mp_id.name, MLX5_MP_NAME, RTE_MP_MAX_NAME_LEN); /* * Store associated network device interface index. This index diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index f84e061fe7..b2520b7f77 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1112,7 +1112,6 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn, struct mlx5_dev_ctx_shared *sh; int err = 0; uint32_t i; - struct mlx5_devx_tis_attr tis_attr = { 0 }; MLX5_ASSERT(spawn); /* Secondary process should not create the shared context. */ @@ -1183,13 +1182,6 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn, err = ENOMEM; goto error; } - tis_attr.transport_domain = sh->td->id; - sh->tis = mlx5_devx_cmd_create_tis(sh->ctx, &tis_attr); - if (!sh->tis) { - DRV_LOG(ERR, "TIS allocation failure"); - err = ENOMEM; - goto error; - } err = mlx5_alloc_rxtx_uars(sh, config); if (err) goto error; @@ -1254,8 +1246,6 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn, MLX5_ASSERT(sh); if (sh->cnt_id_tbl) mlx5_l3t_destroy(sh->cnt_id_tbl); - if (sh->tis) - claim_zero(mlx5_devx_cmd_destroy(sh->tis)); if (sh->td) claim_zero(mlx5_devx_cmd_destroy(sh->td)); if (sh->devx_rx_uar) @@ -1282,6 +1272,7 @@ mlx5_alloc_shared_dev_ctx(const struct mlx5_dev_spawn_data *spawn, void mlx5_free_shared_dev_ctx(struct mlx5_dev_ctx_shared *sh) { + int i = 0; pthread_mutex_lock(&mlx5_dev_ctx_list_mutex); #ifdef RTE_LIBRTE_MLX5_DEBUG /* Check the object presence in the list. */ @@ -1337,8 +1328,10 @@ mlx5_free_shared_dev_ctx(struct mlx5_dev_ctx_shared *sh) } if (sh->pd) claim_zero(mlx5_os_dealloc_pd(sh->pd)); - if (sh->tis) - claim_zero(mlx5_devx_cmd_destroy(sh->tis)); + do { + if (sh->tis[i]) + claim_zero(mlx5_devx_cmd_destroy(sh->tis[i])); + } while (++i < sh->bond.n_port); if (sh->td) claim_zero(mlx5_devx_cmd_destroy(sh->td)); if (sh->devx_rx_uar) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index e02714e231..f7935fdf82 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -1118,6 +1118,11 @@ struct mlx5_aso_ct_pools_mng { struct mlx5_aso_sq aso_sq; /* ASO queue objects. */ }; +/* LAG attr. */ +struct mlx5_lag { + uint8_t tx_remap_affinity[16]; /* The PF port number of affinity */ +}; + /* * Shared Infiniband device context for Master/Representors * which belong to same IB device with multiple IB ports. @@ -1187,8 +1192,9 @@ struct mlx5_dev_ctx_shared { struct rte_intr_handle intr_handle; /* Interrupt handler for device. */ struct rte_intr_handle intr_handle_devx; /* DEVX interrupt handler. */ void *devx_comp; /* DEVX async comp obj. */ - struct mlx5_devx_obj *tis; /* TIS object. */ + struct mlx5_devx_obj *tis[16]; /* TIS object. */ struct mlx5_devx_obj *td; /* Transport domain. */ + struct mlx5_lag lag; /* LAG attributes */ void *tx_uar; /* Tx/packet pacing shared UAR. */ struct mlx5_flex_parser_profiles fp[MLX5_FLEX_PARSER_MAX]; /* Flex parser profiles information. */ diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c index a1db53577a..9a5bc127ec 100644 --- a/drivers/net/mlx5/mlx5_devx.c +++ b/drivers/net/mlx5/mlx5_devx.c @@ -888,6 +888,41 @@ mlx5_devx_drop_action_destroy(struct rte_eth_dev *dev) rte_errno = ENOTSUP; } +/** + * Set TXQ affinity via TIS round-ronbin + * + * @param priv + * Pointer to device private data. + * @param idx + * TX queue index + * @param attr + * Pointer to Devx SQ attribute + */ +static void +__mlx5_set_txq_affinity(struct mlx5_priv *priv, uint16_t idx, + struct mlx5_devx_create_sq_attr *attr) +{ + struct mlx5_dev_ctx_shared *sh = priv->sh; + struct mlx5_txq_data *txq_data = (*priv->txqs)[idx]; + int i, min_tis; + + /* + * The starting TIS is round-robin in all ports like + * port 0: TIS 0, port 1: TIS 1 and so on. + * Suppose TIS id increases by creation. + */ + for (min_tis = 0, i = 1; i < sh->bond.n_port; i++) + if (sh->tis[i]->id < sh->tis[min_tis]->id) + min_tis = i; + if (sh->bond.n_port) { + attr->tis_num = sh->tis[idx % sh->bond.n_port]->id; + txq_data->lag_port_affinity = (idx + sh->bond.n_port - + min_tis) % sh->bond.n_port + 1; + } else { + attr->tis_num = sh->tis[0]->id; + } +} + /** * Create the Tx hairpin queue object. * @@ -935,7 +970,11 @@ mlx5_txq_obj_hairpin_new(struct rte_eth_dev *dev, uint16_t idx) attr.wq_attr.log_hairpin_num_packets = attr.wq_attr.log_hairpin_data_sz - MLX5_HAIRPIN_QUEUE_STRIDE; - attr.tis_num = priv->sh->tis->id; + __mlx5_set_txq_affinity(priv, idx, &attr); + DRV_LOG(INFO, "queue %d tis number %d with affinity %d maps to PF port %d", + idx, attr.tis_num, txq_data->lag_port_affinity, + priv->sh->lag.tx_remap_affinity + [txq_data->lag_port_affinity - 1]); tmpl->sq = mlx5_devx_cmd_create_sq(priv->sh->ctx, &attr); if (!tmpl->sq) { DRV_LOG(ERR, @@ -992,7 +1031,6 @@ mlx5_txq_create_devx_sq_resources(struct rte_eth_dev *dev, uint16_t idx, .allow_swp = !!priv->config.swp, .cqn = txq_obj->cq_obj.cq->id, .tis_lst_sz = 1, - .tis_num = priv->sh->tis->id, .wq_attr = (struct mlx5_devx_wq_attr){ .pd = priv->sh->pdn, .uar_page = @@ -1000,6 +1038,11 @@ mlx5_txq_create_devx_sq_resources(struct rte_eth_dev *dev, uint16_t idx, }, .ts_format = mlx5_ts_format_conv(priv->sh->sq_ts_format), }; + __mlx5_set_txq_affinity(priv, idx, &sq_attr); + DRV_LOG(INFO, "queue %d tis number %d with affinity %d maps to PF port %d", + idx, sq_attr.tis_num, txq_data->lag_port_affinity, + priv->sh->lag.tx_remap_affinity + [txq_data->lag_port_affinity - 1]); /* Create Send Queue object with DevX. */ return mlx5_devx_sq_create(priv->sh->ctx, &txq_obj->sq_obj, log_desc_n, &sq_attr, priv->sh->numa_node); diff --git a/drivers/net/mlx5/mlx5_tx.h b/drivers/net/mlx5/mlx5_tx.h index 1a35919371..939fd60fff 100644 --- a/drivers/net/mlx5/mlx5_tx.h +++ b/drivers/net/mlx5/mlx5_tx.h @@ -161,6 +161,7 @@ struct mlx5_txq_data { int32_t ts_offset; /* Timestamp field dynamic offset. */ struct mlx5_dev_ctx_shared *sh; /* Shared context. */ struct mlx5_txq_stats stats; /* TX queue counters. */ + uint8_t lag_port_affinity; /* TXQ affinity */ #ifndef RTE_ARCH_64 rte_spinlock_t *uar_lock; /* UAR access lock required for 32bit implementations */ diff --git a/drivers/net/mlx5/mlx5_txpp.c b/drivers/net/mlx5/mlx5_txpp.c index 4f6da9f2d1..5b4464ce90 100644 --- a/drivers/net/mlx5/mlx5_txpp.c +++ b/drivers/net/mlx5/mlx5_txpp.c @@ -230,7 +230,7 @@ mlx5_txpp_create_rearm_queue(struct mlx5_dev_ctx_shared *sh) .cd_master = 1, .state = MLX5_SQC_STATE_RST, .tis_lst_sz = 1, - .tis_num = sh->tis->id, + .tis_num = sh->tis[0]->id, .wq_attr = (struct mlx5_devx_wq_attr){ .pd = sh->pdn, .uar_page = mlx5_os_get_devx_uar_page_id(sh->tx_uar), @@ -433,7 +433,7 @@ mlx5_txpp_create_clock_queue(struct mlx5_dev_ctx_shared *sh) /* Create send queue object for Clock Queue. */ if (sh->txpp.test) { sq_attr.tis_lst_sz = 1; - sq_attr.tis_num = sh->tis->id; + sq_attr.tis_num = sh->tis[0]->id; sq_attr.non_wire = 0; sq_attr.static_sq_wq = 1; } else {