From owner-svn-src-head@FreeBSD.ORG Sat Sep 13 18:13:09 2014 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 04089DE1; Sat, 13 Sep 2014 18:13:09 +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 E2F2A846; Sat, 13 Sep 2014 18:13:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s8DID8ss061539; Sat, 13 Sep 2014 18:13:08 GMT (envelope-from melifaro@FreeBSD.org) Received: (from melifaro@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s8DID8vR061538; Sat, 13 Sep 2014 18:13:08 GMT (envelope-from melifaro@FreeBSD.org) Message-Id: <201409131813.s8DID8vR061538@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: melifaro set sender to melifaro@FreeBSD.org using -f From: "Alexander V. Chernikov" Date: Sat, 13 Sep 2014 18:13:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r271538 - head/sys/net X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Sep 2014 18:13:09 -0000 Author: melifaro Date: Sat Sep 13 18:13:08 2014 New Revision: 271538 URL: http://svnweb.freebsd.org/changeset/base/271538 Log: Switch if_vlan(4) to use counter(9) using new if_get_counter api. Modified: head/sys/net/if_vlan.c Modified: head/sys/net/if_vlan.c ============================================================================== --- head/sys/net/if_vlan.c Sat Sep 13 17:58:34 2014 (r271537) +++ head/sys/net/if_vlan.c Sat Sep 13 18:13:08 2014 (r271538) @@ -105,6 +105,11 @@ struct ifvlan { struct ifvlantrunk *ifv_trunk; struct ifnet *ifv_ifp; void *ifv_cookie; + counter_u64_t ifv_ipackets; + counter_u64_t ifv_ibytes; + counter_u64_t ifv_opackets; + counter_u64_t ifv_obytes; + counter_u64_t ifv_omcasts; #define TRUNK(ifv) ((ifv)->ifv_trunk) #define PARENT(ifv) ((ifv)->ifv_trunk->parent) int ifv_pflags; /* special flags we have set on parent */ @@ -194,6 +199,7 @@ static void vlan_init(void *foo); static void vlan_input(struct ifnet *ifp, struct mbuf *m); static int vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr); static void vlan_qflush(struct ifnet *ifp); +static uint64_t vlan_get_counter(struct ifnet *ifp, ifnet_counter cnt); static int vlan_setflag(struct ifnet *ifp, int flag, int status, int (*func)(struct ifnet *, int)); static int vlan_setflags(struct ifnet *ifp, int status); @@ -945,6 +951,12 @@ vlan_clone_create(struct if_clone *ifc, return (ENOSPC); } SLIST_INIT(&ifv->vlan_mc_listhead); + /* Prepare pcpu counters */ + ifv->ifv_ipackets = counter_u64_alloc(M_WAITOK); + ifv->ifv_opackets = counter_u64_alloc(M_WAITOK); + ifv->ifv_ibytes = counter_u64_alloc(M_WAITOK); + ifv->ifv_obytes = counter_u64_alloc(M_WAITOK); + ifv->ifv_omcasts = counter_u64_alloc(M_WAITOK); ifp->if_softc = ifv; /* @@ -964,6 +976,7 @@ vlan_clone_create(struct if_clone *ifc, ifp->if_qflush = vlan_qflush; ifp->if_ioctl = vlan_ioctl; ifp->if_flags = VLAN_IFFLAGS; + ifp->if_get_counter = vlan_get_counter; ether_ifattach(ifp, eaddr); /* Now undo some of the damage... */ ifp->if_baudrate = 0; @@ -1006,6 +1019,11 @@ vlan_clone_destroy(struct if_clone *ifc, ether_ifdetach(ifp); /* first, remove it from system-wide lists */ vlan_unconfig(ifp); /* now it can be unconfigured and freed */ if_free(ifp); + counter_u64_free(ifv->ifv_ipackets); + counter_u64_free(ifv->ifv_opackets); + counter_u64_free(ifv->ifv_ibytes); + counter_u64_free(ifv->ifv_obytes); + counter_u64_free(ifv->ifv_omcasts); free(ifv, M_VLAN); ifc_free_unit(ifc, unit); @@ -1099,15 +1117,39 @@ vlan_transmit(struct ifnet *ifp, struct * Send it, precisely as ether_output() would have. */ error = (p->if_transmit)(p, m); - if (!error) { - ifp->if_opackets++; - ifp->if_omcasts += mcast; - ifp->if_obytes += len; + if (error == 0) { + counter_u64_add(ifv->ifv_opackets, 1); + counter_u64_add(ifv->ifv_obytes, len); + counter_u64_add(ifv->ifv_omcasts, 1); } else ifp->if_oerrors++; return (error); } +static uint64_t +vlan_get_counter(struct ifnet *ifp, ifnet_counter cnt) +{ + struct ifvlan *ifv; + + ifv = ifp->if_softc; + + switch (cnt) { + case IFCOUNTER_IPACKETS: + return (counter_u64_fetch(ifv->ifv_ipackets)); + case IFCOUNTER_OPACKETS: + return (counter_u64_fetch(ifv->ifv_opackets)); + case IFCOUNTER_IBYTES: + return (counter_u64_fetch(ifv->ifv_ibytes)); + case IFCOUNTER_OBYTES: + return (counter_u64_fetch(ifv->ifv_obytes)); + case IFCOUNTER_OMCASTS: + return (counter_u64_fetch(ifv->ifv_omcasts)); + default: + return (if_get_counter_compat(ifp, cnt)); + } + /* NOTREACHED */ +} + /* * The ifp->if_qflush entry point for vlan(4) is a no-op. */ @@ -1181,7 +1223,8 @@ vlan_input(struct ifnet *ifp, struct mbu TRUNK_RUNLOCK(trunk); m->m_pkthdr.rcvif = ifv->ifv_ifp; - ifv->ifv_ifp->if_ipackets++; + counter_u64_add(ifv->ifv_ipackets, 1); + counter_u64_add(ifv->ifv_ibytes, m->m_pkthdr.len); /* Pass it back through the parent's input routine. */ (*ifp->if_input)(ifv->ifv_ifp, m);