svn commit: r237783 - projects/pf/head/sys/contrib/pf/net

Gleb Smirnoff glebius at FreeBSD.org
Fri Jun 29 14:39:04 UTC 2012


Author: glebius
Date: Fri Jun 29 14:39:04 2012
New Revision: 237783
URL: http://svn.freebsd.org/changeset/base/237783

Log:
  - Make hash sizes configurable via loader tunables.
  - Reduce default size to a more conservative
    value of 32768.

Modified:
  projects/pf/head/sys/contrib/pf/net/pf.c
  projects/pf/head/sys/contrib/pf/net/pfvar.h

Modified: projects/pf/head/sys/contrib/pf/net/pf.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf.c	Fri Jun 29 14:33:00 2012	(r237782)
+++ projects/pf/head/sys/contrib/pf/net/pf.c	Fri Jun 29 14:39:04 2012	(r237783)
@@ -375,13 +375,24 @@ VNET_DEFINE(struct pf_limit, pf_limits[P
 	} while (0)
 
 static MALLOC_DEFINE(M_PFHASH, "pf_hash", "pf(4) hash header structures");
-/* XXXGL: make static? */
 VNET_DEFINE(struct pf_keyhash *, pf_keyhash);
 VNET_DEFINE(struct pf_idhash *, pf_idhash);
 VNET_DEFINE(u_long, pf_hashmask);
 VNET_DEFINE(struct pf_srchash *, pf_srchash);
 VNET_DEFINE(u_long, pf_srchashmask);
 
+SYSCTL_NODE(_net, OID_AUTO, pf, CTLFLAG_RW, 0, "pf(4)");
+
+VNET_DEFINE(u_long, pf_hashsize);
+#define	V_pf_hashsize	VNET(pf_hashsize)
+SYSCTL_VNET_UINT(_net_pf, OID_AUTO, states_hashsize, CTLFLAG_RDTUN,
+    &VNET_NAME(pf_hashsize), 0, "Size of pf(4) states hashtable");
+
+VNET_DEFINE(u_long, pf_srchashsize);
+#define	V_pf_srchashsize	VNET(pf_srchashsize)
+SYSCTL_VNET_UINT(_net_pf, OID_AUTO, source_nodes_hashsize, CTLFLAG_RDTUN,
+    &VNET_NAME(pf_srchashsize), 0, "Size of pf(4) source nodes hashtable");
+
 VNET_DEFINE(void *, pf_swi_cookie);
 
 /*
@@ -715,6 +726,13 @@ pf_initialize()
 	struct pf_srchash	*sh;
 	u_int i;
 
+	TUNABLE_ULONG_FETCH("net.pf.states_hashsize", &V_pf_hashsize);
+	if (V_pf_hashsize == 0 || !powerof2(V_pf_hashsize))
+		V_pf_hashsize = PF_HASHSIZ;
+	TUNABLE_ULONG_FETCH("net.pf.source_nodes_hashsize", &V_pf_srchashsize);
+	if (V_pf_srchashsize == 0 || !powerof2(V_pf_srchashsize))
+		V_pf_srchashsize = PF_HASHSIZ / 4;
+
 	/* States and state keys storage. */
 	V_pf_state_z = uma_zcreate("pf states", sizeof(struct pf_state),
 	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
@@ -724,11 +742,11 @@ pf_initialize()
 	V_pf_state_key_z = uma_zcreate("pf state keys",
 	    sizeof(struct pf_state_key), NULL, NULL, pf_state_key_ini, NULL,
 	    UMA_ALIGN_PTR, 0);
-	V_pf_keyhash = malloc(PF_HASHSIZ * sizeof(struct pf_keyhash), M_PFHASH,
-	    M_WAITOK|M_ZERO);
-	V_pf_idhash = malloc(PF_HASHSIZ * sizeof(struct pf_idhash), M_PFHASH,
-	    M_WAITOK|M_ZERO);
-	V_pf_hashmask = PF_HASHSIZ - 1;
+	V_pf_keyhash = malloc(V_pf_hashsize * sizeof(struct pf_keyhash),
+	    M_PFHASH, M_WAITOK | M_ZERO);
+	V_pf_idhash = malloc(V_pf_hashsize * sizeof(struct pf_idhash),
+	    M_PFHASH, M_WAITOK | M_ZERO);
+	V_pf_hashmask = V_pf_hashsize - 1;
 	for (i = 0, kh = V_pf_keyhash, ih = V_pf_idhash; i <= V_pf_hashmask;
 	    i++, kh++, ih++) {
 		mtx_init(&kh->lock, "pf_keyhash", NULL, MTX_DEF);
@@ -741,9 +759,9 @@ pf_initialize()
 	    0);
 	V_pf_limits[PF_LIMIT_SRC_NODES].zone = V_pf_sources_z;
 	uma_zone_set_max(V_pf_sources_z, PFSNODE_HIWAT);
-	V_pf_srchash = malloc((PF_HASHSIZ / 4) * sizeof(struct pf_srchash),
+	V_pf_srchash = malloc(V_pf_srchashsize * sizeof(struct pf_srchash),
 	  M_PFHASH, M_WAITOK|M_ZERO);
-	V_pf_srchashmask = (PF_HASHSIZ / 4) - 1;
+	V_pf_srchashmask = V_pf_srchashsize - 1;
 	for (i = 0, sh = V_pf_srchash; i <= V_pf_srchashmask; i++, sh++)
 		mtx_init(&sh->lock, "pf_srchash", NULL, MTX_DEF);
 

Modified: projects/pf/head/sys/contrib/pf/net/pfvar.h
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pfvar.h	Fri Jun 29 14:33:00 2012	(r237782)
+++ projects/pf/head/sys/contrib/pf/net/pfvar.h	Fri Jun 29 14:39:04 2012	(r237783)
@@ -1672,7 +1672,7 @@ struct pf_idhash {
 	struct mtx			lock;
 };
 
-#define	PF_HASHSIZ	(262144)	/* now 2^18 XXXGL: grow? */
+#define	PF_HASHSIZ	(32768)
 VNET_DECLARE(struct pf_keyhash *, pf_keyhash);
 VNET_DECLARE(struct pf_idhash *, pf_idhash);
 VNET_DECLARE(u_long, pf_hashmask);


More information about the svn-src-projects mailing list