From eugen@eg.sd.rdtc.ru  Tue Oct  8 12:37:44 2013
Return-Path: <eugen@eg.sd.rdtc.ru>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1])
	(using TLSv1 with cipher ADH-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by hub.freebsd.org (Postfix) with ESMTP id 22BD993F;
	Tue,  8 Oct 2013 12:37:44 +0000 (UTC)
	(envelope-from eugen@eg.sd.rdtc.ru)
Received: from eg.sd.rdtc.ru (eg.sd.rdtc.ru [IPv6:2a03:3100:c:13::5])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by mx1.freebsd.org (Postfix) with ESMTPS id 6DD812FBE;
	Tue,  8 Oct 2013 12:37:42 +0000 (UTC)
Received: from eg.sd.rdtc.ru (eugen@localhost [127.0.0.1])
	by eg.sd.rdtc.ru (8.14.7/8.14.7) with ESMTP id r98CbWFw063450;
	Tue, 8 Oct 2013 19:37:32 +0700 (NOVT)
	(envelope-from eugen@eg.sd.rdtc.ru)
Received: (from eugen@localhost)
	by eg.sd.rdtc.ru (8.14.7/8.14.7/Submit) id r98CbWOW063449;
	Tue, 8 Oct 2013 19:37:32 +0700 (NOVT)
	(envelope-from eugen)
Message-Id: <201310081237.r98CbWOW063449@eg.sd.rdtc.ru>
Date: Tue, 8 Oct 2013 19:37:32 +0700 (NOVT)
From: Eugene Grosbein <eugen@grosbein.net>
To: FreeBSD-gnats-submit@freebsd.org
Cc: jfv@freebsd.org
Subject: [patch] [igb] Revision 247430 broke outgoing interface stats for stable/8
X-Send-Pr-Version: 3.114
X-GNATS-Notify:

>Number:         182828
>Category:       kern
>Synopsis:       [patch] [igb] Revision 247430 broke outgoing interface stats for stable/8
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    jfv
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct 08 12:40:00 UTC 2013
>Closed-Date:    
>Last-Modified:  Thu Nov  7 00:50:00 UTC 2013
>Originator:     Eugene Grosbein
>Release:        FreeBSD 8.4-STABLE amd64
>Organization:
RDTC JSC
>Environment:
System: FreeBSD eg.sd.rdtc.ru 8.4-STABLE FreeBSD 8.4-STABLE #3 r251830M: Mon Sep 30 18:01:03 NOVT 2013 root@eg.sd.rdtc.ru:/usr/local/obj/usr/local/src/sys/EG amd64

>Description:
	There was r241037 commit by glebius@ to head fixing
	"inaccurate overrated if_obytes accounting" in the HEAD:
	http://svnweb.freebsd.org/base?view=revision&revision=241037

	And there was _incomplete_ MFC to stable/8 r247430:
	http://svnweb.freebsd.org/base?view=revision&revision=247430

	r247430 contained some parts of r241037 but missed others vital
	parts, so it introduced "inaccurate overrated if_obytes accounting"
	to stable/8. For example, igb(4) now suffers from same problem.

>How-To-Repeat:
	Run recent 8.4-STABLE with igb(4), make lots of outgoing traffic
	and see that interface statistics is overrated.

>Fix:

	Make mentioned MFC more complete. At least, merge
	changes to sys/net/if_var.h to delete extra increase of if_obytes
	and to sys/dev/oce/oce_if.c to fix last consumer
	of drbr_stats_update() in stable/8:

--- sys/net/if_var.h	2012/09/28 17:36:00	241036
+++ sys/net/if_var.h	2012/09/28 18:28:27	241037
@@ -590,22 +590,10 @@
 } while (0)
 
 #ifdef _KERNEL
-static __inline void
-drbr_stats_update(struct ifnet *ifp, int len, int mflags)
-{
-#ifndef NO_SLOW_STATS
-	ifp->if_obytes += len;
-	if (mflags & M_MCAST)
-		ifp->if_omcasts++;
-#endif
-}
-
 static __inline int
 drbr_enqueue(struct ifnet *ifp, struct buf_ring *br, struct mbuf *m)
 {	
 	int error = 0;
-	int len = m->m_pkthdr.len;
-	int mflags = m->m_flags;
 
 #ifdef ALTQ
 	if (ALTQ_IS_ENABLED(&ifp->if_snd)) {
@@ -613,12 +601,10 @@
 		return (error);
 	}
 #endif
-	if ((error = buf_ring_enqueue_bytes(br, m, len)) == ENOBUFS) {
-		br->br_drops++;
+	error = buf_ring_enqueue(br, m);
+	if (error)
 		m_freem(m);
-	} else
-		drbr_stats_update(ifp, len, mflags);
-	
+
 	return (error);
 }
 
--- sys/dev/oce/oce_if.c	2012/09/28 17:36:00	241036
+++ sys/dev/oce/oce_if.c	2012/09/28 18:28:27	241037
@@ -1183,7 +1183,9 @@
 			}  
 			break;
 		}
-		drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags);
+		ifp->if_obytes += next->m_pkthdr.len;
+		if (next->m_flags & M_MCAST)
+			ifp->if_omcasts++;
 		ETHER_BPF_MTAP(ifp, next);
 		next = drbr_dequeue(ifp, br);
 	}

Eugene Grosbein
>Release-Note:
>Audit-Trail:
State-Changed-From-To: open->closed 
State-Changed-By: glebius 
State-Changed-When: Tue Oct 15 16:51:03 UTC 2013 
State-Changed-Why:  
The problem isn't present in supported FreeBSD branches, sorry. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=182828 
State-Changed-From-To: closed->open 
State-Changed-By: adrian 
State-Changed-When: Mon Oct 21 06:10:48 UTC 2013 
State-Changed-Why:  
Re-open; the issue was due to jfv's merge. 



Responsible-Changed-From-To: freebsd-bugs->jfv 
Responsible-Changed-By: adrian 
Responsible-Changed-When: Mon Oct 21 06:10:48 UTC 2013 
Responsible-Changed-Why:  
Re-open; the issue was due to jfv's merge. 


http://www.freebsd.org/cgi/query-pr.cgi?pr=182828 

From: Andrew Kinney <andykinney@advantagecom.net>
To: bug-followup@FreeBSD.org, eugen@grosbein.net
Cc:  
Subject: Re: kern/182828: [patch] [igb] Revision 247430 broke outgoing interface
 stats for stable/8
Date: Wed, 06 Nov 2013 16:23:17 -0800

 I'm also seeing this problem in 8.4-RELEASE installed Oct. 28, 2013. 
 Stock kernel. Not custom. 8.4-RELEASE is a supported FreeBSD branch.
 
 [root@redact ~]# uname -a
 FreeBSD redact.redact.com 8.4-RELEASE-p4 FreeBSD 8.4-RELEASE-p4 #0: Mon 
 Sep  9 23:16:13 UTC 2013 
 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
 
 Symptoms visible on a box running bridging and IPFW. Outbound bytes is 
 usually about double inbound bytes on the opposite interface. Packet 
 counts are about equal. Very visible when there is significant traffic 
 graphed via snmpd and cacti.
 
 Sincerely,
 Andrew Kinney
>Unformatted:
