Skip to content

Commit

Permalink
vxge: Implement 64bit stats
Browse files Browse the repository at this point in the history
vxge_get_stats() is racy, since it clears a block of memory (net_stats)
possibly still used by other cpus.

We can update this driver to full 64bit stats, since ndo_get_stats64()
provides a private block to store results, and driver maintains 64bit
counters already.

We also remove net_stats field from struct vxge_sw_stats

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Jon Mason <jon.mason@exar.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Aug 19, 2010
1 parent b928409 commit dd57f97
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 16 deletions.
22 changes: 7 additions & 15 deletions drivers/net/vxge/vxge-main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2914,26 +2914,18 @@ static int vxge_change_mtu(struct net_device *dev, int new_mtu)
}

/**
* vxge_get_stats
* vxge_get_stats64
* @dev: pointer to the device structure
* @stats: pointer to struct rtnl_link_stats64
*
* Updates the device statistics structure. This function updates the device
* statistics structure in the net_device structure and returns a pointer
* to the same.
*/
static struct net_device_stats *
vxge_get_stats(struct net_device *dev)
static struct rtnl_link_stats64 *
vxge_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *net_stats)
{
struct vxgedev *vdev;
struct net_device_stats *net_stats;
struct vxgedev *vdev = netdev_priv(dev);
int k;

vdev = netdev_priv(dev);

net_stats = &vdev->stats.net_stats;

memset(net_stats, 0, sizeof(struct net_device_stats));

/* net_stats already zeroed by caller */
for (k = 0; k < vdev->no_of_vpath; k++) {
net_stats->rx_packets += vdev->vpaths[k].ring.stats.rx_frms;
net_stats->rx_bytes += vdev->vpaths[k].ring.stats.rx_bytes;
Expand Down Expand Up @@ -3102,7 +3094,7 @@ vxge_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
static const struct net_device_ops vxge_netdev_ops = {
.ndo_open = vxge_open,
.ndo_stop = vxge_close,
.ndo_get_stats = vxge_get_stats,
.ndo_get_stats64 = vxge_get_stats64,
.ndo_start_xmit = vxge_xmit,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_multicast_list = vxge_set_multicast,
Expand Down
1 change: 0 additions & 1 deletion drivers/net/vxge/vxge-main.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ struct vxge_msix_entry {

struct vxge_sw_stats {
/* Network Stats (interface stats) */
struct net_device_stats net_stats;

/* Tx */
u64 tx_frms;
Expand Down

0 comments on commit dd57f97

Please sign in to comment.