ethdev: add function to adjust number of descriptors
authorRoman Zhukov <roman.zhukov@oktetlabs.ru>
Thu, 25 May 2017 15:57:53 +0000 (16:57 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Sat, 8 Jul 2017 16:46:47 +0000 (18:46 +0200)
Check that numbers of Rx and Tx descriptors satisfy descriptors limits
from the Ethernet device information, otherwise adjust them to boundaries.

Signed-off-by: Roman Zhukov <roman.zhukov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
lib/librte_ether/rte_ethdev.c
lib/librte_ether/rte_ethdev.h
lib/librte_ether/rte_ether_version.map

index 957ae2a..838ace3 100644 (file)
@@ -3360,3 +3360,40 @@ rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
                                -ENOTSUP);
        return (*dev->dev_ops->l2_tunnel_offload_set)(dev, l2_tunnel, mask, en);
 }
+
+static void
+rte_eth_dev_adjust_nb_desc(uint16_t *nb_desc,
+                          const struct rte_eth_desc_lim *desc_lim)
+{
+       if (desc_lim->nb_align != 0)
+               *nb_desc = RTE_ALIGN_CEIL(*nb_desc, desc_lim->nb_align);
+
+       if (desc_lim->nb_max != 0)
+               *nb_desc = RTE_MIN(*nb_desc, desc_lim->nb_max);
+
+       *nb_desc = RTE_MAX(*nb_desc, desc_lim->nb_min);
+}
+
+int
+rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+                                uint16_t *nb_rx_desc,
+                                uint16_t *nb_tx_desc)
+{
+       struct rte_eth_dev *dev;
+       struct rte_eth_dev_info dev_info;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       dev = &rte_eth_devices[port_id];
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
+
+       rte_eth_dev_info_get(port_id, &dev_info);
+
+       if (nb_rx_desc != NULL)
+               rte_eth_dev_adjust_nb_desc(nb_rx_desc, &dev_info.rx_desc_lim);
+
+       if (nb_tx_desc != NULL)
+               rte_eth_dev_adjust_nb_desc(nb_tx_desc, &dev_info.tx_desc_lim);
+
+       return 0;
+}
index d1076c8..5093436 100644 (file)
@@ -4375,6 +4375,26 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id);
 int
 rte_eth_dev_get_name_by_port(uint8_t port_id, char *name);
 
+/**
+ * Check that numbers of Rx and Tx descriptors satisfy descriptors limits from
+ * the ethernet device information, otherwise adjust them to boundaries.
+ *
+ * @param port_id
+ *   The port identifier of the Ethernet device.
+ * @param nb_rx_desc
+ *   A pointer to a uint16_t where the number of receive
+ *   descriptors stored.
+ * @param nb_tx_desc
+ *   A pointer to a uint16_t where the number of transmit
+ *   descriptors stored.
+ * @return
+ *   - (0) if successful.
+ *   - (-ENOTSUP, -ENODEV or -EINVAL) on failure.
+ */
+int rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+                                    uint16_t *nb_rx_desc,
+                                    uint16_t *nb_tx_desc);
+
 #ifdef __cplusplus
 }
 #endif
index 6f65f83..08deb1f 100644 (file)
@@ -152,6 +152,7 @@ DPDK_17.08 {
        global:
 
        _rte_eth_dev_callback_process;
+       rte_eth_dev_adjust_nb_rx_tx_desc;
        rte_flow_copy;
        rte_flow_isolate;