mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-03-05 10:57:56 +07:00
ice: implement VF stats NDO
Implement the VF stats gathering via the kernel via ndo_get_vf_stats(). The driver will show per-VF stats in the output of the ip -s link show dev <PF> command. Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
4c66d227e4
commit
730fdea40b
@ -5219,6 +5219,7 @@ static const struct net_device_ops ice_netdev_ops = {
|
||||
.ndo_set_vf_trust = ice_set_vf_trust,
|
||||
.ndo_set_vf_vlan = ice_set_vf_port_vlan,
|
||||
.ndo_set_vf_link_state = ice_set_vf_link_state,
|
||||
.ndo_get_vf_stats = ice_get_vf_stats,
|
||||
.ndo_vlan_rx_add_vid = ice_vlan_rx_add_vid,
|
||||
.ndo_vlan_rx_kill_vid = ice_vlan_rx_kill_vid,
|
||||
.ndo_set_features = ice_set_features,
|
||||
|
@ -3391,3 +3391,48 @@ int ice_set_vf_link_state(struct net_device *netdev, int vf_id, int link_state)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_get_vf_stats - populate some stats for the VF
|
||||
* @netdev: the netdev of the PF
|
||||
* @vf_id: the host OS identifier (0-255)
|
||||
* @vf_stats: pointer to the OS memory to be initialized
|
||||
*/
|
||||
int ice_get_vf_stats(struct net_device *netdev, int vf_id,
|
||||
struct ifla_vf_stats *vf_stats)
|
||||
{
|
||||
struct ice_pf *pf = ice_netdev_to_pf(netdev);
|
||||
struct ice_eth_stats *stats;
|
||||
struct ice_vsi *vsi;
|
||||
struct ice_vf *vf;
|
||||
|
||||
if (ice_validate_vf_id(pf, vf_id))
|
||||
return -EINVAL;
|
||||
|
||||
vf = &pf->vf[vf_id];
|
||||
|
||||
if (ice_check_vf_init(pf, vf))
|
||||
return -EBUSY;
|
||||
|
||||
vsi = pf->vsi[vf->lan_vsi_idx];
|
||||
if (!vsi)
|
||||
return -EINVAL;
|
||||
|
||||
ice_update_eth_stats(vsi);
|
||||
stats = &vsi->eth_stats;
|
||||
|
||||
memset(vf_stats, 0, sizeof(*vf_stats));
|
||||
|
||||
vf_stats->rx_packets = stats->rx_unicast + stats->rx_broadcast +
|
||||
stats->rx_multicast;
|
||||
vf_stats->tx_packets = stats->tx_unicast + stats->tx_broadcast +
|
||||
stats->tx_multicast;
|
||||
vf_stats->rx_bytes = stats->rx_bytes;
|
||||
vf_stats->tx_bytes = stats->tx_bytes;
|
||||
vf_stats->broadcast = stats->rx_broadcast;
|
||||
vf_stats->multicast = stats->rx_multicast;
|
||||
vf_stats->rx_dropped = stats->rx_discards;
|
||||
vf_stats->tx_dropped = stats->tx_discards;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -122,6 +122,9 @@ int ice_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool ena);
|
||||
int ice_calc_vf_reg_idx(struct ice_vf *vf, struct ice_q_vector *q_vector);
|
||||
|
||||
void ice_set_vf_state_qs_dis(struct ice_vf *vf);
|
||||
int
|
||||
ice_get_vf_stats(struct net_device *netdev, int vf_id,
|
||||
struct ifla_vf_stats *vf_stats);
|
||||
#else /* CONFIG_PCI_IOV */
|
||||
#define ice_process_vflr_event(pf) do {} while (0)
|
||||
#define ice_free_vfs(pf) do {} while (0)
|
||||
@ -194,5 +197,13 @@ ice_calc_vf_reg_idx(struct ice_vf __always_unused *vf,
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
ice_get_vf_stats(struct net_device __always_unused *netdev,
|
||||
int __always_unused vf_id,
|
||||
struct ifla_vf_stats __always_unused *vf_stats)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
#endif /* _ICE_VIRTCHNL_PF_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user