aboutsummaryrefslogtreecommitdiffstats
path: root/net-mgmt
diff options
context:
space:
mode:
authorvsevolod <vsevolod@FreeBSD.org>2013-09-13 23:16:52 +0800
committervsevolod <vsevolod@FreeBSD.org>2013-09-13 23:16:52 +0800
commitd905a4a59654b908cb6e4d0e730c3765ffdafe69 (patch)
tree655cd00cb0f0235015e46c0c64d21386af34df43 /net-mgmt
parent5513820a5b2ddf2f0677f46974489efe644676da (diff)
downloadfreebsd-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/Makefile9
-rw-r--r--net-mgmt/ng_ipacct/files/patch-ng_ipacct.c50
-rw-r--r--net-mgmt/ng_ipacct/files/patch-ng_ipacct_hash.h134
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;