From patchwork Mon May 31 02:22:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haifei Luo X-Patchwork-Id: 93598 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 1239BA0524; Mon, 31 May 2021 04:23:09 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7E52B40040; Mon, 31 May 2021 04:23:08 +0200 (CEST) Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1anam02on2046.outbound.protection.outlook.com [40.107.96.46]) by mails.dpdk.org (Postfix) with ESMTP id 746C24003E for ; Mon, 31 May 2021 04:23:07 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=M3J2z1y8rDJMA3qeI6z9vSTBLtJQuZMJAuwyu+ynNnHKKkMovWDb6CFw7uVssmb3XKNQqfW2hDiEs2o4z06A15fYyTF6WGj9oiOmQNz7/AAlTzanc3+E7iAWgjrvGhDj6zrOLTtzTAJFuHINtdXQ0dHqC+sJXi8BZF9fYPZ132SUCedFQINpW/r++bwU3SHaBfGSwzrL3AUdYJzhVdQ1Gz4jj42Nui5STimiF2FpdOa1Qcft3R+TmvSJIAtWBU7jl7zXjtb7Nk4dbjOncSMA8/Ln1tLQXIahR5JBlAQSfEJHyHf+3IjN2ECBpVj/t/Yc7+R+nTqOIwBVp8CRLxbfJA== 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-SenderADCheck; bh=LOjtdEi5hXqU/QsqTHf0XMnaTzsyYJ+z/9PsWcpib+Y=; b=NZNkrARm7mctq4FkhLKzJWPQbSN1vHNZF4RY0/3VlIkEWNSeiJjk85nAD/ZaZCYJ9hE99ibs7wfnFuvf5AWR6XCN3EhJDu8FKYlIv6toZ6yiJc15X3np6/SUBlT27oMpBWlHvrqQbUxjMLgrQj1mCeOL5VW0YHo6X0eebErzDQE+Z720J6wVvoxRiN+bEzucSR1vIoZntTUZss38jhVssY83xrc8Dwt9frRL7xHL68jQIEMJRy16VPgCD6bKTN6A74PnognPMTgmtHzLRK+xhOlW5mSLVfuPQoIIBQ9YiITR2WAl9YoMz+Sg1upoj9h83RPXH+LwLllB2hnORwZWEA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.112.34) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com; dmarc=pass (p=none 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=LOjtdEi5hXqU/QsqTHf0XMnaTzsyYJ+z/9PsWcpib+Y=; b=lYe8XhozEw+YXMelg4/NZOOcMBbIKLkF0Rtwp+8JGBY+7P84L2Xh+675XdHEoH/B4+312LmCFbO1Ft7bAWIT+RjalzJM+v5A74a9fA3Tn5Zp9fyGxt39JEztzt6P/Lxi9vrRSBcKV6XvWyCc8PVabRL+IN6V7C3jN6HiM03+5OZFwY/w6vKhAQRXbkFvNhmNt0ETW1uM6wujQWyTsSqM5De+c3WDQ64rggPm6adqwYHO8eFzG5sm4kguyGTmOlW8EuKD2Z78uUBDfzFVL6r1/j2FutpIU27eHX6eDtIvyn/TpXP0NA2y8PM+213wuMiiq2NauKDlLTsSxGdIuo4BAg== Received: from DM5PR21CA0024.namprd21.prod.outlook.com (2603:10b6:3:ac::34) by MN2PR12MB2894.namprd12.prod.outlook.com (2603:10b6:208:10a::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4173.20; Mon, 31 May 2021 02:23:01 +0000 Received: from DM6NAM11FT060.eop-nam11.prod.protection.outlook.com (2603:10b6:3:ac:cafe::41) by DM5PR21CA0024.outlook.office365.com (2603:10b6:3:ac::34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4219.3 via Frontend Transport; Mon, 31 May 2021 02:23:01 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.112.34) 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.34 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.112.34; helo=mail.nvidia.com; Received: from mail.nvidia.com (216.228.112.34) by DM6NAM11FT060.mail.protection.outlook.com (10.13.173.63) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.4150.30 via Frontend Transport; Mon, 31 May 2021 02:23:01 +0000 Received: from nvidia.com (172.20.145.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 31 May 2021 02:22:58 +0000 From: Haifei Luo To: , , , "Shahaf Shuler" CC: , , Date: Mon, 31 May 2021 05:22:08 +0300 Message-ID: <20210531022208.11962-1-haifeil@nvidia.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 X-Originating-IP: [172.20.145.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To HQMAIL107.nvidia.com (172.20.187.13) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bff1c05f-fe60-4238-5ebf-08d923db038d X-MS-TrafficTypeDiagnostic: MN2PR12MB2894: X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5236; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Ej9Ppb+dDmfrLFHOD0VxhTdTNaUpen44kmp1ZDPyn8s2j8KH/oJboeoFzYUNTUzXgQlJAqFEE5v2gU7zi5sfsPzrEjfnHuYdt80EbflS98vBJH4jYv07iTnCPk2D3Y8hJ9DB36Sem/Cjjaq30FnokWKN4Zwt0yBRyR3ZM+4d6ZBDHg/ntnt5OA56u4h10BgDAUyQzqj4zoM07JiS/N3W0SWZKy7Qynaiav2GCf/UocZDO/xTq7WFbjEkqD8sBg2wkS8URfzZF9eQWsMVqqqTQYbZR+5HzqN19PBYtN2gs6tf949QbuRGF0WLS8xtGfLizDdI0uZqDZ7jFmmjgDUcraVc6nnAiVjiHFC7cTA6rmQ6tNr7NF0e5kp9xfqpIAsIe/IGaVbZgc/4/iAfaFijuVEcmhhilOY07AT981BDnj6MzFmxRDiCAAnyC/ObrpweJSUmVK8o76vWnIPl8an0Cwty1CqECgvcTt3X+dbWsU1fs1TxRbG4Jpyd5GfhNsGBhZP6NrDbMAYxJwpDurB/EnJvMEqdRAYcBzOrn7N6///e9p/sdwZvhHPjHIX4iI25a3fpkJ/FuBzKl15oLAjO8su2OSVirJ3Cdo3XxYvynKMhCT6riW6HNa51nmP5h/+3ggFPQ3d3sUZb9t0VZfkKPOpYt26A0fpyDLSkE/qRyT8= X-Forefront-Antispam-Report: CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE; SFS:(4636009)(136003)(376002)(396003)(39850400004)(346002)(46966006)(36840700001)(36756003)(55016002)(478600001)(7696005)(47076005)(4326008)(7636003)(6666004)(356005)(6636002)(82310400003)(2906002)(82740400003)(86362001)(8676002)(26005)(2616005)(54906003)(336012)(6286002)(36906005)(426003)(316002)(16526019)(70206006)(186003)(70586007)(110136005)(83380400001)(36860700001)(1076003)(107886003)(8936002)(5660300002); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 May 2021 02:23:01.2902 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: bff1c05f-fe60-4238-5ebf-08d923db038d 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.34]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DM6NAM11FT060.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB2894 Subject: [dpdk-dev] [PATCH] net/mlx5: support flow dump value 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" Currently the flow dump provides few information about actions - just the pointers. Add implementations to display details for counter, modify_hdr and encap_decap actions. For counter, the regular flow operation query is engaged and the counter content information is provided, including hits and bytes values.For modify_hdr, encap_and decap actions, the information stored in the ipool objects is dumped. There are the formats of information presented in the dump: Counter: rec_type,id,hits,bytes Modify_hdr: rec_type,id,actions_number,actions Encap_decap: rec_type,id,buf Signed-off-by: Haifei Luo Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.h | 15 ++++ drivers/net/mlx5/mlx5_flow.c | 165 ++++++++++++++++++++++++++++++++++- 2 files changed, 179 insertions(+), 1 deletion(-) diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 32b2817bf2..c958fd7a9a 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -1397,6 +1397,13 @@ struct rte_hairpin_peer_info { uint16_t manual_bind; }; +#define BUF_SIZE 1024 +enum dr_dump_rec_type { + DR_DUMP_REC_TYPE_PMD_PKT_REFORMAT = 4410, + DR_DUMP_REC_TYPE_PMD_MODIFY_HDR = 4420, + DR_DUMP_REC_TYPE_PMD_COUNTER = 4430, +}; + /* mlx5.c */ int mlx5_getenv_int(const char *); @@ -1628,6 +1635,14 @@ int mlx5_counter_query(struct rte_eth_dev *dev, uint32_t cnt, bool clear, uint64_t *pkts, uint64_t *bytes); int mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow, FILE *file, struct rte_flow_error *error); +int save_dump_file(const unsigned char *data, uint32_t size, + uint32_t type, uint32_t id, void *arg, FILE *file); +int mlx5_flow_query_counter(struct rte_eth_dev *dev, struct rte_flow *flow, + struct rte_flow_query_count *count, struct rte_flow_error *error); +#ifdef HAVE_IBV_FLOW_DV_SUPPORT +int mlx5_flow_dev_dump_ipool(struct rte_eth_dev *dev, struct rte_flow *flow, + FILE *file, struct rte_flow_error *error); +#endif void mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev); int mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts, uint32_t nb_contexts, struct rte_flow_error *error); diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index dbeca571b6..b6902a3cf1 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -7846,6 +7846,157 @@ mlx5_flow_discover_mreg_c(struct rte_eth_dev *dev) return 0; } +int +save_dump_file(const uint8_t *data, uint32_t size, + uint32_t type, uint32_t id, void *arg, FILE *file) +{ + char line[BUF_SIZE]; + uint32_t out = 0; + uint32_t k; + uint32_t actions_num; + struct rte_flow_query_count *count; + + memset(line, 0, BUF_SIZE); + switch (type) { + case DR_DUMP_REC_TYPE_PMD_MODIFY_HDR: + actions_num = *(uint32_t *)(arg); + out += snprintf(line + out, BUF_SIZE - out, "%d,0x%x,%d,", + type, id, actions_num); + break; + case DR_DUMP_REC_TYPE_PMD_PKT_REFORMAT: + out += snprintf(line + out, BUF_SIZE - out, "%d,0x%x,", + type, id); + break; + case DR_DUMP_REC_TYPE_PMD_COUNTER: + count = (struct rte_flow_query_count *)arg; + fprintf(file, "%d,0x%x,%" PRIu64 ",%" PRIu64 "\n", type, + id, count->hits, count->bytes); + return 0; + default: + return -1; + } + + for (k = 0; k < size; k++) { + /* Make sure we do not overrun the line buffer length. */ + if (out >= BUF_SIZE - 4) { + line[out] = '\0'; + break; + } + out += snprintf(line + out, BUF_SIZE - out, "%02x", + (data[k]) & 0xff); + } + fprintf(file, "%s\n", line); + return 0; +} + +int +mlx5_flow_query_counter(struct rte_eth_dev *dev, struct rte_flow *flow, + struct rte_flow_query_count *count, struct rte_flow_error *error) +{ + struct rte_flow_action action[2]; + enum mlx5_flow_drv_type ftype; + const struct mlx5_flow_driver_ops *fops; + + if (!flow) { + return rte_flow_error_set(error, ENOENT, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "invalid flow handle"); + } + action[0].type = RTE_FLOW_ACTION_TYPE_COUNT; + action[1].type = RTE_FLOW_ACTION_TYPE_END; + if (flow->counter) { + memset(count, 0, sizeof(struct rte_flow_query_count)); + ftype = (enum mlx5_flow_drv_type)(flow->drv_type); + MLX5_ASSERT(ftype > MLX5_FLOW_TYPE_MIN && + ftype < MLX5_FLOW_TYPE_MAX); + fops = flow_get_drv_ops(ftype); + return fops->query(dev, flow, action, count, error); + } + return -1; +} + +#ifdef HAVE_IBV_FLOW_DV_SUPPORT +/** + * Dump flow ipool data to file + * + * @param[in] dev + * The pointer to Ethernet device. + * @param[in] file + * A pointer to a file for output. + * @param[out] error + * Perform verbose error reporting if not NULL. PMDs initialize this + * structure in case of error only. + * @return + * 0 on success, a negative value otherwise. + */ +int +mlx5_flow_dev_dump_ipool(struct rte_eth_dev *dev, + struct rte_flow *flow, FILE *file, + struct rte_flow_error *error) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_flow_dv_modify_hdr_resource *modify_hdr; + struct mlx5_flow_dv_encap_decap_resource *encap_decap; + uint32_t handle_idx; + struct mlx5_flow_handle *dh; + struct rte_flow_query_count count; + uint32_t actions_num; + const uint8_t *data; + size_t size; + uint32_t id; + uint32_t type; + + if (!flow) { + return rte_flow_error_set(error, ENOENT, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, + NULL, + "invalid flow handle"); + } + handle_idx = flow->dev_handles; + while (handle_idx) { + dh = mlx5_ipool_get(priv->sh->ipool + [MLX5_IPOOL_MLX5_FLOW], handle_idx); + if (!dh) + continue; + handle_idx = dh->next.next; + id = (uint32_t)(uintptr_t)dh->drv_flow; + + /* query counter */ + type = DR_DUMP_REC_TYPE_PMD_COUNTER; + if (!mlx5_flow_query_counter(dev, flow, &count, error)) + save_dump_file(NULL, 0, type, + id, (void *)&count, file); + + /* Get modify_hdr and encap_decap buf from ipools. */ + encap_decap = NULL; + modify_hdr = dh->dvh.modify_hdr; + + if (dh->dvh.rix_encap_decap) { + encap_decap = mlx5_ipool_get(priv->sh->ipool + [MLX5_IPOOL_DECAP_ENCAP], + dh->dvh.rix_encap_decap); + } + if (modify_hdr) { + data = (const uint8_t *)modify_hdr->actions; + size = (size_t)(modify_hdr->actions_num) * 8; + actions_num = modify_hdr->actions_num; + type = DR_DUMP_REC_TYPE_PMD_MODIFY_HDR; + save_dump_file(data, size, type, id, + (void *)(&actions_num), file); + } + if (encap_decap) { + data = encap_decap->buf; + size = encap_decap->size; + type = DR_DUMP_REC_TYPE_PMD_PKT_REFORMAT; + save_dump_file(data, size, type, + id, NULL, file); + } + } + return 0; +} +#endif + /** * Dump flow raw hw data to file * @@ -7870,6 +8021,9 @@ mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow_idx, int ret; struct mlx5_flow_handle *dh; struct rte_flow *flow; +#ifdef HAVE_IBV_FLOW_DV_SUPPORT + uint32_t idx; +#endif if (!priv->config.dv_flow_en) { if (fputs("device dv flow disabled\n", file) <= 0) @@ -7878,16 +8032,25 @@ mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow_idx, } /* dump all */ - if (!flow_idx) + if (!flow_idx) { +#ifdef HAVE_IBV_FLOW_DV_SUPPORT + ILIST_FOREACH(priv->sh->ipool[MLX5_IPOOL_RTE_FLOW], + priv->flows, idx, flow, next) + mlx5_flow_dev_dump_ipool(dev, flow, file, error); +#endif return mlx5_devx_cmd_flow_dump(sh->fdb_domain, sh->rx_domain, sh->tx_domain, file); + } /* dump one */ flow = mlx5_ipool_get(priv->sh->ipool [MLX5_IPOOL_RTE_FLOW], (uintptr_t)(void *)flow_idx); if (!flow) return -ENOENT; +#ifdef HAVE_IBV_FLOW_DV_SUPPORT + mlx5_flow_dev_dump_ipool(dev, flow, file, error); +#endif handle_idx = flow->dev_handles; while (handle_idx) { dh = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_MLX5_FLOW],