iavf: Fix refreshing iavf adapter stats on ethtool request
[ Upstream commit 3b5bdd18eb76e7570d9bacbcab6828a9b26ae121 ] 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: b476b0030e61 ("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e4031c048f
commit
8d4b4e0f01
@ -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;
|
||||
@ -398,6 +399,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();
|
||||
|
@ -165,6 +165,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
|
||||
@ -1700,6 +1713,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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user