From owner-svn-src-all@FreeBSD.ORG Thu Sep 25 05:45:53 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org 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 ESMTPS id 8A8B8B8B; Thu, 25 Sep 2014 05:45:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7545F339; Thu, 25 Sep 2014 05:45:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s8P5jrwT049027; Thu, 25 Sep 2014 05:45:53 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s8P5jr8s049026; Thu, 25 Sep 2014 05:45:53 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201409250545.s8P5jr8s049026@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Thu, 25 Sep 2014 05:45:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r272090 - head/sys/dev/mxge X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Sep 2014 05:45:53 -0000 Author: glebius Date: Thu Sep 25 05:45:52 2014 New Revision: 272090 URL: http://svnweb.freebsd.org/changeset/base/272090 Log: - Provide mxge_get_counter() to return counters that are not collected, but taken from hardware. - Mechanically convert to if_inc_counter() the rest of counters. Modified: head/sys/dev/mxge/if_mxge.c Modified: head/sys/dev/mxge/if_mxge.c ============================================================================== --- head/sys/dev/mxge/if_mxge.c Thu Sep 25 02:26:05 2014 (r272089) +++ head/sys/dev/mxge/if_mxge.c Thu Sep 25 05:45:52 2014 (r272090) @@ -2678,7 +2678,7 @@ mxge_rx_done_big(struct mxge_slice_state /* try to replace the received mbuf */ if (mxge_get_buf_big(ss, rx->extra_map, idx)) { /* drop the frame -- the old mbuf is re-cycled */ - ifp->if_ierrors++; + if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); return; } @@ -2747,7 +2747,7 @@ mxge_rx_done_small(struct mxge_slice_sta /* try to replace the received mbuf */ if (mxge_get_buf_small(ss, rx->extra_map, idx)) { /* drop the frame -- the old mbuf is re-cycled */ - ifp->if_ierrors++; + if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); return; } @@ -4036,43 +4036,45 @@ mxge_watchdog(mxge_softc_t *sc) return (err); } -static u_long -mxge_update_stats(mxge_softc_t *sc) +static uint64_t +mxge_get_counter(struct ifnet *ifp, ift_counter cnt) { - struct mxge_slice_state *ss; - u_long pkts = 0; - u_long ipackets = 0; - u_long opackets = 0; -#ifdef IFNET_BUF_RING - u_long obytes = 0; - u_long omcasts = 0; - u_long odrops = 0; -#endif - u_long oerrors = 0; - int slice; + struct mxge_softc *sc; + uint64_t rv; - for (slice = 0; slice < sc->num_slices; slice++) { - ss = &sc->ss[slice]; - ipackets += ss->ipackets; - opackets += ss->opackets; -#ifdef IFNET_BUF_RING - obytes += ss->obytes; - omcasts += ss->omcasts; - odrops += ss->tx.br->br_drops; -#endif - oerrors += ss->oerrors; - } - pkts = (ipackets - sc->ifp->if_ipackets); - pkts += (opackets - sc->ifp->if_opackets); - sc->ifp->if_ipackets = ipackets; - sc->ifp->if_opackets = opackets; + sc = if_getsoftc(ifp); + rv = 0; + + switch (cnt) { + case IFCOUNTER_IPACKETS: + for (int s = 0; s < sc->num_slices; s++) + rv += sc->ss[s].ipackets; + return (rv); + case IFCOUNTER_OPACKETS: + for (int s = 0; s < sc->num_slices; s++) + rv += sc->ss[s].opackets; + return (rv); + case IFCOUNTER_OERRORS: + for (int s = 0; s < sc->num_slices; s++) + rv += sc->ss[s].oerrors; + return (rv); #ifdef IFNET_BUF_RING - sc->ifp->if_obytes = obytes; - sc->ifp->if_omcasts = omcasts; - sc->ifp->if_oqdrops = odrops; + case IFCOUNTER_OBYTES: + for (int s = 0; s < sc->num_slices; s++) + rv += sc->ss[s].obytes; + return (rv); + case IFCOUNTER_OMCASTS: + for (int s = 0; s < sc->num_slices; s++) + rv += sc->ss[s].omcasts; + return (rv); + case IFCOUNTER_OQDROPS: + for (int s = 0; s < sc->num_slices; s++) + rv += sc->ss[s].tx.br->br_drops; + return (rv); #endif - sc->ifp->if_oerrors = oerrors; - return pkts; + default: + return (if_get_counter_default(ifp, cnt)); + } } static void @@ -4087,8 +4089,6 @@ mxge_tick(void *arg) ticks = mxge_ticks; running = sc->ifp->if_drv_flags & IFF_DRV_RUNNING; if (running) { - /* aggregate stats from different slices */ - pkts = mxge_update_stats(sc); if (!sc->watchdog_countdown) { err = mxge_watchdog(sc); sc->watchdog_countdown = 4; @@ -4925,6 +4925,7 @@ mxge_attach(device_t dev) ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = mxge_ioctl; ifp->if_start = mxge_start; + ifp->if_get_counter = mxge_get_counter; /* Initialise the ifmedia structure */ ifmedia_init(&sc->media, 0, mxge_media_change, mxge_media_status);