From owner-svn-ports-head@FreeBSD.ORG Fri Sep 13 15:16:53 2013 Return-Path: Delivered-To: svn-ports-head@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 ESMTP id 892ED7C9; Fri, 13 Sep 2013 15:16:53 +0000 (UTC) (envelope-from vsevolod@FreeBSD.org) 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)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 754A328BF; Fri, 13 Sep 2013 15:16:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r8DFGr3f060640; Fri, 13 Sep 2013 15:16:53 GMT (envelope-from vsevolod@svn.freebsd.org) Received: (from vsevolod@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r8DFGqu0060637; Fri, 13 Sep 2013 15:16:52 GMT (envelope-from vsevolod@svn.freebsd.org) Message-Id: <201309131516.r8DFGqu0060637@svn.freebsd.org> From: Vsevolod Stakhov Date: Fri, 13 Sep 2013 15:16:52 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r327158 - in head/net-mgmt/ng_ipacct: . files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Sep 2013 15:16:53 -0000 Author: vsevolod Date: Fri Sep 13 15:16:52 2013 New Revision: 327158 URL: http://svnweb.freebsd.org/changeset/ports/327158 Log: * Improve locking for ipacct hash table by converting from a global mutex to a set of fine-grained rmlocks per hash buckets. * Increase hash buckets from 256 to 512. * Remove obsoleted master site and added local one. * Stylefix for the ignore message. * Bump portrevision. * Take ownership. Added: head/net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h (contents, props changed) Modified: head/net-mgmt/ng_ipacct/Makefile head/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c Modified: head/net-mgmt/ng_ipacct/Makefile ============================================================================== --- head/net-mgmt/ng_ipacct/Makefile Fri Sep 13 15:10:58 2013 (r327157) +++ head/net-mgmt/ng_ipacct/Makefile Fri Sep 13 15:16:52 2013 (r327158) @@ -3,17 +3,18 @@ PORTNAME= ng_ipacct PORTVERSION= 20061223 +PORTREVISION= 1 CATEGORIES= net-mgmt kld MASTER_SITES= ${MASTER_SITE_LOCAL:S!$!skv/!} \ - ftp://ftp.wuppy.net.ru/pub/FreeBSD/local/kernel/ng_ipacct/ + http://highsecure.ru/distfiles/ -MAINTAINER= ports@FreeBSD.org +MAINTAINER= vsevolod@FreeBSD.org COMMENT= Netgraph IP accounting .ifndef PACKAGE_BUILDING -NO_PACKAGE= Depends on kernel +NO_PACKAGE= depends on kernel .else -IGNORE= Depends on kernel +IGNORE= depends on kernel .endif KMODDIR= /boot/modules Modified: head/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c ============================================================================== --- head/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c Fri Sep 13 15:10:58 2013 (r327157) +++ head/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c Fri Sep 13 15:16:52 2013 (r327158) @@ -1,6 +1,50 @@ ---- ng_ipacct/ng_ipacct.c.orig 2008-09-28 17:37:23.000000000 +0000 -+++ ng_ipacct/ng_ipacct.c 2008-09-28 17:39:37.000000000 +0000 -@@ -902,7 +902,11 @@ +--- ng_ipacct/ng_ipacct.c.orig 2006-12-05 23:46:04.000000000 +0300 ++++ ng_ipacct/ng_ipacct.c 2013-08-13 16:21:16.000000000 +0400 +@@ -140,9 +140,6 @@ + struct ipacct_hook { + hook_p hook; + node_p node; +-#if __FreeBSD_version >= 503000 +- struct mtx h_mtx; /* protects hook data */ +-#endif + struct ip_acct_hash *active; /* active database */ + struct ip_acct_hash *checked; /* checkpointed database */ + struct ng_ipacct_hinfo hi; /* hook info */ +@@ -242,9 +239,6 @@ + + if (!strncmp(name + strlen(name) - 3, "_in", 3)) + hip->hi.hi_flags |= HI_INCOMING_HOOK; +-#if __FreeBSD_version >= 503000 +- mtx_init(&hip->h_mtx, "ng_ipacct hash", NULL, MTX_DEF); +-#endif + NG_HOOK_SET_PRIVATE(hook, hip); + hip->hi.hi_debug = 0; + #ifdef VERBOSE +@@ -531,13 +525,7 @@ + if (!error) { + Dbg_print(DBG_DLT, ("IP packet, m_pkthdr.len = %d, m_len = %d\n", + m->m_pkthdr.len, m->m_len)); +-#if __FreeBSD_version >= 503000 +- mtx_lock(&hip->h_mtx); +-#endif + error = ip_account_add(hip, &m); +-#if __FreeBSD_version >= 503000 +- mtx_unlock(&hip->h_mtx); +-#endif + } + + #if __FreeBSD_version >= 503000 +@@ -581,9 +569,6 @@ + + ip_account_stop(hip); + NG_HOOK_SET_PRIVATE(hook, NULL); +-#if __FreeBSD_version >= 503000 +- mtx_destroy(&hip->h_mtx); +-#endif + FREE(hip, M_NETGRAPH); + #ifdef VERBOSE + printf("NG_ipacct: disconnect hook %s\n", NG_HOOK_NAME(hook)); +@@ -902,7 +899,11 @@ int i; for (i = 0, ina = r->r_dst, port = r->r_dport; i < 2; i++) { Added: head/net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h Fri Sep 13 15:16:52 2013 (r327158) @@ -0,0 +1,134 @@ +--- ng_ipacct/ng_ipacct_hash.h.orig 2004-11-27 23:35:19.000000000 +0300 ++++ ng_ipacct/ng_ipacct_hash.h 2013-08-13 20:50:07.000000000 +0400 +@@ -26,7 +26,10 @@ + * $Id: ng_ipacct_hash.h,v 1.6 2004/11/27 20:35:19 romanp Exp $ + */ + +-#define NBUCKETS (256) /* must be power of 2 */ ++#define NBUCKETS (512) /* must be power of 2 */ ++ ++#include ++#include + + #define NG_IPACCT_HASH3(faddr, fport, lport)\ + ((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) +@@ -34,6 +37,7 @@ + ((faddr ^ (faddr >> 23) ^ (faddr >> 17))) + + struct ip_acct_hash { ++ struct rmlock bl; + SLIST_HEAD( ,ip_acct_chunk) head; + }; + +@@ -42,12 +46,20 @@ + static __inline int + ip_hash_init(struct ip_acct_hash **h) + { ++ int i; ++ struct ip_acct_hash *ph; ++ + MALLOC(*h, struct ip_acct_hash *, + NBUCKETS * sizeof(struct ip_acct_hash), + M_NETGRAPH, M_NOWAIT | M_ZERO); + if (*h == NULL) + return (ENOMEM); + ++ ph = *h; ++ for (i = 0; i < NBUCKETS; i ++) { ++ rm_init(&ph[i].bl, "ng_ipacct hash lock"); ++ } ++ + return (0); + } + +@@ -59,15 +71,18 @@ + struct ip_acct_chunk *pe, *lastpe; + struct ip_acct_record *pr; + int i; ++ struct rm_priotracker track; + #ifdef HASH_DEBUG + int nchunk = 0; + #endif + + pe = lastpe = NULL; ++ rm_rlock(&h[slot].bl, &track); + SLIST_FOREACH(pe, &(h[slot].head), next) { + lastpe = pe; + for (i = 0; i < pe->nrecs; i++) { + if(bcmp(s, &pe->recs[i].s, sizeof(struct ip_acct_stream)) == 0) { ++ rm_runlock(&h[slot].bl, &track); + return (&pe->recs[i]); + } + } +@@ -75,12 +90,29 @@ + nchunk ++; + #endif + } ++ rm_runlock(&h[slot].bl, &track); + #ifdef HASH_DEBUG + if (nchunk) + nchunk --; + #endif + /* stream is not in hash. Add it if we allowed to do so. */ + if (ok_to_insert) { ++ ++ rm_wlock(&h[slot].bl); ++ if (lastpe != NULL && SLIST_NEXT(lastpe, next) != NULL) { ++ /* It has been changed, need to scan again */ ++ pe = lastpe; ++ while (pe != NULL) { ++ lastpe = pe; ++ for (i = 0; i < pe->nrecs; i++) { ++ if(bcmp(s, &pe->recs[i].s, sizeof(struct ip_acct_stream)) == 0) { ++ rm_wunlock(&h[slot].bl); ++ return (&pe->recs[i]); ++ } ++ } ++ pe = SLIST_NEXT(pe, next); ++ } ++ } + /* + * This is first chunk in slot or no + * more space left in current chunk ? +@@ -92,8 +124,10 @@ + sizeof(*pe)); + #endif + /* allocate new accounting chunk */ +- if ((pe = HASH_ALLOC()) == NULL) ++ if ((pe = HASH_ALLOC()) == NULL) { ++ rm_wunlock(&h[slot].bl); + return (NULL); ++ } + if (lastpe == NULL) + SLIST_INSERT_HEAD(&(h[slot].head), pe, next); + else +@@ -109,6 +143,7 @@ + pr->when = time_second; + bcopy(s, &pr->s, sizeof(pr->s)); + (*nrecs) ++; ++ rm_wunlock(&h[slot].bl); + return (pr); + } else { + return (NULL); +@@ -120,6 +155,7 @@ + { + int i; + struct ip_acct_chunk *ipe, *nxt; ++ struct ip_acct_hash *ph = *h; + + /* sanity check */ + if (*h == NULL) +@@ -127,10 +163,13 @@ + + /* walk down through *next and free all memory */ + for(i = 0; i < NBUCKETS; i++) { ++ rm_wlock(&ph[i].bl); + for(ipe = SLIST_FIRST(&((*h)[i].head)); ipe; ipe = nxt) { + nxt = SLIST_NEXT(ipe, next); + HASH_FREE(ipe); + } ++ rm_wunlock(&ph[i].bl); ++ rm_destroy(&ph[i].bl); + } + FREE(*h, M_NETGRAPH); + *h = NULL;