mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 23:39:18 +00:00
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.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
255bf5e9d7
@ -1686,7 +1686,6 @@ static void hfi1_ipoib_ib_rcv(struct hfi1_packet *packet)
|
||||
u32 extra_bytes;
|
||||
u32 tlen, qpnum;
|
||||
bool do_work, do_cnp;
|
||||
struct hfi1_ipoib_dev_priv *priv;
|
||||
|
||||
trace_hfi1_rcvhdr(packet);
|
||||
|
||||
@ -1734,8 +1733,7 @@ static void hfi1_ipoib_ib_rcv(struct hfi1_packet *packet)
|
||||
if (unlikely(!skb))
|
||||
goto drop;
|
||||
|
||||
priv = hfi1_ipoib_priv(netdev);
|
||||
hfi1_ipoib_update_rx_netstats(priv, 1, skb->len);
|
||||
dev_sw_netstats_rx_add(netdev, skb->len);
|
||||
|
||||
skb->dev = netdev;
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
@ -110,7 +110,6 @@ struct hfi1_ipoib_dev_priv {
|
||||
|
||||
const struct net_device_ops *netdev_ops;
|
||||
struct rvt_qp *qp;
|
||||
struct pcpu_sw_netstats __percpu *netstats;
|
||||
};
|
||||
|
||||
/* hfi1 ipoib rdma netdev's private data structure */
|
||||
@ -126,32 +125,6 @@ hfi1_ipoib_priv(const struct net_device *dev)
|
||||
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,
|
||||
struct sk_buff *skb,
|
||||
struct ib_ah *address,
|
||||
|
@ -21,7 +21,7 @@ static int hfi1_ipoib_dev_init(struct net_device *dev)
|
||||
struct hfi1_ipoib_dev_priv *priv = hfi1_ipoib_priv(dev);
|
||||
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);
|
||||
if (ret)
|
||||
@ -93,21 +93,12 @@ static int hfi1_ipoib_dev_stop(struct net_device *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 = {
|
||||
.ndo_init = hfi1_ipoib_dev_init,
|
||||
.ndo_uninit = hfi1_ipoib_dev_uninit,
|
||||
.ndo_open = hfi1_ipoib_dev_open,
|
||||
.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,
|
||||
@ -182,7 +173,7 @@ static void hfi1_ipoib_netdev_dtor(struct net_device *dev)
|
||||
hfi1_ipoib_txreq_deinit(priv);
|
||||
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)
|
||||
|
@ -121,7 +121,7 @@ static void hfi1_ipoib_free_tx(struct ipoib_txreq *tx, int budget)
|
||||
struct hfi1_ipoib_dev_priv *priv = tx->priv;
|
||||
|
||||
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 {
|
||||
++priv->netdev->stats.tx_errors;
|
||||
dd_dev_warn(priv->dd,
|
||||
|
@ -641,7 +641,7 @@ static const struct net_device_ops aqc111_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_set_mac_address = aqc111_set_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
@ -194,7 +194,7 @@ static const struct net_device_ops ax88172_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_do_ioctl = asix_ioctl,
|
||||
@ -580,7 +580,7 @@ static const struct net_device_ops ax88772_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_do_ioctl = asix_ioctl,
|
||||
@ -1050,7 +1050,7 @@ static const struct net_device_ops ax88178_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_set_rx_mode = asix_set_multicast,
|
||||
|
@ -120,7 +120,7 @@ static const struct net_device_ops ax88172a_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_do_ioctl = phy_do_ioctl_running,
|
||||
|
@ -1031,7 +1031,7 @@ static const struct net_device_ops ax88179_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_set_mac_address = ax88179_set_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
@ -98,7 +98,7 @@ static const struct net_device_ops cdc_mbim_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
@ -793,7 +793,7 @@ static const struct net_device_ops cdc_ncm_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
@ -343,7 +343,7 @@ static const struct net_device_ops dm9601_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_do_ioctl = dm9601_ioctl,
|
||||
.ndo_set_rx_mode = dm9601_set_multicast,
|
||||
|
@ -133,7 +133,7 @@ static const struct net_device_ops int51x1_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_set_rx_mode = int51x1_set_multicast,
|
||||
|
@ -462,7 +462,7 @@ static const struct net_device_ops mcs7830_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_do_ioctl = mcs7830_ioctl,
|
||||
.ndo_set_rx_mode = mcs7830_set_multicast,
|
||||
|
@ -72,7 +72,6 @@ struct qmimux_hdr {
|
||||
struct qmimux_priv {
|
||||
struct net_device *real_dev;
|
||||
u8 mux_id;
|
||||
struct pcpu_sw_netstats __percpu *stats64;
|
||||
};
|
||||
|
||||
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
|
||||
skb->dev = priv->real_dev;
|
||||
ret = dev_queue_xmit(skb);
|
||||
|
||||
if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {
|
||||
struct pcpu_sw_netstats *stats64 = this_cpu_ptr(priv->stats64);
|
||||
|
||||
u64_stats_update_begin(&stats64->syncp);
|
||||
stats64->tx_packets++;
|
||||
stats64->tx_bytes += len;
|
||||
u64_stats_update_end(&stats64->syncp);
|
||||
} else {
|
||||
if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN))
|
||||
dev_sw_netstats_tx_add(dev, 1, len);
|
||||
else
|
||||
dev->stats.tx_dropped++;
|
||||
}
|
||||
|
||||
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 = {
|
||||
.ndo_open = qmimux_open,
|
||||
.ndo_stop = qmimux_stop,
|
||||
.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)
|
||||
@ -224,14 +208,7 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
net->stats.rx_errors++;
|
||||
return 0;
|
||||
} else {
|
||||
struct pcpu_sw_netstats *stats64;
|
||||
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);
|
||||
dev_sw_netstats_rx_add(net, pkt_len);
|
||||
}
|
||||
|
||||
skip:
|
||||
@ -256,8 +233,8 @@ static int qmimux_register_device(struct net_device *real_dev, u8 mux_id)
|
||||
priv->mux_id = mux_id;
|
||||
priv->real_dev = real_dev;
|
||||
|
||||
priv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
|
||||
if (!priv->stats64) {
|
||||
new_dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
|
||||
if (!new_dev->tstats) {
|
||||
err = -ENOBUFS;
|
||||
goto out_free_newdev;
|
||||
}
|
||||
@ -292,7 +269,7 @@ static void qmimux_unregister_device(struct net_device *dev,
|
||||
struct qmimux_priv *priv = netdev_priv(dev);
|
||||
struct net_device *real_dev = priv->real_dev;
|
||||
|
||||
free_percpu(priv->stats64);
|
||||
free_percpu(dev->tstats);
|
||||
netdev_upper_dev_unlink(real_dev, dev);
|
||||
unregister_netdevice_queue(dev, head);
|
||||
|
||||
@ -598,7 +575,7 @@ static const struct net_device_ops qmi_wwan_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
@ -279,7 +279,7 @@ static const struct net_device_ops rndis_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
@ -184,7 +184,7 @@ static const struct net_device_ops sierra_net_device_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
};
|
||||
|
@ -1435,7 +1435,7 @@ static const struct net_device_ops smsc75xx_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_set_mac_address = eth_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
|
@ -1041,7 +1041,7 @@ static const struct net_device_ops smsc95xx_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_do_ioctl = smsc95xx_ioctl,
|
||||
|
@ -308,7 +308,7 @@ static const struct net_device_ops sr9700_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_do_ioctl = sr9700_ioctl,
|
||||
.ndo_set_rx_mode = sr9700_set_multicast,
|
||||
|
@ -681,7 +681,7 @@ static const struct net_device_ops sr9800_netdev_ops = {
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_do_ioctl = sr_ioctl,
|
||||
|
@ -304,7 +304,7 @@ static void __usbnet_status_stop_force(struct usbnet *dev)
|
||||
*/
|
||||
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;
|
||||
int status;
|
||||
|
||||
@ -980,15 +980,6 @@ int usbnet_set_link_ksettings(struct net_device *net,
|
||||
}
|
||||
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)
|
||||
{
|
||||
struct usbnet *dev = netdev_priv(net);
|
||||
@ -1220,7 +1211,7 @@ static void tx_complete (struct urb *urb)
|
||||
struct usbnet *dev = entry->dev;
|
||||
|
||||
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;
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&stats64->syncp);
|
||||
@ -1596,7 +1587,7 @@ void usbnet_disconnect (struct usb_interface *intf)
|
||||
usb_free_urb(dev->interrupt);
|
||||
kfree(dev->padding_pkt);
|
||||
|
||||
free_percpu(dev->stats64);
|
||||
free_percpu(net->tstats);
|
||||
free_netdev(net);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usbnet_disconnect);
|
||||
@ -1608,7 +1599,7 @@ static const struct net_device_ops usbnet_netdev_ops = {
|
||||
.ndo_tx_timeout = usbnet_tx_timeout,
|
||||
.ndo_set_rx_mode = usbnet_set_rx_mode,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
};
|
||||
@ -1671,8 +1662,8 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
|
||||
dev->driver_info = info;
|
||||
dev->driver_name = name;
|
||||
|
||||
dev->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
|
||||
if (!dev->stats64)
|
||||
net->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
|
||||
if (!net->tstats)
|
||||
goto out0;
|
||||
|
||||
dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV
|
||||
@ -1812,7 +1803,7 @@ out1:
|
||||
*/
|
||||
cancel_work_sync(&dev->kevent);
|
||||
del_timer_sync(&dev->delay);
|
||||
free_percpu(dev->stats64);
|
||||
free_percpu(net->tstats);
|
||||
out0:
|
||||
free_netdev(net);
|
||||
out:
|
||||
|
@ -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))) {
|
||||
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 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.
|
||||
*/
|
||||
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,
|
||||
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 */
|
||||
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_stop = qtnf_netdev_close,
|
||||
.ndo_start_xmit = qtnf_netdev_hard_start_xmit,
|
||||
.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_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,
|
||||
qtnf_sta_list_init(&vif->sta_list);
|
||||
INIT_WORK(&vif->high_pri_tx_work, qtnf_vif_send_data_high_pri);
|
||||
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);
|
||||
@ -531,7 +526,6 @@ static void qtnf_core_mac_detach(struct qtnf_bus *bus, unsigned int macid)
|
||||
}
|
||||
rtnl_unlock();
|
||||
qtnf_sta_list_free(&vif->sta_list);
|
||||
free_percpu(vif->stats64);
|
||||
}
|
||||
|
||||
if (mac->wiphy_registered)
|
||||
@ -924,46 +918,6 @@ void qtnf_wake_all_queues(struct net_device *ndev)
|
||||
}
|
||||
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)
|
||||
{
|
||||
return qtnf_debugfs_dir;
|
||||
|
@ -70,8 +70,6 @@ struct qtnf_vif {
|
||||
struct qtnf_sta_list sta_list;
|
||||
unsigned long cons_tx_timeout_cnt;
|
||||
int generation;
|
||||
|
||||
struct pcpu_sw_netstats __percpu *stats64;
|
||||
};
|
||||
|
||||
struct qtnf_mac_info {
|
||||
@ -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 net_device *qtnf_classify_skb(struct qtnf_bus *bus, struct sk_buff *skb);
|
||||
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);
|
||||
|
||||
|
@ -489,7 +489,7 @@ static void qtnf_pearl_data_tx_reclaim(struct qtnf_pcie_pearl_state *ps)
|
||||
PCI_DMA_TODEVICE);
|
||||
|
||||
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)) {
|
||||
qtnf_wake_all_queues(skb->dev);
|
||||
priv->tx_stopped = 0;
|
||||
@ -756,7 +756,7 @@ static int qtnf_pcie_pearl_rx_poll(struct napi_struct *napi, int budget)
|
||||
skb_put(skb, psize);
|
||||
ndev = qtnf_classify_skb(bus, skb);
|
||||
if (likely(ndev)) {
|
||||
qtnf_update_rx_stats(ndev, skb);
|
||||
dev_sw_netstats_rx_add(ndev, skb->len);
|
||||
skb->protocol = eth_type_trans(skb, ndev);
|
||||
napi_gro_receive(napi, skb);
|
||||
} else {
|
||||
|
@ -418,7 +418,7 @@ static void qtnf_topaz_data_tx_reclaim(struct qtnf_pcie_topaz_state *ts)
|
||||
PCI_DMA_TODEVICE);
|
||||
|
||||
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)) {
|
||||
qtnf_wake_all_queues(skb->dev);
|
||||
priv->tx_stopped = 0;
|
||||
@ -662,7 +662,7 @@ static int qtnf_topaz_rx_poll(struct napi_struct *napi, int budget)
|
||||
skb_put(skb, psize);
|
||||
ndev = qtnf_classify_skb(bus, skb);
|
||||
if (likely(ndev)) {
|
||||
qtnf_update_rx_stats(ndev, skb);
|
||||
dev_sw_netstats_rx_add(ndev, skb->len);
|
||||
skb->protocol = eth_type_trans(skb, ndev);
|
||||
netif_receive_skb(skb);
|
||||
} else {
|
||||
|
@ -3379,7 +3379,7 @@ static const struct net_device_ops rndis_wlan_netdev_ops = {
|
||||
.ndo_stop = usbnet_stop,
|
||||
.ndo_start_xmit = usbnet_start_xmit,
|
||||
.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_validate_addr = eth_validate_addr,
|
||||
.ndo_set_rx_mode = rndis_wlan_set_multicast_list,
|
||||
|
@ -65,8 +65,6 @@ struct usbnet {
|
||||
struct usb_anchor deferred;
|
||||
struct tasklet_struct bh;
|
||||
|
||||
struct pcpu_sw_netstats __percpu *stats64;
|
||||
|
||||
struct work_struct kevent;
|
||||
unsigned long flags;
|
||||
# define EVENT_TX_HALT 0
|
||||
@ -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_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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user