[dpdk-dev] [PATCH v2 3/6] ethdev: add API to get hairpin peer ports list
Ori Kam
orika at nvidia.com
Thu Oct 8 11:40:42 CEST 2020
Hi Bing,
PSB,
Best,
Ori
> -----Original Message-----
> From: Bing Zhao <bingz at nvidia.com>
> Sent: Thursday, October 8, 2020 11:52 AM
> Subject: [PATCH v2 3/6] ethdev: add API to get hairpin peer ports list
>
> After hairpin queues are configured, in general, the application will
> maintain the ports topology and even the queues configuration for
> hairpin. But sometimes it will not.
>
> If there is no hot-plug, it is easy to bind and unbind hairpin among
> all the ports. The application can just connect or disconnect the
> hairpin egress ports to / from all the probed ingress ports. Then
> all the connections could be handled properly.
>
> But with hot-plug / hot-unplug, one port could be probed and removed
> dynamically. With two ports hairpin, all the connections from and to
> this port should be handled after start(bind) or before stop(unbind).
> It is necessary to know the hairpin topology with this port.
>
> This API will return the ports list with the actual peer ports number
> after configuration. Either peer RX or TX ports will be gotten with
> this function call.
>
> Signed-off-by: Bing Zhao <bingz at nvidia.com>
> ---
> lib/librte_ethdev/rte_ethdev.c | 24 ++++++++++++++++++++++++
> lib/librte_ethdev/rte_ethdev.h | 27 +++++++++++++++++++++++++++
> lib/librte_ethdev/rte_ethdev_driver.h | 30
> ++++++++++++++++++++++++++++++
> lib/librte_ethdev/rte_ethdev_version.map | 1 +
> 4 files changed, 82 insertions(+)
>
> diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c
> index a4adeff..ea7892a 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -2208,6 +2208,30 @@ struct rte_eth_dev *
> return ret;
> }
>
> +int
> +rte_eth_hairpin_get_peer_ports(uint16_t cur_port, uint16_t *peer_ports,
> + bool direction)
> +{
> + struct rte_eth_dev *dev;
> + int ret;
> +
> + if (!peer_ports)
> + return -EINVAL;
> +
> + RTE_ETH_VALID_PORTID_OR_ERR_RET(cur_port, -EINVAL);
> + dev = &rte_eth_devices[cur_port];
> + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops-
> >hairpin_get_peer_ports,
> + -ENOTSUP);
> +
> + ret = (*dev->dev_ops->hairpin_get_peer_ports)(dev, peer_ports,
> + direction);
> + if (ret < 0)
> + RTE_ETHDEV_LOG(ERR, "Failed to get %d hairpin peer %s
> ports",
> + cur_port, direction ? "RX" : "TX");
> +
> + return ret;
> +}
> +
> void
> rte_eth_tx_buffer_drop_callback(struct rte_mbuf **pkts, uint16_t unsent,
> void *userdata __rte_unused)
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index 94a981c..6680de2 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -2134,6 +2134,33 @@ int rte_eth_tx_queue_setup(uint16_t port_id,
> uint16_t tx_queue_id,
> * @warning
> * @b EXPERIMENTAL: this API may change, or be removed, without prior
> notice
> *
> + * Get all the hairpin peer RX / TX ports of the current port.
> + * The caller should ensure that the array is large enough to save the ports
> + * list.
> + *
> + * @param cur_port
> + * The current port identifier of the Ethernet device.
> + * @param peer_ports
> + * Pointer to the array to save the peer ports list *
> + * @param direction
> + * Current port to peer port direction
> + * true - current used as TX to get all peer RX ports.
> + * false - current used as RX to get all peer TX ports.
> + *
> + * @return
> + * - (0 or positive) actual peer ports number.
> + * - (-EINVAL) if bad parameter.
> + * - (-ENOTSUP) if hardware doesn't support.
> + * - Others detailed errors from PMD drivers.
> + */
> +__rte_experimental
> +int rte_eth_hairpin_get_peer_ports(uint16_t cur_port, uint16_t *peer_ports,
> + bool direction);
> +
I think direction should be changed to int, or change the name to ingress, also
I think we should add the peer_ports array size, so in case the application
didn't allocate enough space it will simply end in error.
> +/**
> + * @warning
> + * @b EXPERIMENTAL: this API may change, or be removed, without prior
> notice
> + *
> * Bind all hairpin TX queues of one port to the RX queues of the peer port.
> * It is only allowed to call this API after all hairpin queues are configured
> * properly and the devices of TX and peer RX are in started state.
> diff --git a/lib/librte_ethdev/rte_ethdev_driver.h
> b/lib/librte_ethdev/rte_ethdev_driver.h
> index f8eb879..ecca9d6 100644
> --- a/lib/librte_ethdev/rte_ethdev_driver.h
> +++ b/lib/librte_ethdev/rte_ethdev_driver.h
> @@ -576,6 +576,34 @@ typedef int (*eth_tx_hairpin_queue_setup_t)
>
> /**
> * @internal
> + * Get all hairpin TX/RX peer ports of the current device, if any.
> + *
> + * @param dev
> + * ethdev handle of port.
> + * @param peer_ports
> + * array to save the ports list.
> + * @param direction
> + * value to decide the current to peer direction
> + * true - used as TX to get all peer RX ports.
> + * false - used as RX to get all peer TX ports.
> + *
> + * @return
> + * Negative errno value on error, 0 or positive on success.
> + *
> + * @retval 0
> + * Success, no peer ports.
> + * @retval >0
> + * Actual number of the peer ports.
> + * @retval -ENOTSUP
> + * Get peer ports API is not supported.
> + * @retval -EINVAL
> + * One of the parameters is invalid.
> + */
> +typedef int (*hairpin_get_peer_ports_t)(struct rte_eth_dev *dev,
> + uint16_t *peer_ports, bool direction);
> +
> +/**
> + * @internal
> * Bind all hairpin TX queues of one port to the RX queues of the peer port.
> *
> * @param dev
> @@ -761,6 +789,8 @@ struct eth_dev_ops {
> /**< Set up device RX hairpin queue. */
> eth_tx_hairpin_queue_setup_t tx_hairpin_queue_setup;
> /**< Set up device TX hairpin queue. */
> + hairpin_get_peer_ports_t hairpin_get_peer_ports;
> + /**< Get hairpin peer ports list. */
> eth_hairpin_bind_t hairpin_bind;
> /**< Bind all hairpin TX queues of device to the peer port RX queues. */
> eth_hairpin_unbind_t hairpin_unbind;
> diff --git a/lib/librte_ethdev/rte_ethdev_version.map
> b/lib/librte_ethdev/rte_ethdev_version.map
> index 18efe4e..1019e28 100644
> --- a/lib/librte_ethdev/rte_ethdev_version.map
> +++ b/lib/librte_ethdev/rte_ethdev_version.map
> @@ -228,6 +228,7 @@ EXPERIMENTAL {
>
> # added in 20.11
> rte_eth_hairpin_bind;
> + rte_eth_hairpin_get_peer_ports;
> rte_eth_hairpin_unbind;
> rte_eth_link_speed_to_str;
> rte_eth_link_to_str;
> --
> 1.8.3.1
More information about the dev
mailing list