> -----Original Message----- > From: Ferruh Yigit <ferruh.yi...@intel.com> > Sent: Tuesday, January 14, 2020 17:32 > To: Slava Ovsiienko <viachesl...@mellanox.com>; dev@dpdk.org > Cc: Thomas Monjalon <tho...@monjalon.net>; declan.dohe...@intel.com; > sta...@dpdk.org > Subject: Re: [PATCH] ethdev: fix switching domain allocation > > On 12/19/2019 12:47 PM, Viacheslav Ovsiienko wrote: > > The maximum amount of unique switching domain is supposed to be equal > > to RTE_MAX_ETHPORTS. The current implementation allows to allocate > > only RTE_MAX_ETHPORTS-1 domains. > > > > Fixes: ce9250406323 ("ethdev: add switch domain allocator") > > Cc: sta...@dpdk.org > > > > Signed-off-by: Viacheslav Ovsiienko <viachesl...@mellanox.com> > > --- > > lib/librte_ethdev/rte_ethdev.c | 13 +++++++------ > > 1 file changed, 7 insertions(+), 6 deletions(-) > > > > diff --git a/lib/librte_ethdev/rte_ethdev.c > > b/lib/librte_ethdev/rte_ethdev.c index 6e9cb24..4c2312c 100644 > > --- a/lib/librte_ethdev/rte_ethdev.c > > +++ b/lib/librte_ethdev/rte_ethdev.c > > @@ -5065,10 +5065,10 @@ enum rte_eth_switch_domain_state { > > *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 == > > + i <= RTE_MAX_ETHPORTS; i++) { > > + if (rte_eth_switch_domains[i - 1].state == > > RTE_ETH_SWITCH_DOMAIN_UNUSED) { > > - rte_eth_switch_domains[i].state = > > + rte_eth_switch_domains[i - 1].state = > > RTE_ETH_SWITCH_DOMAIN_ALLOCATED; > > *domain_id = i; > > I would keep the indexes same but change how to set the 'domain_id' to > "*domain_id = i + 1;", that makes logic simpler. Agree.
> Would it be simpler if the invalid domain id value used as UINT16_MAX > instead of '0'? This enables using 'domain_id' as index and prevent this error > prone indexing. My concern was not to change the existing RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID definition, which currently is zero. Currently, AFAIK, the switch feature is supported by mlx5 only, other PMDs do not bother to initialize the rte_eth_dev_info-> switch_info structure (no one sets RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID to domain_id field for now). So, changing the RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID from zero might cause wrong switch capability reporting from PMDs. > > And I think it makes sense to start the loop with "i = 0", instead of > 'RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID', you are walking through the > port list, why to involve the 'RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID' > here. I do not know why it was implemented in this way 😊 I just was trying to introduce the minimalistic fix. I'll think how to extend my fix a bit. > > > return 0; > > @@ -5082,14 +5082,15 @@ enum rte_eth_switch_domain_state { > > rte_eth_switch_domain_free(uint16_t domain_id) { > > if (domain_id == RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID || > > - domain_id >= RTE_MAX_ETHPORTS) > > + domain_id > RTE_MAX_ETHPORTS) > > return -EINVAL; > > > > - if (rte_eth_switch_domains[domain_id].state != > > + if (rte_eth_switch_domains[domain_id - 1].state != > > RTE_ETH_SWITCH_DOMAIN_ALLOCATED) > > return -EINVAL; > > > > - rte_eth_switch_domains[domain_id].state = > RTE_ETH_SWITCH_DOMAIN_UNUSED; > > + rte_eth_switch_domains[domain_id - 1].state = > > + RTE_ETH_SWITCH_DOMAIN_UNUSED; > > > > return 0; > > } > > With best regards, Slava