New: usbnet and /proc/net/dev stats
Subsystems (8)
A message that is not in the archive (sent off-list or not yet received): [email protected]/
(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).
Quoted 18 lines · On Sat, 20 Jun 2009 16:24:13 GMT [email protected] wrote:
http://bugzilla.kernel.org/show_bug.cgi?id=13589
Summary: usbnet and /proc/net/dev stats Product: Networking Version: 2.5 Kernel Version: 2.6.30 Platform: All OS/Version: Linux Tree: Mainline Status: NEW Severity: normal Priority: P1 Component: Other AssignedTo: [email protected] ReportedBy: [email protected] Regression: No
Quoted 7 lines
Commit
805aaa29fabreaks device statistics with the usbnet module. Reverting this commit fixes it. I think usbnet needed this callback to lookup the dev so it could update .stats.Also, I do have
CONFIG_COMPAT_NET_DEV_OPSdefined and am using usbnet withcdc_etherand zaurus.
This has turned into a bit of a mess, as the fix which I typed in needs the revert of another patch, and I don't know what actually went wrong with usbnet stats anyway.
Could someone (Stephen?) please take a look?
As it appears to be a 2.6.29->2.6.30 regression, please remember to cc [email protected] on any fixes, thanks.
On Mon, Jun 29, 2009 at 05:23:41PM -0700, Andrew Morton wrote:
All usbnet stats weren't getting updated (ifconfig, was always showing 0). When applied to 2.6.30 this fixes it. Commit 805aaa29fa was the culprit and reverting it re-adds usbnet_get_stats() but needed to be modified to add whats in usbnet_netdev_ops:
usbnet.c renamed from tmp/usbnet.c +7 -0
@@ -1106,9 +1106,16 @@ }EXPORT_SYMBOL_GPL (usbnet_disconnect); +static struct net_device_stats *usbnet_get_stats (struct net_device *net) +{ +struct usbnet *dev =netdev_priv (net); +return &dev->stats; +} +static const struct net_device_ops usbnet_netdev_ops = { .ndo_open = usbnet_open, .ndo_stop = usbnet_stop, + .ndo_get_stats = usbnet_get_stats, .ndo_start_xmit = usbnet_start_xmit, .ndo_tx_timeout = usbnet_tx_timeout, .ndo_change_mtu = usbnet_change_mtu,
Signature · 1 line
Ben Kibbey (bjk) @ FreeNode/OFTC/Jabber
PATCH 1/7 cdc_eem: Use netdev stats structure
This series should fix the problem:
cdc_eem: Use netdev stats structure
Now that netdev has its own stats structure we should use that instead.
drivers/net/usb/cdc_eem.c +1 -1
@@ -319,7 +319,7 @@ static int eem_rx_fixup(struct usbnet *dev, struct sk_buff *skb)return crc == crc2;if (unlikely (crc != crc2)) { - dev->stats.rx_errors++; + dev->net->stats.rx_errors++;dev_kfree_skb_any (skb2); }else usbnet_skb_return (dev, skb2);
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtPATCH 2/7 dm9601: Use netdev stats structure
dm9601: Use netdev stats structure
Now that netdev has its own stats structure we should use that instead.
drivers/net/usb/dm9601.c +5 -5
@@ -513,11 +513,11 @@ static int dm9601_rx_fixup(struct usbnet *dev, struct sk_buff *skb) len = (skb->data[1 ] | (skb->data[2 ] <<8 )) -4 ;if (unlikely (status &0xbf )) { -if (status &0x01 ) dev->stats.rx_fifo_errors++; -if (status &0x02 ) dev->stats.rx_crc_errors++; -if (status &0x04 ) dev->stats.rx_frame_errors++; -if (status &0x20 ) dev->stats.rx_missed_errors++; -if (status &0x90 ) dev->stats.rx_length_errors++; +if (status &0x01 ) dev->net->stats.rx_fifo_errors++; +if (status &0x02 ) dev->net->stats.rx_crc_errors++; +if (status &0x04 ) dev->net->stats.rx_frame_errors++; +if (status &0x20 ) dev->net->stats.rx_missed_errors++; +if (status &0x90 ) dev->net->stats.rx_length_errors++;return 0 ; }
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtPATCH 3/7 net1080: Use netdev stats structure
In reply to Herbert Xunet1080: Use netdev stats structure
Now that netdev has its own stats structure we should use that instead.
drivers/net/usb/net1080.c +6 -6
@@ -433,7 +433,7 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb)dbg ("rx framesize %d range %d..%d mtu %d" , skb->len, net->hard_header_len, dev->hard_mtu, net->mtu);#endif - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;nc_ensure_sync (dev);return 0 ; }
@@ -442,12 +442,12 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb) hdr_len =le16_to_cpup (&header->hdr_len); packet_len =le16_to_cpup (&header->packet_len);if (FRAMED_SIZE (packet_len) >NC_MAX_PACKET ) { - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;dbg ("packet too big, %d" , packet_len);nc_ensure_sync (dev);return 0 ; }else if (hdr_len <MIN_HEADER ) { - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;dbg ("header too short, %d" , hdr_len);nc_ensure_sync (dev);return 0 ;
@@ -465,21 +465,21 @@ static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb)if ((packet_len &0x01 ) ==0 ) {if (skb->data [packet_len] !=PAD_BYTE ) { - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;dbg ("bad pad" );return 0 ; }skb_trim (skb, skb->len -1 ); }if (skb->len != packet_len) { - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;dbg ("bad packet len %d (expected %d)" , skb->len, packet_len);nc_ensure_sync (dev);return 0 ; }if (header->packet_id !=get_unaligned (&trailer->packet_id)) { - dev->stats.rx_fifo_errors++; + dev->net->stats.rx_fifo_errors++;dbg ("(2+ dropped) rx packet_id mismatch 0x%x 0x%x" ,le16_to_cpu (header->packet_id),le16_to_cpu (trailer->packet_id));
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtPATCH 4/7 rndis_host: Use netdev stats structure
In reply to Herbert Xurndis_host: Use netdev stats structure
Now that netdev has its own stats structure we should use that instead.
drivers/net/usb/rndis_host.c +1 -1
@@ -487,7 +487,7 @@ int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb)if (unlikely (hdr->msg_type !=RNDIS_MSG_PACKET || skb->len < msg_len || (data_offset + data_len +8 ) > msg_len)) { - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;devdbg (dev,"bad rndis message %d/%d/%d/%d, len %d" ,le32_to_cpu (hdr->msg_type), msg_len, data_offset, data_len, skb->len);
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtPATCH 5/7 smsc95xx: Use netdev stats structure
In reply to Herbert Xusmsc95xx: Use netdev stats structure
Now that netdev has its own stats structure we should use that instead.
drivers/net/usb/smsc95xx.c +5 -5
@@ -1108,18 +1108,18 @@ static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)if (unlikely (header &RX_STS_ES_ )) {if (netif_msg_rx_err (dev))devdbg (dev,"Error header=0x%08x" , header); - dev->stats.rx_errors++; - dev->stats.rx_dropped++; + dev->net->stats.rx_errors++; + dev->net->stats.rx_dropped++;if (header &RX_STS_CRC_ ) { - dev->stats.rx_crc_errors++; + dev->net->stats.rx_crc_errors++; }else {if (header & (RX_STS_TL_ |RX_STS_RF_ )) - dev->stats.rx_frame_errors++; + dev->net->stats.rx_frame_errors++;if ((header &RX_STS_LE_ ) && (!(header &RX_STS_FT_ ))) - dev->stats.rx_length_errors++; + dev->net->stats.rx_length_errors++; } }else {/* ETH_FRAME_LEN + 4(CRC) + 2(COE) + 4(Vlan) */
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtPATCH 6/7 usbnet: Use netdev stats structure
In reply to Herbert Xuusbnet: Use netdev stats structure
Now that netdev has its own stats structure we should use that instead.
drivers/net/usb/usbnet.c +15 -15
@@ -203,8 +203,8 @@ void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb)int status; skb->protocol =eth_type_trans (skb, dev->net); - dev->stats.rx_packets++; - dev->stats.rx_bytes += skb->len; + dev->net->stats.rx_packets++; + dev->net->stats.rx_bytes += skb->len;if (netif_msg_rx_status (dev)) devdbg (dev, "< rx, len %zu, type 0x%x",
@@ -366,7 +366,7 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb)if (netif_msg_rx_err (dev))devdbg (dev,"drop" ); error: - dev->stats.rx_errors++; + dev->net->stats.rx_errors++;skb_queue_tail (&dev->done, skb); } }
@@ -389,8 +389,8 @@ static void rx_complete (struct urb *urb)case 0 :if (skb->len < dev->net->hard_header_len) { entry->state = rx_cleanup; - dev->stats.rx_errors++; - dev->stats.rx_length_errors++; + dev->net->stats.rx_errors++; + dev->net->stats.rx_length_errors++;if (netif_msg_rx_err (dev))devdbg (dev,"rx length %d" , skb->len); }
@@ -402,7 +402,7 @@ static void rx_complete (struct urb *urb)* storm, recovering as needed. */ case -EPIPE : - dev->stats.rx_errors++; + dev->net->stats.rx_errors++;usbnet_defer_kevent (dev,EVENT_RX_HALT );// FALLTHROUGH
@@ -420,7 +420,7 @@ static void rx_complete (struct urb *urb)case -EPROTO :case -ETIME :case -EILSEQ : - dev->stats.rx_errors++; + dev->net->stats.rx_errors++;if (!timer_pending (&dev->delay)) {mod_timer (&dev->delay, jiffies +THROTTLE_JIFFIES );if (netif_msg_link (dev))
@@ -434,12 +434,12 @@ block:/* data overrun ... flush fifo? */ case -EOVERFLOW : - dev->stats.rx_over_errors++; + dev->net->stats.rx_over_errors++;// FALLTHROUGH default : entry->state = rx_cleanup; - dev->stats.rx_errors++; + dev->net->stats.rx_errors++;if (netif_msg_rx_err (dev))devdbg (dev,"rx status %d" , urb_status);break ;
@@ -552,8 +552,8 @@ int usbnet_stop (struct net_device *net)if (netif_msg_ifdown (dev))devinfo (dev,"stop stats: rx/tx %ld/%ld, errs %ld/%ld" , - dev->stats.rx_packets, dev->stats.tx_packets, - dev->stats.rx_errors, dev->stats.tx_errors + net->stats.rx_packets, net->stats.tx_packets, + net->stats.rx_errors, net->stats.tx_errors );// ensure there are no more active urbs
@@ -860,10 +860,10 @@ static void tx_complete (struct urb *urb)struct usbnet *dev = entry->dev;if (urb->status ==0 ) { - dev->stats.tx_packets++; - dev->stats.tx_bytes += entry->length; + dev->net->stats.tx_packets++; + dev->net->stats.tx_bytes += entry->length; }else { - dev->stats.tx_errors++; + dev->net->stats.tx_errors++;switch (urb->status) {case -EPIPE :
@@ -989,7 +989,7 @@ int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)devdbg (dev,"drop, code %d" , retval); drop: retval =NET_XMIT_SUCCESS ; - dev->stats.tx_dropped++; + dev->net->stats.tx_dropped++;if (skb)dev_kfree_skb_any (skb);usb_free_urb (urb);
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txtPATCH 7/7 usbnet: Remove private stats structure
In reply to Herbert Xuusbnet: Remove private stats structure
Now that nothing uses the private stats structure we can remove it.
include/linux/usb/usbnet.h +0 -1
@@ -42,7 +42,6 @@ struct usbnet {/* protocol/interface state */ struct net_device *net; -struct net_device_stats stats;int msg_enable;unsigned long data [5 ];u32 xid;
Cheers,
Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt