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 9167341CBF; Fri, 17 Feb 2023 13:56:43 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2C2D340EE3; Fri, 17 Feb 2023 13:56:43 +0100 (CET) Received: from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113]) by mails.dpdk.org (Postfix) with ESMTP id A196B40EE1 for ; Fri, 17 Feb 2023 13:56:41 +0100 (CET) Received: from [192.168.38.17] (aros.oktetlabs.ru [192.168.38.17]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by shelob.oktetlabs.ru (Postfix) with ESMTPSA id E1AFF7D; Fri, 17 Feb 2023 15:56:40 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru E1AFF7D DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=oktetlabs.ru; s=default; t=1676638600; bh=MppKNsbqNecZdNXeMwJ0HaTMySB/K50SmHtSvzLqNQg=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=BiBR/qoTglG7RRqkg9r9gu6MuANHKoQ0vPcDU3msVx3mxkoCxDANslYdElMQnyl8o BRDifqcnl/Hec+7rwtGbp4e4NxLsxx4loxSKzZQVnV1fpXmvmEQStLe5YNRVYPU4R9 Yh+LgYbF00Qbj56KhCMEDfeknSjgHkMv5X72JQzs= Message-ID: <557ee985-b634-f630-0ef4-1b28f876f690@oktetlabs.ru> Date: Fri, 17 Feb 2023 15:56:40 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 Subject: Re: [PATCH v6 1/2] ethdev: add Tx queue mapping of aggregated ports Content-Language: en-US To: Jiawei Wang , viacheslavo@nvidia.com, orika@nvidia.com, thomas@monjalon.net, ferruh.yigit@amd.com, Aman Singh , Yuying Zhang Cc: dev@dpdk.org, rasland@nvidia.com References: <20230203050717.46914-1-jiaweiw@nvidia.com> <20230217105026.12927-1-jiaweiw@nvidia.com> <20230217105026.12927-2-jiaweiw@nvidia.com> From: Andrew Rybchenko Organization: OKTET Labs In-Reply-To: <20230217105026.12927-2-jiaweiw@nvidia.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit 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 On 2/17/23 13:50, Jiawei Wang wrote: > When multiple ports are aggregated into a single DPDK port, > (example: Linux bonding, DPDK bonding, failsafe, etc.), > we want to know which port use for Tx via a queue. > > This patch introduces the new ethdev API > rte_eth_dev_map_aggr_tx_affinity(), it's used to map a Tx queue > with an aggregated port of the DPDK port (specified with port_id), > The affinity is the number of the aggregated port. > Value 0 means no affinity and traffic could be routed to any > aggregated port, this is the default current behavior. > > The maximum number of affinity is given by rte_eth_dev_count_aggr_ports(). > > Add the trace point for ethdev rte_eth_dev_count_aggr_ports() > and rte_eth_dev_map_aggr_tx_affinity() functions. > > Add the testpmd command line: > testpmd> port config (port_id) txq (queue_id) affinity (value) > > For example, there're two physical ports connected to > a single DPDK port (port id 0), and affinity 1 stood for > the first physical port and affinity 2 stood for the second > physical port. > Use the below commands to config tx phy affinity for per Tx Queue: > port config 0 txq 0 affinity 1 > port config 0 txq 1 affinity 1 > port config 0 txq 2 affinity 2 > port config 0 txq 3 affinity 2 > > These commands config the Tx Queue index 0 and Tx Queue index 1 with > phy affinity 1, uses Tx Queue 0 or Tx Queue 1 send packets, > these packets will be sent from the first physical port, and similar > with the second physical port if sending packets with Tx Queue 2 > or Tx Queue 3. > > Signed-off-by: Jiawei Wang > Acked-by: Thomas Monjalon [snip] > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > index 6a550cfc83..b7fdc454a8 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -1171,6 +1171,40 @@ typedef int (*eth_tx_descriptor_dump_t)(const struct rte_eth_dev *dev, > uint16_t queue_id, uint16_t offset, > uint16_t num, FILE *file); > > +/** > + * @internal > + * Get the number of aggregated ports. > + * > + * @param port_id > + * The port identifier of the Ethernet device. > + * > + * @return > + * Negative errno value on error, 0 or positive on success. > + * > + * @retval >=0 > + * The number of aggregated port if success. > + * @retval -ENOTSUP > + * Get aggregated ports API is not supported. > + */ > +typedef int (*eth_count_aggr_ports_t)(uint16_t port_id); Why does use port_id as the first parameter whereas all other driver callbacks use 'struct rte_eth_dev *'? > + > +/** > + * @internal > + * Map a Tx queue with an aggregated port of the DPDK port. > + * > + * @param port_id > + * The identifier of the port used in rte_eth_tx_burst(). > + * @param tx_queue_id > + * The index of the transmit queue used in rte_eth_tx_burst(). > + * @param affinity > + * The number of the aggregated port. > + * > + * @return > + * Negative on error, 0 on success. > + */ > +typedef int (*eth_map_aggr_tx_affinity_t)(uint16_t port_id, uint16_t tx_queue_id, > + uint8_t affinity); same herre > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index 055c46082b..1a63f9fb7a 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -6946,6 +6946,78 @@ rte_eth_buffer_split_get_supported_hdr_ptypes(uint16_t port_id, uint32_t *ptypes > return j; > } > > +int rte_eth_dev_count_aggr_ports(uint16_t port_id) > +{ > + struct rte_eth_dev *dev; > + int ret; > + > + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > + dev = &rte_eth_devices[port_id]; > + > + if (*dev->dev_ops->count_aggr_ports == NULL) Is it OK that tracing is long in this case? > + return 0; > + ret = eth_err(port_id, (*dev->dev_ops->count_aggr_ports)(port_id)); > + > + rte_eth_trace_count_aggr_ports(port_id, ret); > + > + return ret; > +} > + [snip]