diff options
author | vsevolod <vsevolod@FreeBSD.org> | 2013-09-13 23:16:52 +0800 |
---|---|---|
committer | vsevolod <vsevolod@FreeBSD.org> | 2013-09-13 23:16:52 +0800 |
commit | d905a4a59654b908cb6e4d0e730c3765ffdafe69 (patch) | |
tree | 655cd00cb0f0235015e46c0c64d21386af34df43 /net-mgmt | |
parent | 5513820a5b2ddf2f0677f46974489efe644676da (diff) | |
download | freebsd-ports-graphics-d905a4a59654b908cb6e4d0e730c3765ffdafe69.tar.gz freebsd-ports-graphics-d905a4a59654b908cb6e4d0e730c3765ffdafe69.tar.zst freebsd-ports-graphics-d905a4a59654b908cb6e4d0e730c3765ffdafe69.zip |
* 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.
Diffstat (limited to 'net-mgmt')
-rw-r--r-- | net-mgmt/ng_ipacct/Makefile | 9 | ||||
-rw-r--r-- | net-mgmt/ng_ipacct/files/patch-ng_ipacct.c | 50 | ||||
-rw-r--r-- | net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h | 134 |
3 files changed, 186 insertions, 7 deletions
diff --git a/net-mgmt/ng_ipacct/Makefile b/net-mgmt/ng_ipacct/Makefile index 01ddcf5d464..d10e4095c97 100644 --- a/net-mgmt/ng_ipacct/Makefile +++ b/net-mgmt/ng_ipacct/Makefile @@ -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 diff --git a/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c b/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c index d90052aa323..93b4e3db4fd 100644 --- a/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c +++ b/net-mgmt/ng_ipacct/files/patch-ng_ipacct.c @@ -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++) { diff --git a/net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h b/net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h new file mode 100644 index 00000000000..d517e4fa18b --- /dev/null +++ b/net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h @@ -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 <sys/lock.h> ++#include <sys/rmlock.h> + + #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; |