> -----Original Message----- > From: Doherty, Declan > Sent: Thursday, April 26, 2018 11:41 AM > To: dev@dpdk.org > Cc: Adrien Mazarguil <adrien.mazarg...@6wind.com>; Yigit, Ferruh > <ferruh.yi...@intel.com>; Thomas Monjalon <tho...@monjalon.net>; > Shahaf Shuler <shah...@mellanox.com>; Ananyev, Konstantin > <konstantin.anan...@intel.com>; Doherty, Declan > <declan.dohe...@intel.com> > Subject: [dpdk-dev][PATCH v8 7/9] ethdev: add switch domain allocator > > Add switch domain allocate and free API to enable NET devices to synchronise > switch domain allocation. > > Signed-off-by: Declan Doherty <declan.dohe...@intel.com> > --- > lib/librte_ether/rte_ethdev.c | 54 > +++++++++++++++++++++++++++++++++ > lib/librte_ether/rte_ethdev_driver.h | 39 ++++++++++++++++++++++++ > lib/librte_ether/rte_ethdev_version.map | 2 ++ > 3 files changed, 95 insertions(+) > > diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c > index cb85d8bb7..a09c7e5b3 100644 > --- a/lib/librte_ether/rte_ethdev.c > +++ b/lib/librte_ether/rte_ethdev.c > @@ -4102,6 +4102,60 @@ rte_eth_dev_pool_ops_supported(uint16_t port_id, const > char *pool) > return (*dev->dev_ops->pool_ops_supported)(dev, pool); > } > > +/** > + * A set of values to describe the possible states of a switch domain. > + */ > +enum rte_eth_switch_domain_state { > + RTE_ETH_SWITCH_DOMAIN_UNUSED = 0, > + RTE_ETH_SWITCH_DOMAIN_ALLOCATED > +}; > + > +/** > + * Array of switch domains available for allocation. Array is sized to > + * RTE_MAX_ETHPORTS elements as there cannot be more active switch domains > than > + * ethdev ports in a single process. > + */
Question from previous version review: Probably already discussed before, but if we can't have more than one switch_id per port, while we can't use port_id as switch_id? Or switch_id can represent some other entity (not rte_ethdev)? Konstantin > +struct rte_eth_dev_switch { > + enum rte_eth_switch_domain_state state; > +} rte_eth_switch_domains[RTE_MAX_ETHPORTS]; > + > +int __rte_experimental > +rte_eth_switch_domain_alloc(uint16_t *domain_id) > +{ > + unsigned int i; > + > + *domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID; > + > + for (i = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID + 1; > + i < RTE_MAX_ETHPORTS; i++) { > + if (rte_eth_switch_domains[i].state == > + RTE_ETH_SWITCH_DOMAIN_UNUSED) { > + rte_eth_switch_domains[i].state = > + RTE_ETH_SWITCH_DOMAIN_ALLOCATED; > + *domain_id = i; > + return 0; > + } > + } > + > + return -ENOSPC; > +} > + > +int __rte_experimental > +rte_eth_switch_domain_free(uint16_t domain_id) > +{ > + if (domain_id == RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID || > + domain_id >= RTE_MAX_ETHPORTS) > + return -EINVAL; > + > + if (rte_eth_switch_domains[domain_id].state != > + RTE_ETH_SWITCH_DOMAIN_ALLOCATED) > + return -EINVAL; > + > + rte_eth_switch_domains[domain_id].state = RTE_ETH_SWITCH_DOMAIN_UNUSED; > + > + return 0; > +} > + > typedef int (*rte_eth_devargs_callback_t)(char *str, void *data); > > static int > diff --git a/lib/librte_ether/rte_ethdev_driver.h > b/lib/librte_ether/rte_ethdev_driver.h > index 492da754a..f428afa72 100644 > --- a/lib/librte_ether/rte_ethdev_driver.h > +++ b/lib/librte_ether/rte_ethdev_driver.h > @@ -188,6 +188,45 @@ rte_eth_linkstatus_get(const struct rte_eth_dev *dev, > #endif > } > > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Allocate an unique switch domain identifier. > + * > + * A pool of switch domain identifiers which can be allocated on request. > This > + * will enabled devices which support the concept of switch domains to > request > + * a switch domain id which is guaranteed to be unique from other devices > + * running in the same process. > + * > + * @param domain_id > + * switch domain identifier parameter to pass back to application > + * > + * @return > + * Negative errno value on error, 0 on success. > + */ > +int __rte_experimental > +rte_eth_switch_domain_alloc(uint16_t *domain_id); > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Free switch domain. > + * > + * Return a switch domain identifier to the pool of free identifiers after > it is > + * no longer in use by device. > + * > + * @param domain_id > + * switch domain identifier to free > + * > + * @return > + * Negative errno value on error, 0 on success. > + */ > +int __rte_experimental > +rte_eth_switch_domain_free(uint16_t domain_id); > + > + > > /** Generic Ethernet device arguments */ > struct rte_eth_devargs { > diff --git a/lib/librte_ether/rte_ethdev_version.map > b/lib/librte_ether/rte_ethdev_version.map > index 41c3d2699..86f06769a 100644 > --- a/lib/librte_ether/rte_ethdev_version.map > +++ b/lib/librte_ether/rte_ethdev_version.map > @@ -220,6 +220,8 @@ EXPERIMENTAL { > rte_eth_dev_rx_offload_name; > rte_eth_dev_tx_offload_name; > rte_eth_find_next_owned_by; > + rte_eth_switch_domain_alloc; > + rte_eth_switch_domain_free; > rte_mtr_capabilities_get; > rte_mtr_create; > rte_mtr_destroy; > -- > 2.14.3