From owner-svn-src-projects@FreeBSD.ORG Tue Jan 22 18:14:36 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 3DED7CB3; Tue, 22 Jan 2013 18:14:36 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 168EFA80; Tue, 22 Jan 2013 18:14:36 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r0MIEZN7061853; Tue, 22 Jan 2013 18:14:35 GMT (envelope-from glebius@svn.freebsd.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id r0MIEZDU061852; Tue, 22 Jan 2013 18:14:35 GMT (envelope-from glebius@svn.freebsd.org) Message-Id: <201301221814.r0MIEZDU061852@svn.freebsd.org> From: Gleb Smirnoff Date: Tue, 22 Jan 2013 18:14:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r245808 - projects/counters/sys/netinet X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Jan 2013 18:14:36 -0000 Author: glebius Date: Tue Jan 22 18:14:35 2013 New Revision: 245808 URL: http://svnweb.freebsd.org/changeset/base/245808 Log: Instead of initializing/freeing/zeroing members of struct ipstat_p name by name, use a cycle, that relies on that all fields of struct ipstat_p are counter_u64_t, and all fields of struct ipstat are uint64_t. This reduces code bloat significantly, although requires more attention, when editing structures in future. Modified: projects/counters/sys/netinet/ip_input.c Modified: projects/counters/sys/netinet/ip_input.c ============================================================================== --- projects/counters/sys/netinet/ip_input.c Tue Jan 22 18:12:31 2013 (r245807) +++ projects/counters/sys/netinet/ip_input.c Tue Jan 22 18:14:35 2013 (r245808) @@ -214,74 +214,17 @@ static void ip_freef(struct ipqhead *, s VNET_DEFINE(struct ipstat_p, ipstatp); static void -ipstat_zero(void) -{ - counter_u64_zero(V_ipstatp.ips_total); - counter_u64_zero(V_ipstatp.ips_badsum); - counter_u64_zero(V_ipstatp.ips_tooshort); - counter_u64_zero(V_ipstatp.ips_toosmall); - counter_u64_zero(V_ipstatp.ips_badhlen); - counter_u64_zero(V_ipstatp.ips_badlen); - counter_u64_zero(V_ipstatp.ips_fragments); - counter_u64_zero(V_ipstatp.ips_fragdropped); - counter_u64_zero(V_ipstatp.ips_fragtimeout); - counter_u64_zero(V_ipstatp.ips_forward); - counter_u64_zero(V_ipstatp.ips_fastforward); - counter_u64_zero(V_ipstatp.ips_cantforward); - counter_u64_zero(V_ipstatp.ips_redirectsent); - counter_u64_zero(V_ipstatp.ips_noproto); - counter_u64_zero(V_ipstatp.ips_delivered); - counter_u64_zero(V_ipstatp.ips_localout); - counter_u64_zero(V_ipstatp.ips_odropped); - counter_u64_zero(V_ipstatp.ips_reassembled); - counter_u64_zero(V_ipstatp.ips_fragmented); - counter_u64_zero(V_ipstatp.ips_ofragments); - counter_u64_zero(V_ipstatp.ips_cantfrag); - counter_u64_zero(V_ipstatp.ips_badoptions); - counter_u64_zero(V_ipstatp.ips_noroute); - counter_u64_zero(V_ipstatp.ips_badvers); - counter_u64_zero(V_ipstatp.ips_rawout); - counter_u64_zero(V_ipstatp.ips_toolong); - counter_u64_zero(V_ipstatp.ips_notmember); - counter_u64_zero(V_ipstatp.ips_nogif); - counter_u64_zero(V_ipstatp.ips_badaddr); -} - -static void vnet_ipstatp_init(const void *unused) { + counter_u64_t *c; + int i; - V_ipstatp.ips_total = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_badsum = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_tooshort = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_toosmall = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_badhlen = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_badlen = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_fragments = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_fragdropped = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_fragtimeout = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_forward = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_fastforward = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_cantforward = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_redirectsent = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_noproto = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_delivered = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_localout = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_odropped = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_reassembled = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_fragmented = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_ofragments = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_cantfrag = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_badoptions = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_noroute = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_badvers = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_rawout = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_toolong = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_notmember = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_nogif = counter_u64_alloc(M_WAITOK); - V_ipstatp.ips_badaddr = counter_u64_alloc(M_WAITOK); - - ipstat_zero(); + for (i = 0, c = (counter_u64_t *)&V_ipstatp; + i < sizeof(V_ipstatp) / sizeof(counter_u64_t); + i++, c++) { + *c = counter_u64_alloc(M_WAITOK); + counter_u64_zero(*c); + } } VNET_SYSINIT(vnet_ipstatp_init, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY, vnet_ipstatp_init, NULL); @@ -290,36 +233,13 @@ VNET_SYSINIT(vnet_ipstatp_init, SI_SUB_P static void vnet_ipstatp_uninit(const void *unused) { + counter_u64_t *c; + int i; - counter_u64_free(V_ipstatp.ips_total); - counter_u64_free(V_ipstatp.ips_badsum); - counter_u64_free(V_ipstatp.ips_tooshort); - counter_u64_free(V_ipstatp.ips_toosmall); - counter_u64_free(V_ipstatp.ips_badhlen); - counter_u64_free(V_ipstatp.ips_badlen); - counter_u64_free(V_ipstatp.ips_fragments); - counter_u64_free(V_ipstatp.ips_fragdropped); - counter_u64_free(V_ipstatp.ips_fragtimeout); - counter_u64_free(V_ipstatp.ips_forward); - counter_u64_free(V_ipstatp.ips_fastforward); - counter_u64_free(V_ipstatp.ips_cantforward); - counter_u64_free(V_ipstatp.ips_redirectsent); - counter_u64_free(V_ipstatp.ips_noproto); - counter_u64_free(V_ipstatp.ips_delivered); - counter_u64_free(V_ipstatp.ips_localout); - counter_u64_free(V_ipstatp.ips_odropped); - counter_u64_free(V_ipstatp.ips_reassembled); - counter_u64_free(V_ipstatp.ips_fragmented); - counter_u64_free(V_ipstatp.ips_ofragments); - counter_u64_free(V_ipstatp.ips_cantfrag); - counter_u64_free(V_ipstatp.ips_badoptions); - counter_u64_free(V_ipstatp.ips_noroute); - counter_u64_free(V_ipstatp.ips_badvers); - counter_u64_free(V_ipstatp.ips_rawout); - counter_u64_free(V_ipstatp.ips_toolong); - counter_u64_free(V_ipstatp.ips_notmember); - counter_u64_free(V_ipstatp.ips_nogif); - counter_u64_free(V_ipstatp.ips_badaddr); + for (i = 0, c = (counter_u64_t *)&V_ipstatp; + i < sizeof(V_ipstatp) / sizeof(counter_u64_t); + i++, c++) + counter_u64_free(*c); } VNET_SYSUNINIT(vnet_ipstatp_uninit, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY, vnet_ipstatp_uninit, NULL); @@ -329,54 +249,33 @@ static int ipstat_sysctl(SYSCTL_HANDLER_ARGS) { struct ipstat ipstat; + counter_u64_t *c; + uint64_t *v; + int i; - ipstat.ips_total = counter_u64_fetch(V_ipstatp.ips_total); - ipstat.ips_badsum = counter_u64_fetch(V_ipstatp.ips_badsum); - ipstat.ips_tooshort = counter_u64_fetch(V_ipstatp.ips_tooshort); - ipstat.ips_toosmall = counter_u64_fetch(V_ipstatp.ips_toosmall); - ipstat.ips_badhlen = counter_u64_fetch(V_ipstatp.ips_badhlen); - ipstat.ips_badlen = counter_u64_fetch(V_ipstatp.ips_badlen); - ipstat.ips_fragments = counter_u64_fetch(V_ipstatp.ips_fragments); - ipstat.ips_fragdropped = counter_u64_fetch(V_ipstatp.ips_fragdropped); - ipstat.ips_fragtimeout = counter_u64_fetch(V_ipstatp.ips_fragtimeout); - ipstat.ips_forward = counter_u64_fetch(V_ipstatp.ips_forward); - ipstat.ips_fastforward = counter_u64_fetch(V_ipstatp.ips_fastforward); - ipstat.ips_cantforward = counter_u64_fetch(V_ipstatp.ips_cantforward); - ipstat.ips_redirectsent = counter_u64_fetch(V_ipstatp.ips_redirectsent); - ipstat.ips_noproto = counter_u64_fetch(V_ipstatp.ips_noproto); - ipstat.ips_delivered = counter_u64_fetch(V_ipstatp.ips_delivered); - ipstat.ips_localout = counter_u64_fetch(V_ipstatp.ips_localout); - ipstat.ips_odropped = counter_u64_fetch(V_ipstatp.ips_odropped); - ipstat.ips_reassembled = counter_u64_fetch(V_ipstatp.ips_reassembled); - ipstat.ips_fragmented = counter_u64_fetch(V_ipstatp.ips_fragmented); - ipstat.ips_ofragments = counter_u64_fetch(V_ipstatp.ips_ofragments); - ipstat.ips_cantfrag = counter_u64_fetch(V_ipstatp.ips_cantfrag); - ipstat.ips_badoptions = counter_u64_fetch(V_ipstatp.ips_badoptions); - ipstat.ips_noroute = counter_u64_fetch(V_ipstatp.ips_noroute); - ipstat.ips_badvers = counter_u64_fetch(V_ipstatp.ips_badvers); - ipstat.ips_rawout = counter_u64_fetch(V_ipstatp.ips_rawout); - ipstat.ips_toolong = counter_u64_fetch(V_ipstatp.ips_toolong); - ipstat.ips_notmember = counter_u64_fetch(V_ipstatp.ips_notmember); - ipstat.ips_nogif = counter_u64_fetch(V_ipstatp.ips_nogif); - ipstat.ips_badaddr = counter_u64_fetch(V_ipstatp.ips_badaddr); - - /* - * Old interface allowed to rewrite 'struct ipstat', and netstat(1) - * used it to zero the structure. To keep compatibility with old - * netstat(1) we will zero out statistics on every write attempt, - * however we no longer support writing arbitrary fake values to - * the statistics. - */ - if (req->newptr) - ipstat_zero(); + for (i = 0, c = (counter_u64_t *)&V_ipstatp, v = (uint64_t *)&ipstat; + i < sizeof(V_ipstatp) / sizeof(counter_u64_t); + i++, c++, v++) { + *v = counter_u64_fetch(*c); + /* + * Old interface allowed to rewrite 'struct ipstat', and + * netstat(1) used it to zero the structure. To keep + * compatibility with old netstat(1) we will zero out + * statistics on every write attempt, however we no longer + * support writing arbitrary fake values to the statistics. + */ + if (req->newptr) + counter_u64_zero(*c); + } return (SYSCTL_OUT(req, &ipstat, sizeof(ipstat))); } - SYSCTL_VNET_PROC(_net_inet_ip, IPCTL_STATS, stats, CTLTYPE_OPAQUE | CTLFLAG_RW, NULL, 0, ipstat_sysctl, "I", "IP statistics (struct ipstat, netinet/ip_var.h)"); + /* + * XXXGL! * Kernel module interface for updating ipstat. The argument is an index * into ipstat treated as an array of u_long. While this encodes the general * layout of ipstat into the caller, it doesn't encode its location, so that