Commit 333e2f2c authored by Jacob Keller's avatar Jacob Keller Committed by Jeff Kirsher

i40e: fix i40e_add_queue_stats data pointer update

This function accidentally failed to update the data pointer, which
caused the reported stats to be incorrect. Additionally, statistics
which follow queue stats in the output would potentially read non-zeroed
garbage data from the ethtool buffer.

This occurred because the data double pointer was not dereferenced
before incrementing the size.

Additionally, make sure this issue is more visible by adding a WARN_ONCE
to the i40e_get_ethtool_stats function. This warning will trigger
whenever the data pointer is not at the expected address, similar to the
check that we make in the i40e_get_stat_strings() function.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent f05798b4
...@@ -1860,6 +1860,7 @@ static void i40e_get_ethtool_stats(struct net_device *netdev, ...@@ -1860,6 +1860,7 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
unsigned int i; unsigned int i;
unsigned int start; unsigned int start;
bool veb_stats; bool veb_stats;
u64 *p = data;
i40e_update_stats(vsi); i40e_update_stats(vsi);
...@@ -1902,7 +1903,7 @@ static void i40e_get_ethtool_stats(struct net_device *netdev, ...@@ -1902,7 +1903,7 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
} }
rcu_read_unlock(); rcu_read_unlock();
if (vsi != pf->vsi[pf->lan_vsi] || pf->hw.partition_id != 1) if (vsi != pf->vsi[pf->lan_vsi] || pf->hw.partition_id != 1)
return; goto check_data_pointer;
veb_stats = ((pf->lan_veb != I40E_NO_VEB) && veb_stats = ((pf->lan_veb != I40E_NO_VEB) &&
(pf->flags & I40E_FLAG_VEB_STATS_ENABLED)); (pf->flags & I40E_FLAG_VEB_STATS_ENABLED));
...@@ -1925,6 +1926,10 @@ static void i40e_get_ethtool_stats(struct net_device *netdev, ...@@ -1925,6 +1926,10 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
i40e_add_ethtool_stats(&data, &pfc, i40e_gstrings_pfc_stats); i40e_add_ethtool_stats(&data, &pfc, i40e_gstrings_pfc_stats);
} }
check_data_pointer:
WARN_ONCE(data - p != i40e_get_stats_count(netdev),
"ethtool stats count mismatch!");
} }
/** /**
......
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