[patch] changed state allocations to use UMA

Christian S.J. Peron csjp at FreeBSD.org
Sun Jan 2 03:28:16 GMT 2005


I have generated a patch which changes the state allocation in IPFW
from malloc(9) to uma_zcreate(9).

This should minimize memory wastage associated with firewall
states and improve the performance of state creation, destruction
and in lookups.

Anyone have any problems with this patch being committed?

http://people.freebsd.org/~csjp/ip_fw2.c.uma_zone.1104636041.diff

Index: ip_fw2.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_fw2.c,v
retrieving revision 1.85
diff -u -r1.85 ip_fw2.c
--- ip_fw2.c	10 Dec 2004 02:17:18 -0000	1.85
+++ ip_fw2.c	2 Jan 2005 03:21:04 -0000
@@ -101,6 +101,7 @@
 static int verbose_limit;
 
 static struct callout ipfw_timeout;
+static uma_zone_t ipfw_dyn_rule_zone;
 #define	IPFW_DEFAULT_RULE	65535
 
 /*
@@ -782,7 +783,7 @@
 	else								\
 		head = q = q->next;					\
 	dyn_count--;							\
-	free(old_q, M_IPFW); }
+	uma_zfree(ipfw_dyn_rule_zone, old_q); }
 
 #define TIME_LEQ(a,b)       ((int)((a)-(b)) <= 0)
 
@@ -1058,7 +1059,7 @@
 	}
 	i = hash_packet(id);
 
-	r = malloc(sizeof *r, M_IPFW, M_NOWAIT | M_ZERO);
+	r = uma_zalloc(ipfw_dyn_rule_zone, M_NOWAIT | M_ZERO);
 	if (r == NULL) {
 		printf ("ipfw: sorry cannot allocate state\n");
 		return NULL;
@@ -3504,6 +3505,9 @@
 	layer3_chain.busy_count = 0;
 	cv_init(&layer3_chain.cv, "Condition variable for IPFW rw locks");
 	IPFW_LOCK_INIT(&layer3_chain);
+	ipfw_dyn_rule_zone = uma_zcreate("IPFW dynamic rule zone",
+	    sizeof(ipfw_dyn_rule), NULL, NULL, NULL, NULL,
+	    UMA_ALIGN_PTR, 0);
 	IPFW_DYN_LOCK_INIT();
 	callout_init(&ipfw_timeout, debug_mpsafenet ? CALLOUT_MPSAFE : 0);
 
@@ -3585,6 +3589,7 @@
 		reap_rules(reap);
 	flush_tables();
 	IPFW_DYN_LOCK_DESTROY();
+	uma_zdestroy(ipfw_dyn_rule_zone);
 	IPFW_LOCK_DESTROY(&layer3_chain);
 	printf("IP firewall unloaded\n");
 }

-- 
Christian S.J. Peron
csjp at FreeBSD.ORG
FreeBSD Committer


More information about the freebsd-ipfw mailing list