From artis@fbsd.lv  Wed Mar 31 00:09:38 2004
Return-Path: <artis@fbsd.lv>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 99D1816A4CF
	for <FreeBSD-gnats-submit@freebsd.org>; Wed, 31 Mar 2004 00:09:38 -0800 (PST)
Received: from fbsd.lv (fbsd.lv [159.148.95.82])
	by mx1.FreeBSD.org (Postfix) with ESMTP id 0B61543D1F
	for <FreeBSD-gnats-submit@freebsd.org>; Wed, 31 Mar 2004 00:09:37 -0800 (PST)
	(envelope-from artis@fbsd.lv)
Received: by fbsd.lv (Postfix, from userid 10000)
	id 2EA15C0EE; Wed, 31 Mar 2004 11:09:19 +0300 (EEST)
Message-Id: <20040331080919.2EA15C0EE@fbsd.lv>
Date: Wed, 31 Mar 2004 11:09:19 +0300 (EEST)
From: artis@fbsd.lv
Reply-To: artis@fbsd.lv
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [PATCH] rl driver with polling enabled increase TX counters at each clock tick
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         64975
>Category:       kern
>Synopsis:       [PATCH] rl driver with polling enabled increase TX counters at each clock tick
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    ru
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Mar 31 00:10:17 PST 2004
>Closed-Date:    Mon Apr 05 00:32:16 PDT 2004
>Last-Modified:  Mon Apr 05 00:32:16 PDT 2004
>Originator:     Artis Caune
>Release:        FreeBSD 5.2.1-RELEASE-p3 i386
>Organization:
>Environment:
System: FreeBSD fbsd.lv 5.2.1-RELEASE-p3 FreeBSD 5.2.1-RELEASE-p3 #0: Thu Mar 18 13:01:46 EET 2004 root@fbsd.lv:/usr/obj/usr/src/sys/KERNEL i386

>Description:
	When device polling is enabled on rl interface, TX counters are
increased at every 'rl_poll() -> rl_txeof()' function call (at each clock tick).
When working in interupt mode, rl_txeof is called only when device needs atention
and it works correctly.
Actually with polling enabled I got ~600000 outgoing packets and ~15% CPU in interupts.

sys/pci/if_rl.c code is not very efficient: at every rl_poll() call
driver is doing while loop 4 times(4 TX rings?) and no meter what, it always update
    ifp->if_opackets++;
    ifp->if_collisions += (txstat & RL_TXSTAT_COLLCNT) >> 24;
    ifp->if_flags &= ~IFF_OACTIVE;
So at every clock tick we update those counters 4 times

Same problem on 4.x and 5.x

This patch will only fix counter problem, not wasted CPU times!!!

p.s. this was PR misc/64690

>How-To-Repeat:
	recompile and run kernel with polling enabled and rl interface
>Fix:

--- if_rl.patch begins here ---
*** sys/pci/if_rl.c.orig	Fri Nov 28 07:28:29 2003
--- sys/pci/if_rl.c	Wed Mar 31 10:15:34 2004
***************
*** 1373,1386 ****
  		ifp->if_collisions += (txstat & RL_TXSTAT_COLLCNT) >> 24;
  
  		if (RL_LAST_TXMBUF(sc) != NULL) {
  			bus_dmamap_unload(sc->rl_tag, RL_LAST_DMAMAP(sc));
  			bus_dmamap_destroy(sc->rl_tag, RL_LAST_DMAMAP(sc));
  			m_freem(RL_LAST_TXMBUF(sc));
  			RL_LAST_TXMBUF(sc) = NULL;
  		}
! 		if (txstat & RL_TXSTAT_TX_OK)
! 			ifp->if_opackets++;
! 		else {
  			int			oldthresh;
  			ifp->if_oerrors++;
  			if ((txstat & RL_TXSTAT_TXABRT) ||
--- 1373,1385 ----
  		ifp->if_collisions += (txstat & RL_TXSTAT_COLLCNT) >> 24;
  
  		if (RL_LAST_TXMBUF(sc) != NULL) {
+ 			ifp->if_opackets++;
  			bus_dmamap_unload(sc->rl_tag, RL_LAST_DMAMAP(sc));
  			bus_dmamap_destroy(sc->rl_tag, RL_LAST_DMAMAP(sc));
  			m_freem(RL_LAST_TXMBUF(sc));
  			RL_LAST_TXMBUF(sc) = NULL;
  		}
! 		if (!(txstat & RL_TXSTAT_TX_OK)) {
  			int			oldthresh;
  			ifp->if_oerrors++;
  			if ((txstat & RL_TXSTAT_TXABRT) ||
--- if_rl.patch ends here ---


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->ru 
Responsible-Changed-By: ru 
Responsible-Changed-When: Wed Mar 31 00:25:24 PST 2004 
Responsible-Changed-Why:  
Grab it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64975 
State-Changed-From-To: open->patched 
State-Changed-By: ru 
State-Changed-When: Fri Apr 2 16:42:40 PST 2004 
State-Changed-Why:  
Fixed in 5.2-CURRENT, in src/sys/pci/if_rl.c,v 1.134. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64975 
State-Changed-From-To: patched->closed 
State-Changed-By: ru 
State-Changed-When: Mon Apr 5 00:31:32 PDT 2004 
State-Changed-Why:  
Fix merged into RELENG_4 (if_rl.c,v 1.38.2.21). 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64975 
>Unformatted:
