Merge "net: usbnet: Add UTC timestamp logging for packets"

This commit is contained in:
qctecmdr 2020-02-13 09:25:36 -08:00 committed by Gerrit - the friendly Code Review server
commit 3db6f4c3b1
2 changed files with 55 additions and 1 deletions

View File

@ -45,9 +45,13 @@
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/pm_runtime.h>
#include <linux/ipc_logging.h>
#define DRIVER_VERSION "22-Aug-2005"
#define dbg_log_string(fmt, ...) \
ipc_log_string(dev->ipc_log_ctxt,\
"%s: " fmt, __func__, ##__VA_ARGS__)
/*-------------------------------------------------------------------------*/
@ -322,8 +326,10 @@ void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb)
struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);
unsigned long flags;
int status;
struct timespec64 now;
if (test_bit(EVENT_RX_PAUSED, &dev->flags)) {
dbg_log_string("skb %pK added to pause list", skb);
skb_queue_tail(&dev->rxq_pause, skb);
return;
}
@ -346,6 +352,8 @@ void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb)
if (skb_defer_rx_timestamp(skb))
return;
getnstimeofday64(&now);
dbg_log_string("skb %pK, time %lu.%lu", skb, now.tv_sec, now.tv_nsec);
status = netif_rx (skb);
if (status != NET_RX_SUCCESS)
netif_dbg(dev, rx_err, dev->net,
@ -402,6 +410,8 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
net->mtu = new_mtu;
dev->hard_mtu = net->mtu + net->hard_header_len;
dbg_log_string("changing MTU to %d", dev->hard_mtu);
netdev_info(dev->net, "Changing MTU to %d\n", dev->hard_mtu);
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
if (dev->rx_urb_size > old_rx_urb_size) {
@ -489,9 +499,11 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
unsigned long lockflags;
size_t size = dev->rx_urb_size;
dbg_log_string("urb %pK", urb);
/* prevent rx skb allocation when error ratio is high */
if (test_bit(EVENT_RX_KILL, &dev->flags)) {
usb_free_urb(urb);
dbg_log_string("high error rate, aborting...");
return -ENOLINK;
}
@ -501,11 +513,13 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
if (!skb) {
netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
dbg_log_string("skb alloc fail");
usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
usb_free_urb (urb);
return -ENOMEM;
}
dbg_log_string("skb %pK", skb);
entry = (struct skb_data *) skb->cb;
entry->urb = urb;
entry->dev = dev;
@ -549,6 +563,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
}
spin_unlock_irqrestore (&dev->rxq.lock, lockflags);
if (retval) {
dbg_log_string("Submission error %d", retval);
dev_kfree_skb_any (skb);
usb_free_urb (urb);
}
@ -573,7 +588,9 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb)
if (dev->driver_info->flags & FLAG_MULTI_PACKET)
goto done;
dbg_log_string("skb %pK", skb);
if (skb->len < ETH_HLEN) {
dbg_log_string("Very short skb->len %d", skb->len);
dev->net->stats.rx_errors++;
dev->net->stats.rx_length_errors++;
netif_dbg(dev, rx_err, dev->net, "rx length %d\n", skb->len);
@ -595,11 +612,15 @@ static void rx_complete (struct urb *urb)
struct usbnet *dev = entry->dev;
int urb_status = urb->status;
enum skb_state state;
struct timespec64 now;
skb_put (skb, urb->actual_length);
state = rx_done;
entry->urb = NULL;
getnstimeofday64(&now);
dbg_log_string("skb %pK, urb %pK, time %lu.%lu",
skb, urb, now.tv_sec, now.tv_nsec);
switch (urb_status) {
/* success */
case 0:
@ -653,6 +674,7 @@ block:
break;
}
dbg_log_string("status %d, state %d", urb_status, state);
/* stop rx if packet error rate is high */
if (++dev->pkt_cnt > 30) {
dev->pkt_cnt = 0;
@ -864,6 +886,9 @@ int usbnet_stop (struct net_device *net)
else
usb_autopm_put_interface(dev->intf);
dbg_log_string();
netdev_info(dev->net, "%s\n", __func__);
return 0;
}
EXPORT_SYMBOL_GPL(usbnet_stop);
@ -949,6 +974,10 @@ int usbnet_open (struct net_device *net)
usb_autopm_put_interface(dev->intf);
}
}
dbg_log_string();
netdev_info(dev->net, "%s\n", __func__);
return retval;
done:
usb_autopm_put_interface(dev->intf);
@ -1259,7 +1288,11 @@ static void tx_complete (struct urb *urb)
struct sk_buff *skb = (struct sk_buff *) urb->context;
struct skb_data *entry = (struct skb_data *) skb->cb;
struct usbnet *dev = entry->dev;
struct timespec64 now;
getnstimeofday64(&now);
dbg_log_string("skb %pK, urb %pK, time %lu.%lu",
skb, urb, now.tv_sec, now.tv_nsec);
if (urb->status == 0) {
struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);
unsigned long flags;
@ -1305,6 +1338,7 @@ static void tx_complete (struct urb *urb)
}
}
dbg_log_string("status %d", urb->status);
usb_autopm_put_interface_async(dev->intf);
(void) defer_bh(dev, skb, &dev->txq, tx_done);
}
@ -1371,10 +1405,13 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
struct driver_info *info = dev->driver_info;
unsigned long flags;
int retval;
struct timespec64 now;
if (skb)
skb_tx_timestamp(skb);
getnstimeofday64(&now);
dbg_log_string("skb %pK, time %lu.%lu", skb, now.tv_sec, now.tv_nsec);
// some devices want funky USB-level framing, for
// win32 driver (usually) and/or hardware quirks
if (info->tx_fixup) {
@ -1390,9 +1427,11 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
if (!(urb = usb_alloc_urb (0, GFP_ATOMIC))) {
netif_dbg(dev, tx_err, dev->net, "no urb\n");
retval = -ENOMEM;
goto drop;
}
dbg_log_string("urb %pK", urb);
entry = (struct skb_data *) skb->cb;
entry->urb = urb;
entry->dev = dev;
@ -1400,7 +1439,8 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
usb_fill_bulk_urb (urb, dev->udev, dev->out,
skb->data, skb->len, tx_complete, skb);
if (dev->can_dma_sg) {
if (build_dma_sg(skb, urb) < 0)
retval = build_dma_sg(skb, urb);
if (retval < 0)
goto drop;
}
length = urb->transfer_buffer_length;
@ -1488,6 +1528,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
if (retval) {
netif_dbg(dev, tx_err, dev->net, "drop, code %d\n", retval);
drop:
dbg_log_string("skb dropped, error %d", retval);
dev->net->stats.tx_dropped++;
not_drop:
if (skb)
@ -1540,6 +1581,7 @@ static void usbnet_bh (unsigned long param)
while ((skb = skb_dequeue (&dev->done))) {
entry = (struct skb_data *) skb->cb;
dbg_log_string("skb %pK, state %d", skb, entry->state);
switch (entry->state) {
case rx_done:
entry->state = rx_cleanup;
@ -1610,6 +1652,9 @@ void usbnet_disconnect (struct usb_interface *intf)
if (!dev)
return;
ipc_log_context_destroy(dev->ipc_log_ctxt);
dev->ipc_log_ctxt = NULL;
xdev = interface_to_usbdev (intf);
netif_info(dev, probe, dev->net, "unregister '%s' usb-%s-%s, %s\n",
@ -1832,6 +1877,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
if (dev->driver_info->flags & FLAG_LINK_INTR)
usbnet_link_change(dev, 0, 0);
dev->ipc_log_ctxt = ipc_log_context_create(IPC_LOG_NUM_PAGES,
dev->net->name, 0);
if (!dev->ipc_log_ctxt)
pr_err("%s: Error getting ipc_log_ctxt\n", __func__);
return 0;
out5:

View File

@ -22,6 +22,8 @@
#ifndef __LINUX_USB_USBNET_H
#define __LINUX_USB_USBNET_H
#define IPC_LOG_NUM_PAGES 30
/* interface from usbnet core to each USB networking link we handle */
struct usbnet {
/* housekeeping */
@ -82,6 +84,8 @@ struct usbnet {
# define EVENT_LINK_CHANGE 11
# define EVENT_SET_RX_MODE 12
# define EVENT_NO_IP_ALIGN 13
void *ipc_log_ctxt;
};
static inline struct usb_driver *driver_of(struct usb_interface *intf)