On 10/25/2024 10:27 AM, Morten Brørup wrote: > Removed the requirement that the configured number of queues to provide > statistics for (RTE_ETHDEV_QUEUE_STAT_CNTRS) cannot be less than the > driver's max number of supported transmit queues (VMXNET3_MAX_TX_QUEUES). > > Also improved support for virtual hardware version 6. > > Signed-off-by: Morten Brørup <m...@smartsharesystems.com> > --- > v2: > * Virtual hardware version 6 supports more queues; updated some arrays > accordingly. > * Added support for larger MTU with virtual hardware version 6. > --- > drivers/net/vmxnet3/vmxnet3_ethdev.c | 34 +++++++++++++++++----------- > drivers/net/vmxnet3/vmxnet3_ethdev.h | 4 ++-- > 2 files changed, 23 insertions(+), 15 deletions(-) > > diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c > b/drivers/net/vmxnet3/vmxnet3_ethdev.c > index 78fac63ab6..1752c58069 100644 > --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c > +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c > @@ -1470,42 +1470,52 @@ vmxnet3_dev_stats_get(struct rte_eth_dev *dev, struct > rte_eth_stats *stats) > struct vmxnet3_hw *hw = dev->data->dev_private; > struct UPT1_TxStats txStats; > struct UPT1_RxStats rxStats; > + uint64_t packets, bytes; > > VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); > > for (i = 0; i < hw->num_tx_queues; i++) { > vmxnet3_tx_stats_get(hw, i, &txStats); > > - stats->q_opackets[i] = txStats.ucastPktsTxOK + > + packets = txStats.ucastPktsTxOK + > txStats.mcastPktsTxOK + > txStats.bcastPktsTxOK; > > - stats->q_obytes[i] = txStats.ucastBytesTxOK + > + bytes = txStats.ucastBytesTxOK + > txStats.mcastBytesTxOK + > txStats.bcastBytesTxOK; > > - stats->opackets += stats->q_opackets[i]; > - stats->obytes += stats->q_obytes[i]; > + stats->opackets += packets; > + stats->obytes += bytes; > stats->oerrors += txStats.pktsTxError + txStats.pktsTxDiscard; > + > + if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) { > + stats->q_opackets[i] = packets; > + stats->q_obytes[i] = bytes; > + } > } > > for (i = 0; i < hw->num_rx_queues; i++) { > vmxnet3_rx_stats_get(hw, i, &rxStats); > > - stats->q_ipackets[i] = rxStats.ucastPktsRxOK + > + packets = rxStats.ucastPktsRxOK + > rxStats.mcastPktsRxOK + > rxStats.bcastPktsRxOK; > > - stats->q_ibytes[i] = rxStats.ucastBytesRxOK + > + bytes = rxStats.ucastBytesRxOK + > rxStats.mcastBytesRxOK + > rxStats.bcastBytesRxOK; > > - stats->ipackets += stats->q_ipackets[i]; > - stats->ibytes += stats->q_ibytes[i]; > - > - stats->q_errors[i] = rxStats.pktsRxError; > + stats->ipackets += packets; > + stats->ibytes += bytes; > stats->ierrors += rxStats.pktsRxError; > stats->imissed += rxStats.pktsRxOutOfBuf; > + > + if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) { > + stats->q_ipackets[i] = packets; > + stats->q_ibytes[i] = bytes; > + stats->q_errors[i] = rxStats.pktsRxError; > + } > } >
Ack, this is also a fix, since queue size can be up to 'VMXNET3_EXT_MAX_RX_QUEUES' (32) for version 6, even if 'RTE_ETHDEV_QUEUE_STAT_CNTRS > VMXNET3_MAX_TX_QUEUES', 'RTE_ETHDEV_QUEUE_STAT_CNTRS ' still can be smaller than 'VMXNET3_EXT_MAX_RX_QUEUES', which will cause accessing out of boundary to queue stats array. > > return 0; > @@ -1521,8 +1531,6 @@ vmxnet3_dev_stats_reset(struct rte_eth_dev *dev) > > VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS); > > - RTE_BUILD_BUG_ON(RTE_ETHDEV_QUEUE_STAT_CNTRS < VMXNET3_MAX_TX_QUEUES); > - > for (i = 0; i < hw->num_tx_queues; i++) { > vmxnet3_hw_tx_stats_get(hw, i, &txStats); > memcpy(&hw->snapshot_tx_stats[i], &txStats, > @@ -1566,7 +1574,7 @@ vmxnet3_dev_info_get(struct rte_eth_dev *dev, > dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM; > dev_info->max_rx_pktlen = 16384; /* includes CRC, cf MAXFRS register */ > dev_info->min_mtu = VMXNET3_MIN_MTU; > - dev_info->max_mtu = VMXNET3_MAX_MTU; > + dev_info->max_mtu = VMXNET3_VERSION_GE_6(hw) ? VMXNET3_V6_MAX_MTU : > VMXNET3_MAX_MTU; > Hi Morten, The MTU update is unrelated with the main purpose of this patch, what do you think to separate above to its own function. > dev_info->speed_capa = RTE_ETH_LINK_SPEED_10G; > dev_info->max_mac_addrs = VMXNET3_MAX_MAC_ADDRS; > > diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h > b/drivers/net/vmxnet3/vmxnet3_ethdev.h > index 2b3e2c4caa..e9ded6663d 100644 > --- a/drivers/net/vmxnet3/vmxnet3_ethdev.h > +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h > @@ -121,8 +121,8 @@ struct vmxnet3_hw { > #define VMXNET3_VFT_TABLE_SIZE (VMXNET3_VFT_SIZE * sizeof(uint32_t)) > UPT1_TxStats saved_tx_stats[VMXNET3_EXT_MAX_TX_QUEUES]; > UPT1_RxStats saved_rx_stats[VMXNET3_EXT_MAX_RX_QUEUES]; > - UPT1_TxStats snapshot_tx_stats[VMXNET3_MAX_TX_QUEUES]; > - UPT1_RxStats snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES]; > + UPT1_TxStats snapshot_tx_stats[VMXNET3_EXT_MAX_TX_QUEUES]; > + UPT1_RxStats snapshot_rx_stats[VMXNET3_EXT_MAX_RX_QUEUES]; > Ack, probably above needs to be fixed anyway, even with "VMXNET3_MAX_TX_QUEUES < RTE_ETHDEV_QUEUE_STAT_CNTRS" restriction (as RTE_ETHDEV_QUEUE_STAT_CNTRS can be configured to be a bigger value during build).