mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 15:07:13 -04:00
iavf: Fix refreshing iavf adapter stats on ethtool request
Currently iavf adapter statistics are refreshed only in a
watchdog task, triggered approximately every two seconds,
which causes some ethtool requests to return outdated values.
Add explicit statistics refresh when requested by ethtool -S.
Fixes: b476b0030e ("iavf: Move commands processing to the separate function")
Signed-off-by: Jan Sokolowski <jan.sokolowski@intel.com>
Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com>
Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
0cc318d2e8
commit
3b5bdd18eb
@@ -305,6 +305,7 @@ struct iavf_adapter {
|
||||
#define IAVF_FLAG_AQ_DEL_FDIR_FILTER BIT(26)
|
||||
#define IAVF_FLAG_AQ_ADD_ADV_RSS_CFG BIT(27)
|
||||
#define IAVF_FLAG_AQ_DEL_ADV_RSS_CFG BIT(28)
|
||||
#define IAVF_FLAG_AQ_REQUEST_STATS BIT(29)
|
||||
|
||||
/* OS defined structs */
|
||||
struct net_device *netdev;
|
||||
@@ -444,6 +445,7 @@ int iavf_up(struct iavf_adapter *adapter);
|
||||
void iavf_down(struct iavf_adapter *adapter);
|
||||
int iavf_process_config(struct iavf_adapter *adapter);
|
||||
void iavf_schedule_reset(struct iavf_adapter *adapter);
|
||||
void iavf_schedule_request_stats(struct iavf_adapter *adapter);
|
||||
void iavf_reset(struct iavf_adapter *adapter);
|
||||
void iavf_set_ethtool_ops(struct net_device *netdev);
|
||||
void iavf_update_stats(struct iavf_adapter *adapter);
|
||||
|
||||
@@ -354,6 +354,9 @@ static void iavf_get_ethtool_stats(struct net_device *netdev,
|
||||
struct iavf_adapter *adapter = netdev_priv(netdev);
|
||||
unsigned int i;
|
||||
|
||||
/* Explicitly request stats refresh */
|
||||
iavf_schedule_request_stats(adapter);
|
||||
|
||||
iavf_add_ethtool_stats(&data, adapter, iavf_gstrings_stats);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
@@ -174,6 +174,19 @@ void iavf_schedule_reset(struct iavf_adapter *adapter)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_schedule_request_stats - Set the flags and schedule statistics request
|
||||
* @adapter: board private structure
|
||||
*
|
||||
* Sets IAVF_FLAG_AQ_REQUEST_STATS flag so iavf_watchdog_task() will explicitly
|
||||
* request and refresh ethtool stats
|
||||
**/
|
||||
void iavf_schedule_request_stats(struct iavf_adapter *adapter)
|
||||
{
|
||||
adapter->aq_required |= IAVF_FLAG_AQ_REQUEST_STATS;
|
||||
mod_delayed_work(iavf_wq, &adapter->watchdog_task, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_tx_timeout - Respond to a Tx Hang
|
||||
* @netdev: network interface device structure
|
||||
@@ -1709,6 +1722,11 @@ static int iavf_process_aq_command(struct iavf_adapter *adapter)
|
||||
iavf_del_adv_rss_cfg(adapter);
|
||||
return 0;
|
||||
}
|
||||
if (adapter->aq_required & IAVF_FLAG_AQ_REQUEST_STATS) {
|
||||
iavf_request_stats(adapter);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
||||
@@ -784,6 +784,8 @@ void iavf_request_stats(struct iavf_adapter *adapter)
|
||||
/* no error message, this isn't crucial */
|
||||
return;
|
||||
}
|
||||
|
||||
adapter->aq_required &= ~IAVF_FLAG_AQ_REQUEST_STATS;
|
||||
adapter->current_op = VIRTCHNL_OP_GET_STATS;
|
||||
vqs.vsi_id = adapter->vsi_res->vsi_id;
|
||||
/* queue maps are ignored for this message - only the vsi is used */
|
||||
|
||||
Reference in New Issue
Block a user