Commit 64430f70 authored by Jedrzej Jagielski's avatar Jedrzej Jagielski Committed by Tony Nguyen

iavf: Fix displaying queue statistics shown by ethtool

Driver provided too many lines as an output to ethtool -S command.
Return actual length of string set of ethtool stats. Instead of predefined
maximal value use the actual value on netdev, iterate over active queues.
Without this patch, ethtool -S report would produce additional
erroneous lines of queues that are not configured.
Signed-off-by: default avatarWitold Fijalkowski <witoldx.fijalkowski@intel.com>
Signed-off-by: default avatarPrzemyslaw Patynowski <przemyslawx.patynowski@intel.com>
Signed-off-by: default avatarMateusz Palczewski <mateusz.palczewski@intel.com>
Signed-off-by: default avatarJedrzej Jagielski <jedrzej.jagielski@intel.com>
Tested-by: default avatarKonrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent c2fbcc94
...@@ -331,9 +331,16 @@ static int iavf_get_link_ksettings(struct net_device *netdev, ...@@ -331,9 +331,16 @@ static int iavf_get_link_ksettings(struct net_device *netdev,
**/ **/
static int iavf_get_sset_count(struct net_device *netdev, int sset) static int iavf_get_sset_count(struct net_device *netdev, int sset)
{ {
/* Report the maximum number queues, even if not every queue is
* currently configured. Since allocation of queues is in pairs,
* use netdev->real_num_tx_queues * 2. The real_num_tx_queues is set
* at device creation and never changes.
*/
if (sset == ETH_SS_STATS) if (sset == ETH_SS_STATS)
return IAVF_STATS_LEN + return IAVF_STATS_LEN +
(IAVF_QUEUE_STATS_LEN * 2 * IAVF_MAX_REQ_QUEUES); (IAVF_QUEUE_STATS_LEN * 2 *
netdev->real_num_tx_queues);
else if (sset == ETH_SS_PRIV_FLAGS) else if (sset == ETH_SS_PRIV_FLAGS)
return IAVF_PRIV_FLAGS_STR_LEN; return IAVF_PRIV_FLAGS_STR_LEN;
else else
...@@ -360,17 +367,18 @@ static void iavf_get_ethtool_stats(struct net_device *netdev, ...@@ -360,17 +367,18 @@ static void iavf_get_ethtool_stats(struct net_device *netdev,
iavf_add_ethtool_stats(&data, adapter, iavf_gstrings_stats); iavf_add_ethtool_stats(&data, adapter, iavf_gstrings_stats);
rcu_read_lock(); rcu_read_lock();
for (i = 0; i < IAVF_MAX_REQ_QUEUES; i++) { /* As num_active_queues describe both tx and rx queues, we can use
* it to iterate over rings' stats.
*/
for (i = 0; i < adapter->num_active_queues; i++) {
struct iavf_ring *ring; struct iavf_ring *ring;
/* Avoid accessing un-allocated queues */ /* Tx rings stats */
ring = (i < adapter->num_active_queues ? ring = &adapter->tx_rings[i];
&adapter->tx_rings[i] : NULL);
iavf_add_queue_stats(&data, ring); iavf_add_queue_stats(&data, ring);
/* Avoid accessing un-allocated queues */ /* Rx rings stats */
ring = (i < adapter->num_active_queues ? ring = &adapter->rx_rings[i];
&adapter->rx_rings[i] : NULL);
iavf_add_queue_stats(&data, ring); iavf_add_queue_stats(&data, ring);
} }
rcu_read_unlock(); rcu_read_unlock();
...@@ -407,10 +415,10 @@ static void iavf_get_stat_strings(struct net_device *netdev, u8 *data) ...@@ -407,10 +415,10 @@ static void iavf_get_stat_strings(struct net_device *netdev, u8 *data)
iavf_add_stat_strings(&data, iavf_gstrings_stats); iavf_add_stat_strings(&data, iavf_gstrings_stats);
/* Queues are always allocated in pairs, so we just use num_tx_queues /* Queues are always allocated in pairs, so we just use
* for both Tx and Rx queues. * real_num_tx_queues for both Tx and Rx queues.
*/ */
for (i = 0; i < netdev->num_tx_queues; i++) { for (i = 0; i < netdev->real_num_tx_queues; i++) {
iavf_add_stat_strings(&data, iavf_gstrings_queue_stats, iavf_add_stat_strings(&data, iavf_gstrings_queue_stats,
"tx", i); "tx", i);
iavf_add_stat_strings(&data, iavf_gstrings_queue_stats, iavf_add_stat_strings(&data, iavf_gstrings_queue_stats,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment