From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3ED0BA0C43; Thu, 23 Sep 2021 13:20:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D58F541269; Thu, 23 Sep 2021 13:20:28 +0200 (CEST) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id 96B0F4122B for ; Thu, 23 Sep 2021 13:20:26 +0200 (CEST) Received: from localhost.localdomain (unknown [5.144.120.173]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id 1E0897F578; Thu, 23 Sep 2021 14:20:26 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 1E0897F578 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1632396026; bh=uwpmv9/5jnNmQAf3G3+8TgdvjT2SfoPnAixcLtfaSFs=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=VxFwtK3JRZAw98sewnKddnf2k8Duy6juZ6QWBU4L3YfEFPPOERkyJBy3h7HMGptMC /CGAyxzIRm/tU/G3M8ywnZWK4Of8g99f5dM/TI6lhuaTxoC7LlV6HCtqurE19GsphW AenR1nw0QNJb6VhY8nqi1bGrdXroo5wBCUuS8m3A= From: Ivan Malov To: dev@dpdk.org Cc: Andy Moreton , Andrew Rybchenko , Ray Kinsella , Jerin Jacob , Wisam Jaddo , Xiaoyun Li , Thomas Monjalon , Ferruh Yigit , Ori Kam Date: Thu, 23 Sep 2021 14:20:08 +0300 Message-Id: <20210923112012.14595-2-ivan.malov@oktetlabs.ru> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210923112012.14595-1-ivan.malov@oktetlabs.ru> References: <20210902142359.28138-1-ivan.malov@oktetlabs.ru> <20210923112012.14595-1-ivan.malov@oktetlabs.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v3 1/5] ethdev: add API to negotiate delivery of Rx meta data 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" Delivery of mark, flag and the likes might affect small packet performance. If these features are disabled by default, enabling them in started state without causing traffic disruption may not always be possible. Let applications negotiate delivery of Rx meta data beforehand. Signed-off-by: Ivan Malov Reviewed-by: Andrew Rybchenko Reviewed-by: Andy Moreton Acked-by: Ray Kinsella Acked-by: Jerin Jacob --- app/test-flow-perf/main.c | 21 ++++++++++++ app/test-pmd/testpmd.c | 26 +++++++++++++++ doc/guides/rel_notes/release_21_11.rst | 9 ++++++ lib/ethdev/ethdev_driver.h | 19 +++++++++++ lib/ethdev/rte_ethdev.c | 25 ++++++++++++++ lib/ethdev/rte_ethdev.h | 45 ++++++++++++++++++++++++++ lib/ethdev/rte_flow.h | 12 +++++++ lib/ethdev/version.map | 3 ++ 8 files changed, 160 insertions(+) diff --git a/app/test-flow-perf/main.c b/app/test-flow-perf/main.c index 9be8edc31d..48eafffb1d 100644 --- a/app/test-flow-perf/main.c +++ b/app/test-flow-perf/main.c @@ -1760,6 +1760,27 @@ init_port(void) rte_exit(EXIT_FAILURE, "Error: can't init mbuf pool\n"); for (port_id = 0; port_id < nr_ports; port_id++) { + uint64_t rx_meta_features = 0; + + rx_meta_features |= RTE_ETH_RX_META_USER_FLAG; + rx_meta_features |= RTE_ETH_RX_META_USER_MARK; + + ret = rte_eth_rx_meta_negotiate(port_id, &rx_meta_features); + if (ret == 0) { + if (!(rx_meta_features & RTE_ETH_RX_META_USER_FLAG)) { + printf(":: flow action FLAG will not affect Rx mbufs on port=%u\n", + port_id); + } + + if (!(rx_meta_features & RTE_ETH_RX_META_USER_MARK)) { + printf(":: flow action MARK will not affect Rx mbufs on port=%u\n", + port_id); + } + } else if (ret != -ENOTSUP) { + rte_exit(EXIT_FAILURE, "Error when negotiating Rx meta features on port=%u: %s\n", + port_id, rte_strerror(-ret)); + } + ret = rte_eth_dev_info_get(port_id, &dev_info); if (ret != 0) rte_exit(EXIT_FAILURE, diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 97ae52e17e..7a8da3d7ab 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -1485,10 +1485,36 @@ static void init_config_port_offloads(portid_t pid, uint32_t socket_id) { struct rte_port *port = &ports[pid]; + uint64_t rx_meta_features = 0; uint16_t data_size; int ret; int i; + rx_meta_features |= RTE_ETH_RX_META_USER_FLAG; + rx_meta_features |= RTE_ETH_RX_META_USER_MARK; + rx_meta_features |= RTE_ETH_RX_META_TUNNEL_ID; + + ret = rte_eth_rx_meta_negotiate(pid, &rx_meta_features); + if (ret == 0) { + if (!(rx_meta_features & RTE_ETH_RX_META_USER_FLAG)) { + TESTPMD_LOG(INFO, "Flow action FLAG will not affect Rx mbufs on port %u\n", + pid); + } + + if (!(rx_meta_features & RTE_ETH_RX_META_USER_MARK)) { + TESTPMD_LOG(INFO, "Flow action MARK will not affect Rx mbufs on port %u\n", + pid); + } + + if (!(rx_meta_features & RTE_ETH_RX_META_TUNNEL_ID)) { + TESTPMD_LOG(INFO, "Flow tunnel offload support might be limited or unavailable on port %u\n", + pid); + } + } else if (ret != -ENOTSUP) { + rte_exit(EXIT_FAILURE, "Error when negotiating Rx meta features on port %u: %s\n", + pid, rte_strerror(-ret)); + } + port->dev_conf.txmode = tx_mode; port->dev_conf.rxmode = rx_mode; diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 19356ac53c..6674d4474c 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -106,6 +106,15 @@ New Features Added command-line options to specify total number of processes and current process ID. Each process owns subset of Rx and Tx queues. +* **Added an API to negotiate delivery of specific parts of Rx meta data** + + A new API, ``rte_eth_rx_meta_negotiate()``, was added. + The following parts of Rx meta data were defined: + + * ``RTE_ETH_RX_META_USER_FLAG`` + * ``RTE_ETH_RX_META_USER_MARK`` + * ``RTE_ETH_RX_META_TUNNEL_ID`` + Removed Items ------------- diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h index 40e474aa7e..96e0c60cae 100644 --- a/lib/ethdev/ethdev_driver.h +++ b/lib/ethdev/ethdev_driver.h @@ -789,6 +789,22 @@ typedef int (*eth_get_monitor_addr_t)(void *rxq, typedef int (*eth_representor_info_get_t)(struct rte_eth_dev *dev, struct rte_eth_representor_info *info); +/** + * @internal + * Negotiate delivery of specific parts of Rx meta data. + * + * @param dev + * Port (ethdev) handle + * + * @param[inout] features + * Feature selection buffer + * + * @return + * Negative errno value on error, zero otherwise + */ +typedef int (*eth_rx_meta_negotiate_t)(struct rte_eth_dev *dev, + uint64_t *features); + /** * @internal A structure containing the functions exported by an Ethernet driver. */ @@ -949,6 +965,9 @@ struct eth_dev_ops { eth_representor_info_get_t representor_info_get; /**< Get representor info. */ + + eth_rx_meta_negotiate_t rx_meta_negotiate; + /**< Negotiate delivery of specific parts of Rx meta data. */ }; /** diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index daf5ca9242..49cb84d64c 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -6310,6 +6310,31 @@ rte_eth_representor_info_get(uint16_t port_id, return eth_err(port_id, (*dev->dev_ops->representor_info_get)(dev, info)); } +int +rte_eth_rx_meta_negotiate(uint16_t port_id, uint64_t *features) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + + if (dev->data->dev_configured != 0) { + RTE_ETHDEV_LOG(ERR, + "The port (id=%"PRIu16") is already configured\n", + port_id); + return -EBUSY; + } + + if (features == NULL) { + RTE_ETHDEV_LOG(ERR, "Invalid features (NULL)\n"); + return -EINVAL; + } + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rx_meta_negotiate, -ENOTSUP); + return eth_err(port_id, + (*dev->dev_ops->rx_meta_negotiate)(dev, features)); +} + RTE_LOG_REGISTER_DEFAULT(rte_eth_dev_logtype, INFO); RTE_INIT(ethdev_init_telemetry) diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index 1da37896d8..8467a7a362 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -4888,6 +4888,51 @@ __rte_experimental int rte_eth_representor_info_get(uint16_t port_id, struct rte_eth_representor_info *info); +/** The ethdev sees flagged packets if there are flows with action FLAG. */ +#define RTE_ETH_RX_META_USER_FLAG (UINT64_C(1) << 0) + +/** The ethdev sees mark IDs in packets if there are flows with action MARK. */ +#define RTE_ETH_RX_META_USER_MARK (UINT64_C(1) << 1) + +/** The ethdev detects missed packets if there are "tunnel_set" flows in use. */ +#define RTE_ETH_RX_META_TUNNEL_ID (UINT64_C(1) << 2) + +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Negotiate delivery of specific parts of Rx meta data. + * + * Invoke this API before the first rte_eth_dev_configure() invocation + * to let the PMD make preparations that are inconvenient to do later. + * + * The negotiation process is as follows: + * + * - the application requests features intending to use at least some of them; + * - the PMD responds with the guaranteed subset of the requested feature set; + * - the application can retry negotiation with another set of features; + * - the application can pass zero to clear the negotiation result; + * - the last negotiated result takes effect upon the ethdev start. + * + * If this API is unsupported, the application should gracefully ignore that. + * + * @param port_id + * Port (ethdev) identifier + * + * @param[inout] features + * Feature selection buffer + * + * @return + * - (-EBUSY) if the port can't handle this in its current state; + * - (-ENOTSUP) if the method itself is not supported by the PMD; + * - (-ENODEV) if *port_id* is invalid; + * - (-EINVAL) if *features* is NULL; + * - (-EIO) if the device is removed; + * - (0) on success + */ +__rte_experimental +int rte_eth_rx_meta_negotiate(uint16_t port_id, uint64_t *features); + #include /** diff --git a/lib/ethdev/rte_flow.h b/lib/ethdev/rte_flow.h index 70f455d47d..6eb7ec0574 100644 --- a/lib/ethdev/rte_flow.h +++ b/lib/ethdev/rte_flow.h @@ -1904,6 +1904,10 @@ enum rte_flow_action_type { * PKT_RX_FDIR_ID mbuf flags. * * See struct rte_flow_action_mark. + * + * One should negotiate delivery of mark IDs beforehand. + * @see rte_eth_rx_meta_negotiate() + * @see RTE_ETH_RX_META_USER_MARK */ RTE_FLOW_ACTION_TYPE_MARK, @@ -1912,6 +1916,10 @@ enum rte_flow_action_type { * sets the PKT_RX_FDIR mbuf flag. * * No associated configuration structure. + * + * One should negotiate flag delivery beforehand. + * @see rte_eth_rx_meta_negotiate() + * @see RTE_ETH_RX_META_USER_FLAG */ RTE_FLOW_ACTION_TYPE_FLAG, @@ -4223,6 +4231,10 @@ rte_flow_tunnel_match(uint16_t port_id, /** * Populate the current packet processing state, if exists, for the given mbuf. * + * One should negotiate the processing state information delivery beforehand. + * @see rte_eth_rx_meta_negotiate() + * @see RTE_ETH_RX_META_TUNNEL_ID + * * @param port_id * Port identifier of Ethernet device. * @param[in] m diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map index 904bce6ea1..a8928266a9 100644 --- a/lib/ethdev/version.map +++ b/lib/ethdev/version.map @@ -247,6 +247,9 @@ EXPERIMENTAL { rte_mtr_meter_policy_delete; rte_mtr_meter_policy_update; rte_mtr_meter_policy_validate; + + # added in 21.11 + rte_eth_rx_meta_negotiate; }; INTERNAL { -- 2.20.1