Commit 255bf5e9 authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch...

Merge branch 'net-switch-further-drivers-to-core-functionality-for-handling-per-cpu-byte-packet-counters'

Heiner Kallweit says:

====================
net: switch further drivers to core functionality for handling per-cpu byte/packet counters

Switch further drivers to core functionality for handling per-cpu
byte/packet counters. All changes are compile-tested only.
====================

Link: https://lore.kernel.org/r/5fbe3a1f-6625-eadc-b1c9-f76f78debb94@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c9f64d1f 323955a0
...@@ -1686,7 +1686,6 @@ static void hfi1_ipoib_ib_rcv(struct hfi1_packet *packet) ...@@ -1686,7 +1686,6 @@ static void hfi1_ipoib_ib_rcv(struct hfi1_packet *packet)
u32 extra_bytes; u32 extra_bytes;
u32 tlen, qpnum; u32 tlen, qpnum;
bool do_work, do_cnp; bool do_work, do_cnp;
struct hfi1_ipoib_dev_priv *priv;
trace_hfi1_rcvhdr(packet); trace_hfi1_rcvhdr(packet);
...@@ -1734,8 +1733,7 @@ static void hfi1_ipoib_ib_rcv(struct hfi1_packet *packet) ...@@ -1734,8 +1733,7 @@ static void hfi1_ipoib_ib_rcv(struct hfi1_packet *packet)
if (unlikely(!skb)) if (unlikely(!skb))
goto drop; goto drop;
priv = hfi1_ipoib_priv(netdev); dev_sw_netstats_rx_add(netdev, skb->len);
hfi1_ipoib_update_rx_netstats(priv, 1, skb->len);
skb->dev = netdev; skb->dev = netdev;
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
......
...@@ -110,7 +110,6 @@ struct hfi1_ipoib_dev_priv { ...@@ -110,7 +110,6 @@ struct hfi1_ipoib_dev_priv {
const struct net_device_ops *netdev_ops; const struct net_device_ops *netdev_ops;
struct rvt_qp *qp; struct rvt_qp *qp;
struct pcpu_sw_netstats __percpu *netstats;
}; };
/* hfi1 ipoib rdma netdev's private data structure */ /* hfi1 ipoib rdma netdev's private data structure */
...@@ -126,32 +125,6 @@ hfi1_ipoib_priv(const struct net_device *dev) ...@@ -126,32 +125,6 @@ hfi1_ipoib_priv(const struct net_device *dev)
return &((struct hfi1_ipoib_rdma_netdev *)netdev_priv(dev))->dev_priv; return &((struct hfi1_ipoib_rdma_netdev *)netdev_priv(dev))->dev_priv;
} }
static inline void
hfi1_ipoib_update_rx_netstats(struct hfi1_ipoib_dev_priv *priv,
u64 packets,
u64 bytes)
{
struct pcpu_sw_netstats *netstats = this_cpu_ptr(priv->netstats);
u64_stats_update_begin(&netstats->syncp);
netstats->rx_packets += packets;
netstats->rx_bytes += bytes;
u64_stats_update_end(&netstats->syncp);
}
static inline void
hfi1_ipoib_update_tx_netstats(struct hfi1_ipoib_dev_priv *priv,
u64 packets,
u64 bytes)
{
struct pcpu_sw_netstats *netstats = this_cpu_ptr(priv->netstats);
u64_stats_update_begin(&netstats->syncp);
netstats->tx_packets += packets;
netstats->tx_bytes += bytes;
u64_stats_update_end(&netstats->syncp);
}
int hfi1_ipoib_send_dma(struct net_device *dev, int hfi1_ipoib_send_dma(struct net_device *dev,
struct sk_buff *skb, struct sk_buff *skb,
struct ib_ah *address, struct ib_ah *address,
......
...@@ -21,7 +21,7 @@ static int hfi1_ipoib_dev_init(struct net_device *dev) ...@@ -21,7 +21,7 @@ static int hfi1_ipoib_dev_init(struct net_device *dev)
struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev); struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev);
int ret; int ret;
priv->netstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
ret = priv->netdev_ops->ndo_init(dev); ret = priv->netdev_ops->ndo_init(dev);
if (ret) if (ret)
...@@ -93,21 +93,12 @@ static int hfi1_ipoib_dev_stop(struct net_device *dev) ...@@ -93,21 +93,12 @@ static int hfi1_ipoib_dev_stop(struct net_device *dev)
return priv->netdev_ops->ndo_stop(dev); return priv->netdev_ops->ndo_stop(dev);
} }
static void hfi1_ipoib_dev_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *storage)
{
struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev);
netdev_stats_to_stats64(storage, &dev->stats);
dev_fetch_sw_netstats(storage, priv->netstats);
}
static const struct net_device_ops hfi1_ipoib_netdev_ops = { static const struct net_device_ops hfi1_ipoib_netdev_ops = {
.ndo_init = hfi1_ipoib_dev_init, .ndo_init = hfi1_ipoib_dev_init,
.ndo_uninit = hfi1_ipoib_dev_uninit, .ndo_uninit = hfi1_ipoib_dev_uninit,
.ndo_open = hfi1_ipoib_dev_open, .ndo_open = hfi1_ipoib_dev_open,
.ndo_stop = hfi1_ipoib_dev_stop, .ndo_stop = hfi1_ipoib_dev_stop,
.ndo_get_stats64 = hfi1_ipoib_dev_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
}; };
static int hfi1_ipoib_send(struct net_device *dev, static int hfi1_ipoib_send(struct net_device *dev,
...@@ -182,7 +173,7 @@ static void hfi1_ipoib_netdev_dtor(struct net_device *dev) ...@@ -182,7 +173,7 @@ static void hfi1_ipoib_netdev_dtor(struct net_device *dev)
hfi1_ipoib_txreq_deinit(priv); hfi1_ipoib_txreq_deinit(priv);
hfi1_ipoib_rxq_deinit(priv->netdev); hfi1_ipoib_rxq_deinit(priv->netdev);
free_percpu(priv->netstats); free_percpu(dev->tstats);
} }
static void hfi1_ipoib_free_rdma_netdev(struct net_device *dev) static void hfi1_ipoib_free_rdma_netdev(struct net_device *dev)
......
...@@ -121,7 +121,7 @@ static void hfi1_ipoib_free_tx(struct ipoib_txreq *tx, int budget) ...@@ -121,7 +121,7 @@ static void hfi1_ipoib_free_tx(struct ipoib_txreq *tx, int budget)
struct hfi1_ipoib_dev_priv *priv = tx->priv; struct hfi1_ipoib_dev_priv *priv = tx->priv;
if (likely(!tx->sdma_status)) { if (likely(!tx->sdma_status)) {
hfi1_ipoib_update_tx_netstats(priv, 1, tx->skb->len); dev_sw_netstats_tx_add(priv->netdev, 1, tx->skb->len);
} else { } else {
++priv->netdev->stats.tx_errors; ++priv->netdev->stats.tx_errors;
dd_dev_warn(priv->dd, dd_dev_warn(priv->dd,
......
...@@ -641,7 +641,7 @@ static const struct net_device_ops aqc111_netdev_ops = { ...@@ -641,7 +641,7 @@ static const struct net_device_ops aqc111_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = aqc111_change_mtu, .ndo_change_mtu = aqc111_change_mtu,
.ndo_set_mac_address = aqc111_set_mac_addr, .ndo_set_mac_address = aqc111_set_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
......
...@@ -194,7 +194,7 @@ static const struct net_device_ops ax88172_netdev_ops = { ...@@ -194,7 +194,7 @@ static const struct net_device_ops ax88172_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = asix_ioctl, .ndo_do_ioctl = asix_ioctl,
...@@ -580,7 +580,7 @@ static const struct net_device_ops ax88772_netdev_ops = { ...@@ -580,7 +580,7 @@ static const struct net_device_ops ax88772_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = asix_set_mac_address, .ndo_set_mac_address = asix_set_mac_address,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = asix_ioctl, .ndo_do_ioctl = asix_ioctl,
...@@ -1050,7 +1050,7 @@ static const struct net_device_ops ax88178_netdev_ops = { ...@@ -1050,7 +1050,7 @@ static const struct net_device_ops ax88178_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = asix_set_mac_address, .ndo_set_mac_address = asix_set_mac_address,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = asix_set_multicast, .ndo_set_rx_mode = asix_set_multicast,
......
...@@ -120,7 +120,7 @@ static const struct net_device_ops ax88172a_netdev_ops = { ...@@ -120,7 +120,7 @@ static const struct net_device_ops ax88172a_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = asix_set_mac_address, .ndo_set_mac_address = asix_set_mac_address,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = phy_do_ioctl_running, .ndo_do_ioctl = phy_do_ioctl_running,
......
...@@ -1031,7 +1031,7 @@ static const struct net_device_ops ax88179_netdev_ops = { ...@@ -1031,7 +1031,7 @@ static const struct net_device_ops ax88179_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = ax88179_change_mtu, .ndo_change_mtu = ax88179_change_mtu,
.ndo_set_mac_address = ax88179_set_mac_addr, .ndo_set_mac_address = ax88179_set_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
......
...@@ -98,7 +98,7 @@ static const struct net_device_ops cdc_mbim_netdev_ops = { ...@@ -98,7 +98,7 @@ static const struct net_device_ops cdc_mbim_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = cdc_ncm_change_mtu, .ndo_change_mtu = cdc_ncm_change_mtu,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
......
...@@ -793,7 +793,7 @@ static const struct net_device_ops cdc_ncm_netdev_ops = { ...@@ -793,7 +793,7 @@ static const struct net_device_ops cdc_ncm_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_set_rx_mode = usbnet_set_rx_mode, .ndo_set_rx_mode = usbnet_set_rx_mode,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = cdc_ncm_change_mtu, .ndo_change_mtu = cdc_ncm_change_mtu,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
......
...@@ -343,7 +343,7 @@ static const struct net_device_ops dm9601_netdev_ops = { ...@@ -343,7 +343,7 @@ static const struct net_device_ops dm9601_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = dm9601_ioctl, .ndo_do_ioctl = dm9601_ioctl,
.ndo_set_rx_mode = dm9601_set_multicast, .ndo_set_rx_mode = dm9601_set_multicast,
......
...@@ -133,7 +133,7 @@ static const struct net_device_ops int51x1_netdev_ops = { ...@@ -133,7 +133,7 @@ static const struct net_device_ops int51x1_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = int51x1_set_multicast, .ndo_set_rx_mode = int51x1_set_multicast,
......
...@@ -462,7 +462,7 @@ static const struct net_device_ops mcs7830_netdev_ops = { ...@@ -462,7 +462,7 @@ static const struct net_device_ops mcs7830_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = mcs7830_ioctl, .ndo_do_ioctl = mcs7830_ioctl,
.ndo_set_rx_mode = mcs7830_set_multicast, .ndo_set_rx_mode = mcs7830_set_multicast,
......
...@@ -72,7 +72,6 @@ struct qmimux_hdr { ...@@ -72,7 +72,6 @@ struct qmimux_hdr {
struct qmimux_priv { struct qmimux_priv {
struct net_device *real_dev; struct net_device *real_dev;
u8 mux_id; u8 mux_id;
struct pcpu_sw_netstats __percpu *stats64;
}; };
static int qmimux_open(struct net_device *dev) static int qmimux_open(struct net_device *dev)
...@@ -108,34 +107,19 @@ static netdev_tx_t qmimux_start_xmit(struct sk_buff *skb, struct net_device *dev ...@@ -108,34 +107,19 @@ static netdev_tx_t qmimux_start_xmit(struct sk_buff *skb, struct net_device *dev
skb->dev = priv->real_dev; skb->dev = priv->real_dev;
ret = dev_queue_xmit(skb); ret = dev_queue_xmit(skb);
if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) { if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN))
struct pcpu_sw_netstats *stats64 = this_cpu_ptr(priv->stats64); dev_sw_netstats_tx_add(dev, 1, len);
else
u64_stats_update_begin(&stats64->syncp);
stats64->tx_packets++;
stats64->tx_bytes += len;
u64_stats_update_end(&stats64->syncp);
} else {
dev->stats.tx_dropped++; dev->stats.tx_dropped++;
}
return ret; return ret;
} }
static void qmimux_get_stats64(struct net_device *net,
struct rtnl_link_stats64 *stats)
{
struct qmimux_priv *priv = netdev_priv(net);
netdev_stats_to_stats64(stats, &net->stats);
dev_fetch_sw_netstats(stats, priv->stats64);
}
static const struct net_device_ops qmimux_netdev_ops = { static const struct net_device_ops qmimux_netdev_ops = {
.ndo_open = qmimux_open, .ndo_open = qmimux_open,
.ndo_stop = qmimux_stop, .ndo_stop = qmimux_stop,
.ndo_start_xmit = qmimux_start_xmit, .ndo_start_xmit = qmimux_start_xmit,
.ndo_get_stats64 = qmimux_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
}; };
static void qmimux_setup(struct net_device *dev) static void qmimux_setup(struct net_device *dev)
...@@ -224,14 +208,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb) ...@@ -224,14 +208,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
net->stats.rx_errors++; net->stats.rx_errors++;
return 0; return 0;
} else { } else {
struct pcpu_sw_netstats *stats64; dev_sw_netstats_rx_add(net, pkt_len);
struct qmimux_priv *priv = netdev_priv(net);
stats64 = this_cpu_ptr(priv->stats64);
u64_stats_update_begin(&stats64->syncp);
stats64->rx_packets++;
stats64->rx_bytes += pkt_len;
u64_stats_update_end(&stats64->syncp);
} }
skip: skip:
...@@ -256,8 +233,8 @@ static int qmimux_register_device(struct net_device *real_dev, u8 mux_id) ...@@ -256,8 +233,8 @@ static int qmimux_register_device(struct net_device *real_dev, u8 mux_id)
priv->mux_id = mux_id; priv->mux_id = mux_id;
priv->real_dev = real_dev; priv->real_dev = real_dev;
priv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); new_dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
if (!priv->stats64) { if (!new_dev->tstats) {
err = -ENOBUFS; err = -ENOBUFS;
goto out_free_newdev; goto out_free_newdev;
} }
...@@ -292,7 +269,7 @@ static void qmimux_unregister_device(struct net_device *dev, ...@@ -292,7 +269,7 @@ static void qmimux_unregister_device(struct net_device *dev,
struct qmimux_priv *priv = netdev_priv(dev); struct qmimux_priv *priv = netdev_priv(dev);
struct net_device *real_dev = priv->real_dev; struct net_device *real_dev = priv->real_dev;
free_percpu(priv->stats64); free_percpu(dev->tstats);
netdev_upper_dev_unlink(real_dev, dev); netdev_upper_dev_unlink(real_dev, dev);
unregister_netdevice_queue(dev, head); unregister_netdevice_queue(dev, head);
...@@ -598,7 +575,7 @@ static const struct net_device_ops qmi_wwan_netdev_ops = { ...@@ -598,7 +575,7 @@ static const struct net_device_ops qmi_wwan_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = qmi_wwan_mac_addr, .ndo_set_mac_address = qmi_wwan_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
......
...@@ -279,7 +279,7 @@ static const struct net_device_ops rndis_netdev_ops = { ...@@ -279,7 +279,7 @@ static const struct net_device_ops rndis_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
......
...@@ -184,7 +184,7 @@ static const struct net_device_ops sierra_net_device_ops = { ...@@ -184,7 +184,7 @@ static const struct net_device_ops sierra_net_device_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
......
...@@ -1435,7 +1435,7 @@ static const struct net_device_ops smsc75xx_netdev_ops = { ...@@ -1435,7 +1435,7 @@ static const struct net_device_ops smsc75xx_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_change_mtu = smsc75xx_change_mtu, .ndo_change_mtu = smsc75xx_change_mtu,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
......
...@@ -1041,7 +1041,7 @@ static const struct net_device_ops smsc95xx_netdev_ops = { ...@@ -1041,7 +1041,7 @@ static const struct net_device_ops smsc95xx_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = smsc95xx_ioctl, .ndo_do_ioctl = smsc95xx_ioctl,
......
...@@ -308,7 +308,7 @@ static const struct net_device_ops sr9700_netdev_ops = { ...@@ -308,7 +308,7 @@ static const struct net_device_ops sr9700_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = sr9700_ioctl, .ndo_do_ioctl = sr9700_ioctl,
.ndo_set_rx_mode = sr9700_set_multicast, .ndo_set_rx_mode = sr9700_set_multicast,
......
...@@ -681,7 +681,7 @@ static const struct net_device_ops sr9800_netdev_ops = { ...@@ -681,7 +681,7 @@ static const struct net_device_ops sr9800_netdev_ops = {
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = sr_set_mac_address, .ndo_set_mac_address = sr_set_mac_address,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = sr_ioctl, .ndo_do_ioctl = sr_ioctl,
......
...@@ -304,7 +304,7 @@ static void __usbnet_status_stop_force(struct usbnet *dev) ...@@ -304,7 +304,7 @@ static void __usbnet_status_stop_force(struct usbnet *dev)
*/ */
void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb) void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb)
{ {
struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64); struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->net->tstats);
unsigned long flags; unsigned long flags;
int status; int status;
...@@ -980,15 +980,6 @@ int usbnet_set_link_ksettings(struct net_device *net, ...@@ -980,15 +980,6 @@ int usbnet_set_link_ksettings(struct net_device *net,
} }
EXPORT_SYMBOL_GPL(usbnet_set_link_ksettings); EXPORT_SYMBOL_GPL(usbnet_set_link_ksettings);
void usbnet_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats)
{
struct usbnet *dev = netdev_priv(net);
netdev_stats_to_stats64(stats, &net->stats);
dev_fetch_sw_netstats(stats, dev->stats64);
}
EXPORT_SYMBOL_GPL(usbnet_get_stats64);
u32 usbnet_get_link (struct net_device *net) u32 usbnet_get_link (struct net_device *net)
{ {
struct usbnet *dev = netdev_priv(net); struct usbnet *dev = netdev_priv(net);
...@@ -1220,7 +1211,7 @@ static void tx_complete (struct urb *urb) ...@@ -1220,7 +1211,7 @@ static void tx_complete (struct urb *urb)
struct usbnet *dev = entry->dev; struct usbnet *dev = entry->dev;
if (urb->status == 0) { if (urb->status == 0) {
struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64); struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->net->tstats);
unsigned long flags; unsigned long flags;
flags = u64_stats_update_begin_irqsave(&stats64->syncp); flags = u64_stats_update_begin_irqsave(&stats64->syncp);
...@@ -1596,7 +1587,7 @@ void usbnet_disconnect (struct usb_interface *intf) ...@@ -1596,7 +1587,7 @@ void usbnet_disconnect (struct usb_interface *intf)
usb_free_urb(dev->interrupt); usb_free_urb(dev->interrupt);
kfree(dev->padding_pkt); kfree(dev->padding_pkt);
free_percpu(dev->stats64); free_percpu(net->tstats);
free_netdev(net); free_netdev(net);
} }
EXPORT_SYMBOL_GPL(usbnet_disconnect); EXPORT_SYMBOL_GPL(usbnet_disconnect);
...@@ -1608,7 +1599,7 @@ static const struct net_device_ops usbnet_netdev_ops = { ...@@ -1608,7 +1599,7 @@ static const struct net_device_ops usbnet_netdev_ops = {
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_set_rx_mode = usbnet_set_rx_mode, .ndo_set_rx_mode = usbnet_set_rx_mode,
.ndo_change_mtu = usbnet_change_mtu, .ndo_change_mtu = usbnet_change_mtu,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
}; };
...@@ -1671,8 +1662,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) ...@@ -1671,8 +1662,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
dev->driver_info = info; dev->driver_info = info;
dev->driver_name = name; dev->driver_name = name;
dev->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); net->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
if (!dev->stats64) if (!net->tstats)
goto out0; goto out0;
dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV
...@@ -1812,7 +1803,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) ...@@ -1812,7 +1803,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
*/ */
cancel_work_sync(&dev->kevent); cancel_work_sync(&dev->kevent);
del_timer_sync(&dev->delay); del_timer_sync(&dev->delay);
free_percpu(dev->stats64); free_percpu(net->tstats);
out0: out0:
free_netdev(net); free_netdev(net);
out: out:
......
...@@ -126,28 +126,13 @@ qtnf_netdev_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev) ...@@ -126,28 +126,13 @@ qtnf_netdev_hard_start_xmit(struct sk_buff *skb, struct net_device *ndev)
if (unlikely(skb->protocol == htons(ETH_P_PAE))) { if (unlikely(skb->protocol == htons(ETH_P_PAE))) {
qtnf_packet_send_hi_pri(skb); qtnf_packet_send_hi_pri(skb);
qtnf_update_tx_stats(ndev, skb); dev_sw_netstats_tx_add(ndev, 1, skb->len);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
return qtnf_bus_data_tx(mac->bus, skb, mac->macid, vif->vifid); return qtnf_bus_data_tx(mac->bus, skb, mac->macid, vif->vifid);
} }
/* Netdev handler for getting stats.
*/
static void qtnf_netdev_get_stats64(struct net_device *ndev,
struct rtnl_link_stats64 *stats)
{
struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
netdev_stats_to_stats64(stats, &ndev->stats);
if (!vif->stats64)
return;
dev_fetch_sw_netstats(stats, vif->stats64);
}
/* Netdev handler for transmission timeout. /* Netdev handler for transmission timeout.
*/ */
static void qtnf_netdev_tx_timeout(struct net_device *ndev, unsigned int txqueue) static void qtnf_netdev_tx_timeout(struct net_device *ndev, unsigned int txqueue)
...@@ -211,13 +196,27 @@ static int qtnf_netdev_port_parent_id(struct net_device *ndev, ...@@ -211,13 +196,27 @@ static int qtnf_netdev_port_parent_id(struct net_device *ndev,
return 0; return 0;
} }
static int qtnf_netdev_alloc_pcpu_stats(struct net_device *dev)
{
dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
return dev->tstats ? 0 : -ENOMEM;
}
static void qtnf_netdev_free_pcpu_stats(struct net_device *dev)
{
free_percpu(dev->tstats);
}
/* Network device ops handlers */ /* Network device ops handlers */
const struct net_device_ops qtnf_netdev_ops = { const struct net_device_ops qtnf_netdev_ops = {
.ndo_init = qtnf_netdev_alloc_pcpu_stats,
.ndo_uninit = qtnf_netdev_free_pcpu_stats,
.ndo_open = qtnf_netdev_open, .ndo_open = qtnf_netdev_open,
.ndo_stop = qtnf_netdev_close, .ndo_stop = qtnf_netdev_close,
.ndo_start_xmit = qtnf_netdev_hard_start_xmit, .ndo_start_xmit = qtnf_netdev_hard_start_xmit,
.ndo_tx_timeout = qtnf_netdev_tx_timeout, .ndo_tx_timeout = qtnf_netdev_tx_timeout,
.ndo_get_stats64 = qtnf_netdev_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = qtnf_netdev_set_mac_address, .ndo_set_mac_address = qtnf_netdev_set_mac_address,
.ndo_get_port_parent_id = qtnf_netdev_port_parent_id, .ndo_get_port_parent_id = qtnf_netdev_port_parent_id,
}; };
...@@ -448,10 +447,6 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus, ...@@ -448,10 +447,6 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus,
qtnf_sta_list_init(&vif->sta_list); qtnf_sta_list_init(&vif->sta_list);
INIT_WORK(&vif->high_pri_tx_work, qtnf_vif_send_data_high_pri); INIT_WORK(&vif->high_pri_tx_work, qtnf_vif_send_data_high_pri);
skb_queue_head_init(&vif->high_pri_tx_queue); skb_queue_head_init(&vif->high_pri_tx_queue);
vif->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
if (!vif->stats64)
pr_warn("VIF%u.%u: per cpu stats allocation failed\n",
macid, i);
} }
qtnf_mac_init_primary_intf(mac); qtnf_mac_init_primary_intf(mac);
...@@ -531,7 +526,6 @@ static void qtnf_core_mac_detach(struct qtnf_bus *bus, unsigned int macid) ...@@ -531,7 +526,6 @@ static void qtnf_core_mac_detach(struct qtnf_bus *bus, unsigned int macid)
} }
rtnl_unlock(); rtnl_unlock();
qtnf_sta_list_free(&vif->sta_list); qtnf_sta_list_free(&vif->sta_list);
free_percpu(vif->stats64);
} }
if (mac->wiphy_registered) if (mac->wiphy_registered)
...@@ -924,46 +918,6 @@ void qtnf_wake_all_queues(struct net_device *ndev) ...@@ -924,46 +918,6 @@ void qtnf_wake_all_queues(struct net_device *ndev)
} }
EXPORT_SYMBOL_GPL(qtnf_wake_all_queues); EXPORT_SYMBOL_GPL(qtnf_wake_all_queues);
void qtnf_update_rx_stats(struct net_device *ndev, const struct sk_buff *skb)
{
struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
struct pcpu_sw_netstats *stats64;
if (unlikely(!vif || !vif->stats64)) {
ndev->stats.rx_packets++;
ndev->stats.rx_bytes += skb->len;
return;
}
stats64 = this_cpu_ptr(vif->stats64);
u64_stats_update_begin(&stats64->syncp);
stats64->rx_packets++;
stats64->rx_bytes += skb->len;
u64_stats_update_end(&stats64->syncp);
}
EXPORT_SYMBOL_GPL(qtnf_update_rx_stats);
void qtnf_update_tx_stats(struct net_device *ndev, const struct sk_buff *skb)
{
struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
struct pcpu_sw_netstats *stats64;
if (unlikely(!vif || !vif->stats64)) {
ndev->stats.tx_packets++;
ndev->stats.tx_bytes += skb->len;
return;
}
stats64 = this_cpu_ptr(vif->stats64);
u64_stats_update_begin(&stats64->syncp);
stats64->tx_packets++;
stats64->tx_bytes += skb->len;
u64_stats_update_end(&stats64->syncp);
}
EXPORT_SYMBOL_GPL(qtnf_update_tx_stats);
struct dentry *qtnf_get_debugfs_dir(void) struct dentry *qtnf_get_debugfs_dir(void)
{ {
return qtnf_debugfs_dir; return qtnf_debugfs_dir;
......
...@@ -70,8 +70,6 @@ struct qtnf_vif { ...@@ -70,8 +70,6 @@ struct qtnf_vif {
struct qtnf_sta_list sta_list; struct qtnf_sta_list sta_list;
unsigned long cons_tx_timeout_cnt; unsigned long cons_tx_timeout_cnt;
int generation; int generation;
struct pcpu_sw_netstats __percpu *stats64;
}; };
struct qtnf_mac_info { struct qtnf_mac_info {
...@@ -139,8 +137,6 @@ int qtnf_cmd_send_update_phy_params(struct qtnf_wmac *mac, u32 changed); ...@@ -139,8 +137,6 @@ int qtnf_cmd_send_update_phy_params(struct qtnf_wmac *mac, u32 changed);
struct qtnf_wmac *qtnf_core_get_mac(const struct qtnf_bus *bus, u8 macid); struct qtnf_wmac *qtnf_core_get_mac(const struct qtnf_bus *bus, u8 macid);
struct net_device *qtnf_classify_skb(struct qtnf_bus *bus, struct sk_buff *skb); struct net_device *qtnf_classify_skb(struct qtnf_bus *bus, struct sk_buff *skb);
void qtnf_wake_all_queues(struct net_device *ndev); void qtnf_wake_all_queues(struct net_device *ndev);
void qtnf_update_rx_stats(struct net_device *ndev, const struct sk_buff *skb);
void qtnf_update_tx_stats(struct net_device *ndev, const struct sk_buff *skb);
void qtnf_virtual_intf_cleanup(struct net_device *ndev); void qtnf_virtual_intf_cleanup(struct net_device *ndev);
......
...@@ -489,7 +489,7 @@ static void qtnf_pearl_data_tx_reclaim(struct qtnf_pcie_pearl_state *ps) ...@@ -489,7 +489,7 @@ static void qtnf_pearl_data_tx_reclaim(struct qtnf_pcie_pearl_state *ps)
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
if (skb->dev) { if (skb->dev) {
qtnf_update_tx_stats(skb->dev, skb); dev_sw_netstats_tx_add(skb->dev, 1, skb->len);
if (unlikely(priv->tx_stopped)) { if (unlikely(priv->tx_stopped)) {
qtnf_wake_all_queues(skb->dev); qtnf_wake_all_queues(skb->dev);
priv->tx_stopped = 0; priv->tx_stopped = 0;
...@@ -756,7 +756,7 @@ static int qtnf_pcie_pearl_rx_poll(struct napi_struct *napi, int budget) ...@@ -756,7 +756,7 @@ static int qtnf_pcie_pearl_rx_poll(struct napi_struct *napi, int budget)
skb_put(skb, psize); skb_put(skb, psize);
ndev = qtnf_classify_skb(bus, skb); ndev = qtnf_classify_skb(bus, skb);
if (likely(ndev)) { if (likely(ndev)) {
qtnf_update_rx_stats(ndev, skb); dev_sw_netstats_rx_add(ndev, skb->len);
skb->protocol = eth_type_trans(skb, ndev); skb->protocol = eth_type_trans(skb, ndev);
napi_gro_receive(napi, skb); napi_gro_receive(napi, skb);
} else { } else {
......
...@@ -418,7 +418,7 @@ static void qtnf_topaz_data_tx_reclaim(struct qtnf_pcie_topaz_state *ts) ...@@ -418,7 +418,7 @@ static void qtnf_topaz_data_tx_reclaim(struct qtnf_pcie_topaz_state *ts)
PCI_DMA_TODEVICE); PCI_DMA_TODEVICE);
if (skb->dev) { if (skb->dev) {
qtnf_update_tx_stats(skb->dev, skb); dev_sw_netstats_tx_add(skb->dev, 1, skb->len);
if (unlikely(priv->tx_stopped)) { if (unlikely(priv->tx_stopped)) {
qtnf_wake_all_queues(skb->dev); qtnf_wake_all_queues(skb->dev);
priv->tx_stopped = 0; priv->tx_stopped = 0;
...@@ -662,7 +662,7 @@ static int qtnf_topaz_rx_poll(struct napi_struct *napi, int budget) ...@@ -662,7 +662,7 @@ static int qtnf_topaz_rx_poll(struct napi_struct *napi, int budget)
skb_put(skb, psize); skb_put(skb, psize);
ndev = qtnf_classify_skb(bus, skb); ndev = qtnf_classify_skb(bus, skb);
if (likely(ndev)) { if (likely(ndev)) {
qtnf_update_rx_stats(ndev, skb); dev_sw_netstats_rx_add(ndev, skb->len);
skb->protocol = eth_type_trans(skb, ndev); skb->protocol = eth_type_trans(skb, ndev);
netif_receive_skb(skb); netif_receive_skb(skb);
} else { } else {
......
...@@ -3379,7 +3379,7 @@ static const struct net_device_ops rndis_wlan_netdev_ops = { ...@@ -3379,7 +3379,7 @@ static const struct net_device_ops rndis_wlan_netdev_ops = {
.ndo_stop = usbnet_stop, .ndo_stop = usbnet_stop,
.ndo_start_xmit = usbnet_start_xmit, .ndo_start_xmit = usbnet_start_xmit,
.ndo_tx_timeout = usbnet_tx_timeout, .ndo_tx_timeout = usbnet_tx_timeout,
.ndo_get_stats64 = usbnet_get_stats64, .ndo_get_stats64 = dev_get_tstats64,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_rx_mode = rndis_wlan_set_multicast_list, .ndo_set_rx_mode = rndis_wlan_set_multicast_list,
......
...@@ -65,8 +65,6 @@ struct usbnet { ...@@ -65,8 +65,6 @@ struct usbnet {
struct usb_anchor deferred; struct usb_anchor deferred;
struct tasklet_struct bh; struct tasklet_struct bh;
struct pcpu_sw_netstats __percpu *stats64;
struct work_struct kevent; struct work_struct kevent;
unsigned long flags; unsigned long flags;
# define EVENT_TX_HALT 0 # define EVENT_TX_HALT 0
...@@ -285,7 +283,5 @@ extern int usbnet_status_start(struct usbnet *dev, gfp_t mem_flags); ...@@ -285,7 +283,5 @@ extern int usbnet_status_start(struct usbnet *dev, gfp_t mem_flags);
extern void usbnet_status_stop(struct usbnet *dev); extern void usbnet_status_stop(struct usbnet *dev);
extern void usbnet_update_max_qlen(struct usbnet *dev); extern void usbnet_update_max_qlen(struct usbnet *dev);
extern void usbnet_get_stats64(struct net_device *dev,
struct rtnl_link_stats64 *stats);
#endif /* __LINUX_USB_USBNET_H */ #endif /* __LINUX_USB_USBNET_H */
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