From owner-freebsd-bugs@FreeBSD.ORG Wed Mar 31 00:10:18 2004 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 20C8216A4CE for ; Wed, 31 Mar 2004 00:10:18 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0C1BF43D5C for ; Wed, 31 Mar 2004 00:10:18 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) i2V8AHbv044182 for ; Wed, 31 Mar 2004 00:10:17 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.10/8.12.10/Submit) id i2V8AHUG044180; Wed, 31 Mar 2004 00:10:17 -0800 (PST) (envelope-from gnats) Resent-Date: Wed, 31 Mar 2004 00:10:17 -0800 (PST) Resent-Message-Id: <200403310810.i2V8AHUG044180@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, 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 ; 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 ; 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 To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/64975: [PATCH] rl driver with polling enabled increase TX counters at each clock tick X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: artis@fbsd.lv List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Mar 2004 08:10:18 -0000 >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: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Mar 31 00:10:17 PST 2004 >Closed-Date: >Last-Modified: >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: >Unformatted: