On Fri, Apr 3, 2026 at 5:19 AM David Marchand <[email protected]> wrote:
> Let's mark VMDq feature availability as a per device capability. > We can then enforce API calls related to this feature are done on device > with such capability. > > Signed-off-by: David Marchand <[email protected]> > --- > drivers/net/bnxt/bnxt_ethdev.c | 3 ++- > drivers/net/bnxt/bnxt_reps.c | 1 + > drivers/net/intel/e1000/em_ethdev.c | 1 + > drivers/net/intel/e1000/igb_ethdev.c | 1 + > drivers/net/intel/fm10k/fm10k_ethdev.c | 1 + > drivers/net/intel/i40e/i40e_ethdev.c | 3 ++- > drivers/net/intel/i40e/i40e_vf_representor.c | 1 + > drivers/net/intel/ipn3ke/ipn3ke_representor.c | 3 ++- > drivers/net/intel/ixgbe/ixgbe_ethdev.c | 2 ++ > drivers/net/txgbe/txgbe_ethdev.c | 1 + > drivers/net/txgbe/txgbe_ethdev_vf.c | 1 + > lib/ethdev/rte_ethdev.c | 17 +++++++++++++++++ > lib/ethdev/rte_ethdev.h | 2 ++ > 13 files changed, 34 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/bnxt/bnxt_ethdev.c > b/drivers/net/bnxt/bnxt_ethdev.c > index b677f9491d..0f783b9e98 100644 > --- a/drivers/net/bnxt/bnxt_ethdev.c > +++ b/drivers/net/bnxt/bnxt_ethdev.c > @@ -1214,7 +1214,8 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev > *eth_dev, > > dev_info->speed_capa = bnxt_get_speed_capabilities(bp); > dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | > - RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; > + RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP | > + RTE_ETH_DEV_CAPA_VMDQ; > We have not been testing the VMDq feature for sometime, planning to deprecate this feature. Please remove this change. > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > dev_info->default_rxconf = (struct rte_eth_rxconf) { > diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c > index e26a086f41..5e834830e2 100644 > --- a/drivers/net/bnxt/bnxt_reps.c > +++ b/drivers/net/bnxt/bnxt_reps.c > @@ -649,6 +649,7 @@ int bnxt_rep_dev_info_get_op(struct rte_eth_dev > *eth_dev, > dev_info->max_tx_queues = max_rx_rings; > dev_info->reta_size = bnxt_rss_hash_tbl_size(parent_bp); > dev_info->hash_key_size = 40; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > We have not been testing the VMDq feature for sometime, planning to deprecate this feature. Please remove this change. > /* MTU specifics */ > diff --git a/drivers/net/intel/e1000/em_ethdev.c > b/drivers/net/intel/e1000/em_ethdev.c > index 9e15e882b9..389744ad5e 100644 > --- a/drivers/net/intel/e1000/em_ethdev.c > +++ b/drivers/net/intel/e1000/em_ethdev.c > @@ -1175,6 +1175,7 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct > rte_eth_dev_info *dev_info) > RTE_ETH_LINK_SPEED_100M_HD | > RTE_ETH_LINK_SPEED_100M | > RTE_ETH_LINK_SPEED_1G; > > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > /* Preferred queue parameters */ > diff --git a/drivers/net/intel/e1000/igb_ethdev.c > b/drivers/net/intel/e1000/igb_ethdev.c > index ef1599ac38..fe68c18417 100644 > --- a/drivers/net/intel/e1000/igb_ethdev.c > +++ b/drivers/net/intel/e1000/igb_ethdev.c > @@ -2324,6 +2324,7 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct > rte_eth_dev_info *dev_info) > dev_info->tx_queue_offload_capa = > igb_get_tx_queue_offloads_capa(dev); > dev_info->tx_offload_capa = igb_get_tx_port_offloads_capa(dev) | > dev_info->tx_queue_offload_capa; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > switch (hw->mac.type) { > diff --git a/drivers/net/intel/fm10k/fm10k_ethdev.c > b/drivers/net/intel/fm10k/fm10k_ethdev.c > index 97f61afec2..037d2206fd 100644 > --- a/drivers/net/intel/fm10k/fm10k_ethdev.c > +++ b/drivers/net/intel/fm10k/fm10k_ethdev.c > @@ -1444,6 +1444,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev, > dev_info->speed_capa = RTE_ETH_LINK_SPEED_1G | > RTE_ETH_LINK_SPEED_2_5G | > RTE_ETH_LINK_SPEED_10G | RTE_ETH_LINK_SPEED_25G | > RTE_ETH_LINK_SPEED_40G | RTE_ETH_LINK_SPEED_100G; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > > return 0; > } > diff --git a/drivers/net/intel/i40e/i40e_ethdev.c > b/drivers/net/intel/i40e/i40e_ethdev.c > index 100a751225..64c29c6e85 100644 > --- a/drivers/net/intel/i40e/i40e_ethdev.c > +++ b/drivers/net/intel/i40e/i40e_ethdev.c > @@ -3878,7 +3878,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct > rte_eth_dev_info *dev_info) > > dev_info->dev_capa = > RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | > - RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; > + RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP | > + RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) * > diff --git a/drivers/net/intel/i40e/i40e_vf_representor.c > b/drivers/net/intel/i40e/i40e_vf_representor.c > index e8f0bb62a0..d31148acb5 100644 > --- a/drivers/net/intel/i40e/i40e_vf_representor.c > +++ b/drivers/net/intel/i40e/i40e_vf_representor.c > @@ -33,6 +33,7 @@ i40e_vf_representor_dev_infos_get(struct rte_eth_dev > *ethdev, > /* get dev info for the vdev */ > dev_info->device = ethdev->device; > > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > dev_info->max_rx_queues = ethdev->data->nb_rx_queues; > diff --git a/drivers/net/intel/ipn3ke/ipn3ke_representor.c > b/drivers/net/intel/ipn3ke/ipn3ke_representor.c > index cd34d08055..d581ee3c37 100644 > --- a/drivers/net/intel/ipn3ke/ipn3ke_representor.c > +++ b/drivers/net/intel/ipn3ke/ipn3ke_representor.c > @@ -95,7 +95,8 @@ ipn3ke_rpst_dev_infos_get(struct rte_eth_dev *ethdev, > > dev_info->dev_capa = > RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP | > - RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP; > + RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP | > + RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > > dev_info->switch_info.name = ethdev->device->name; > diff --git a/drivers/net/intel/ixgbe/ixgbe_ethdev.c > b/drivers/net/intel/ixgbe/ixgbe_ethdev.c > index 57d929cf2c..5d886b3e28 100644 > --- a/drivers/net/intel/ixgbe/ixgbe_ethdev.c > +++ b/drivers/net/intel/ixgbe/ixgbe_ethdev.c > @@ -3997,6 +3997,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct > rte_eth_dev_info *dev_info) > dev_info->max_mtu = dev_info->max_rx_pktlen - IXGBE_ETH_OVERHEAD; > dev_info->min_mtu = RTE_ETHER_MIN_MTU; > dev_info->vmdq_queue_num = dev_info->max_rx_queues; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->rx_queue_offload_capa = ixgbe_get_rx_queue_offloads(dev); > dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads(dev) | > dev_info->rx_queue_offload_capa); > @@ -4115,6 +4116,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev, > dev_info->max_vmdq_pools = RTE_ETH_16_POOLS; > else > dev_info->max_vmdq_pools = RTE_ETH_64_POOLS; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->rx_queue_offload_capa = ixgbe_get_rx_queue_offloads(dev); > dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads(dev) | > dev_info->rx_queue_offload_capa); > diff --git a/drivers/net/txgbe/txgbe_ethdev.c > b/drivers/net/txgbe/txgbe_ethdev.c > index 5d360f8305..bd818e8269 100644 > --- a/drivers/net/txgbe/txgbe_ethdev.c > +++ b/drivers/net/txgbe/txgbe_ethdev.c > @@ -2836,6 +2836,7 @@ txgbe_dev_info_get(struct rte_eth_dev *dev, struct > rte_eth_dev_info *dev_info) > dev_info->max_vfs = pci_dev->max_vfs; > dev_info->max_vmdq_pools = RTE_ETH_64_POOLS; > dev_info->vmdq_queue_num = dev_info->max_rx_queues; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > dev_info->rx_queue_offload_capa = txgbe_get_rx_queue_offloads(dev); > dev_info->rx_offload_capa = (txgbe_get_rx_port_offloads(dev) | > diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c > b/drivers/net/txgbe/txgbe_ethdev_vf.c > index 39a5fff65c..934763574c 100644 > --- a/drivers/net/txgbe/txgbe_ethdev_vf.c > +++ b/drivers/net/txgbe/txgbe_ethdev_vf.c > @@ -572,6 +572,7 @@ txgbevf_dev_info_get(struct rte_eth_dev *dev, > dev_info->max_hash_mac_addrs = TXGBE_VMDQ_NUM_UC_MAC; > dev_info->max_vfs = pci_dev->max_vfs; > dev_info->max_vmdq_pools = RTE_ETH_64_POOLS; > + dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ; > dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP; > dev_info->rx_queue_offload_capa = txgbe_get_rx_queue_offloads(dev); > dev_info->rx_offload_capa = (txgbe_get_rx_port_offloads(dev) | > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index 9577b7d848..7ba539e796 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -158,6 +158,7 @@ static const struct { > {RTE_ETH_DEV_CAPA_RXQ_SHARE, "RXQ_SHARE"}, > {RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP, "FLOW_RULE_KEEP"}, > {RTE_ETH_DEV_CAPA_FLOW_SHARED_OBJECT_KEEP, > "FLOW_SHARED_OBJECT_KEEP"}, > + {RTE_ETH_DEV_CAPA_VMDQ, "VMDQ"}, > }; > > enum { > @@ -1581,6 +1582,22 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t > nb_rx_q, uint16_t nb_tx_q, > goto rollback; > } > > + if (!(dev_info.dev_capa & RTE_ETH_DEV_CAPA_VMDQ)) { > + if ((dev_conf->rxmode.mq_mode & RTE_ETH_MQ_RX_VMDQ_FLAG) > != 0) { > + RTE_ETHDEV_LOG_LINE(ERR, "Ethdev port_id=%u does > not support VMDq rx mode", > + port_id); > + ret = -EINVAL; > + goto rollback; > + } > + if (dev_conf->txmode.mq_mode == RTE_ETH_MQ_TX_VMDQ_DCB || > + dev_conf->txmode.mq_mode == > RTE_ETH_MQ_TX_VMDQ_ONLY) { > + RTE_ETHDEV_LOG_LINE(ERR, "Ethdev port_id=%u does > not support VMDq tx mode", > + port_id); > + ret = -EINVAL; > + goto rollback; > + } > + } > + > /* > * Setup new number of Rx/Tx queues and reconfigure device. > */ > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h > index 0d8e2d0236..62c72de0e5 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -1696,6 +1696,8 @@ struct rte_eth_conf { > #define RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP RTE_BIT64(3) > /** Device supports keeping shared flow objects across restart. */ > #define RTE_ETH_DEV_CAPA_FLOW_SHARED_OBJECT_KEEP RTE_BIT64(4) > +/** Device supports VMDq. */ > +#define RTE_ETH_DEV_CAPA_VMDQ RTE_BIT64(5) > /**@}*/ > > /* > -- > 2.53.0 > >
smime.p7s
Description: S/MIME Cryptographic Signature

