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 2B41DA0544; Fri, 2 Sep 2022 09:03:17 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 200D740F18; Fri, 2 Sep 2022 09:03:17 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id D613040693 for ; Fri, 2 Sep 2022 09:03:15 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 281M67sP015742; Fri, 2 Sep 2022 00:01:10 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=klnzb7oeGNY5B1tEU+M9bDzYNBJz+rEvVH1S0IJdHRk=; b=eubsr0Ygmx5NdRQ3w7zLgy+p/YqQYr2+02iB9xJ4yNDvXl6jeGxiri9bDiVrrQ7XvuTM KhmBru8+RK2286bBR0v0+c9uy9h5J31XATn+Hq9iQxkC2KxjNOk2X/FoZapn8TwvWnbV vdrzBMLykjCY/o0Odoay3tOqmaejIY2KWlHpDRZTEQMvboYwlVxnAMzbU0UcMYJfvFeQ lf9hTUSKcNZeTEjgyAnrKd/zplWhLFzjcUGECw28fMgvuY9izBPnaZ+M2t4N0OHDYDNW JD15/t3JwCdEckLuT0fkzA/Mmwre7Lqgp41iD6Qf6nuIFe9fIIDjk2CwfuEx+dFELkr8 1A== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3jax17ufur-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Fri, 02 Sep 2022 00:01:09 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 2 Sep 2022 00:01:08 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 2 Sep 2022 00:01:08 -0700 Received: from localhost.localdomain (unknown [10.28.36.155]) by maili.marvell.com (Postfix) with ESMTP id CE2EF5B6977; Fri, 2 Sep 2022 00:00:51 -0700 (PDT) From: Hanumanth Pothula To: Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko CC: , , , , , , , , , , , , Hanumanth Pothula Subject: [PATCH v3 1/3] ethdev: introduce pool sort capability Date: Fri, 2 Sep 2022 12:30:45 +0530 Message-ID: <20220902070047.2812906-1-hpothula@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220812172451.1208933-1-hpothula@marvell.com> References: <20220812172451.1208933-1-hpothula@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-GUID: 2sbaavvaQZ04xdsOXl33UbzhpKbe_fLd X-Proofpoint-ORIG-GUID: 2sbaavvaQZ04xdsOXl33UbzhpKbe_fLd X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.895,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-09-01_12,2022-08-31_03,2022-06-22_01 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 This patch adds support for the pool sort capability. Some of the HW has support for choosing memory pools based on the packet's size. The pool sort capability allows PMD to choose a memory pool based on the packet's length. This is often useful for saving the memory where the application can create a different pool to steer the specific size of the packet, thus enabling effective use of memory. For example, let's say HW has a capability of three pools, - pool-1 size is 2K - pool-2 size is > 2K and < 4K - pool-3 size is > 4K Here, pool-1 can accommodate packets with sizes < 2K pool-2 can accommodate packets with sizes > 2K and < 4K pool-3 can accommodate packets with sizes > 4K With pool sort capability enabled in SW, an application may create three pools of different sizes and send them to PMD. Allowing PMD to program HW based on packet lengths. So that packets with less than 2K are received on pool-1, packets with lengths between 2K and 4K are received on pool-2 and finally packets greater than 4K are received on pool-3. The following two capabilities are added to the rte_eth_rxseg_capa structure, 1. pool_sort --> tells pool sort capability is supported by HW. 2. max_npool --> max number of pools supported by HW. Defined new structure rte_eth_rxseg_sort, to be used only when pool sort capability is present. If required this may be extended further to support more configurations. Signed-off-by: Hanumanth Pothula v3: - Implemented Pool Sort capability as new Rx offload capability, RTE_ETH_RX_OFFLOAD_BUFFER_SORT. v2: - Along with spec changes, uploading testpmd and driver changes. --- lib/ethdev/rte_ethdev.c | 69 ++++++++++++++++++++++++++++++++++++++--- lib/ethdev/rte_ethdev.h | 24 +++++++++++++- 2 files changed, 88 insertions(+), 5 deletions(-) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index 1979dc0850..5152c08f1e 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -1634,6 +1634,58 @@ rte_eth_dev_is_removed(uint16_t port_id) return ret; } +static int +rte_eth_rx_queue_check_sort(const struct rte_eth_rxseg_sort *rx_seg, + uint16_t n_seg, uint32_t *mbp_buf_size, + const struct rte_eth_dev_info *dev_info) +{ + const struct rte_eth_rxseg_capa *seg_capa = &dev_info->rx_seg_capa; + uint16_t seg_idx; + + if (!seg_capa->multi_pools || n_seg > seg_capa->max_npool) { + RTE_ETHDEV_LOG(ERR, + "Invalid capabilities, multi_pools:%d different length segments %u exceed supported %u\n", + seg_capa->multi_pools, n_seg, seg_capa->max_nseg); + return -EINVAL; + } + + for (seg_idx = 0; seg_idx < n_seg; seg_idx++) { + struct rte_mempool *mpl = rx_seg[seg_idx].mp; + uint32_t length = rx_seg[seg_idx].length; + + if (mpl == NULL) { + RTE_ETHDEV_LOG(ERR, "null mempool pointer\n"); + return -EINVAL; + } + + if (mpl->private_data_size < + sizeof(struct rte_pktmbuf_pool_private)) { + RTE_ETHDEV_LOG(ERR, + "%s private_data_size %u < %u\n", + mpl->name, mpl->private_data_size, + (unsigned int)sizeof + (struct rte_pktmbuf_pool_private)); + return -ENOSPC; + } + + *mbp_buf_size = rte_pktmbuf_data_room_size(mpl); + /* On segment length == 0, update segment's length with + * the pool's length - headeroom space, to make sure enough + * space is accomidate for header. + **/ + length = length != 0 ? length : (*mbp_buf_size - RTE_PKTMBUF_HEADROOM); + if (*mbp_buf_size < length + RTE_PKTMBUF_HEADROOM) { + RTE_ETHDEV_LOG(ERR, + "%s mbuf_data_room_size %u < %u))\n", + mpl->name, *mbp_buf_size, + length); + return -EINVAL; + } + } + + return 0; +} + static int rte_eth_rx_queue_check_split(const struct rte_eth_rxseg_split *rx_seg, uint16_t n_seg, uint32_t *mbp_buf_size, @@ -1764,7 +1816,6 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id, return -EINVAL; } } else { - const struct rte_eth_rxseg_split *rx_seg; uint16_t n_seg; /* Extended multi-segment configuration check. */ @@ -1774,13 +1825,23 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id, return -EINVAL; } - rx_seg = (const struct rte_eth_rxseg_split *)rx_conf->rx_seg; n_seg = rx_conf->rx_nseg; if (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT) { + const struct rte_eth_rxseg_split *rx_seg = + (const struct rte_eth_rxseg_split *)rx_conf->rx_seg; ret = rte_eth_rx_queue_check_split(rx_seg, n_seg, - &mbp_buf_size, - &dev_info); + &mbp_buf_size, + &dev_info); + if (ret != 0) + return ret; + } else if (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_BUFFER_SORT) { + const struct rte_eth_rxseg_sort *rx_seg = + (const struct rte_eth_rxseg_sort *)rx_conf->rx_seg; + ret = rte_eth_rx_queue_check_sort(rx_seg, n_seg, + &mbp_buf_size, + &dev_info); + if (ret != 0) return ret; } else { diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index de9e970d4d..f7b5901a40 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -1204,6 +1204,21 @@ struct rte_eth_rxseg_split { uint32_t reserved; /**< Reserved field. */ }; +/** + * The pool sort capability allows PMD to choose a memory pool based on the + * packet's length. So, basically, PMD programs HW for receiving packets from + * different pools, based on the packet's length. + * + * This is often useful for saving the memory where the application can create + * a different pool to steer the specific size of the packet, thus enabling + * effective use of memory. + */ +struct rte_eth_rxseg_sort { + struct rte_mempool *mp; /**< Memory pool to allocate packets from. */ + uint16_t length; /**< Packet data length. */ + uint32_t reserved; /**< Reserved field. */ +}; + /** * @warning * @b EXPERIMENTAL: this structure may change without prior notice. @@ -1213,7 +1228,9 @@ struct rte_eth_rxseg_split { union rte_eth_rxseg { /* The settings for buffer split offload. */ struct rte_eth_rxseg_split split; - /* The other features settings should be added here. */ + + /*The settings for packet sort offload. */ + struct rte_eth_rxseg_sort sort; }; /** @@ -1633,6 +1650,7 @@ struct rte_eth_conf { #define RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM RTE_BIT64(18) #define RTE_ETH_RX_OFFLOAD_RSS_HASH RTE_BIT64(19) #define RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT RTE_BIT64(20) +#define RTE_ETH_RX_OFFLOAD_BUFFER_SORT RTE_BIT64(21) #define DEV_RX_OFFLOAD_VLAN_STRIP RTE_DEPRECATED(DEV_RX_OFFLOAD_VLAN_STRIP) RTE_ETH_RX_OFFLOAD_VLAN_STRIP #define DEV_RX_OFFLOAD_IPV4_CKSUM RTE_DEPRECATED(DEV_RX_OFFLOAD_IPV4_CKSUM) RTE_ETH_RX_OFFLOAD_IPV4_CKSUM @@ -1827,10 +1845,14 @@ struct rte_eth_switch_info { */ struct rte_eth_rxseg_capa { __extension__ + uint32_t mode_split : 1; /**< Supports buffer split capability @see struct rte_eth_rxseg_split */ + uint32_t mode_sort : 1; /**< Supports pool sort capability @see struct rte_eth_rxseg_sort */ uint32_t multi_pools:1; /**< Supports receiving to multiple pools.*/ uint32_t offset_allowed:1; /**< Supports buffer offsets. */ uint32_t offset_align_log2:4; /**< Required offset alignment. */ uint16_t max_nseg; /**< Maximum amount of segments to split. */ + /* < Maximum amount of pools that PMD can sort based on packet/segment lengths */ + uint16_t max_npool; uint16_t reserved; /**< Reserved field. */ }; -- 2.25.1