svn commit: r203661 - in projects/tcp_cc_head/sys: modules/ertt netinet

Lawrence Stewart lstewart at FreeBSD.org
Mon Feb 8 14:04:33 UTC 2010


Author: lstewart
Date: Mon Feb  8 14:04:32 2010
New Revision: 203661
URL: http://svn.freebsd.org/changeset/base/203661

Log:
  - Switch to using UMA for helper data block memory management.
  - Add concept of helpers belonging to one or more classes so that we can
    eventually group related helpers.
  - Lots of bug fixing and cleanup around the place.

Added:
  projects/tcp_cc_head/sys/netinet/h_ertt.c
     - copied, changed from r203640, projects/tcp_cc_head/sys/netinet/ertt.c
Deleted:
  projects/tcp_cc_head/sys/netinet/ertt.c
Modified:
  projects/tcp_cc_head/sys/modules/ertt/Makefile
  projects/tcp_cc_head/sys/netinet/helper.c
  projects/tcp_cc_head/sys/netinet/helper.h
  projects/tcp_cc_head/sys/netinet/helper_module.h
  projects/tcp_cc_head/sys/netinet/hhooks.c

Modified: projects/tcp_cc_head/sys/modules/ertt/Makefile
==============================================================================
--- projects/tcp_cc_head/sys/modules/ertt/Makefile	Mon Feb  8 10:02:01 2010	(r203660)
+++ projects/tcp_cc_head/sys/modules/ertt/Makefile	Mon Feb  8 14:04:32 2010	(r203661)
@@ -3,8 +3,8 @@
 .include <bsd.own.mk>
 
 .PATH:  ${.CURDIR}/../../netinet
-KMOD=hlpr_ertt
-SRCS=ertt.c
+KMOD=h_ertt
+SRCS=h_ertt.c
 
 .include <bsd.kmod.mk> 
 

Copied and modified: projects/tcp_cc_head/sys/netinet/h_ertt.c (from r203640, projects/tcp_cc_head/sys/netinet/ertt.c)
==============================================================================
--- projects/tcp_cc_head/sys/netinet/ertt.c	Sun Feb  7 22:24:04 2010	(r203640, copy source)
+++ projects/tcp_cc_head/sys/netinet/h_ertt.c	Mon Feb  8 14:04:32 2010	(r203661)
@@ -55,8 +55,8 @@ __FBSDID("$FreeBSD$");
 void ertt_tcpest_hook(void *udata, void *ctx_data, void *dblock);
 int ertt_mod_init(void);
 int ertt_mod_destroy(void);
-int ertt_block_init(void **block);
-int ertt_block_destroy(void *block);
+int ertt_uma_ctor(void *mem, int size, void *arg, int flags);
+void ertt_uma_dtor(void *mem, int size, void *arg);
 
 struct ertt {
 	int test;
@@ -65,9 +65,8 @@ struct ertt {
 struct helper ertt_helper = {
 	.mod_init = ertt_mod_init,
 	.mod_destroy = ertt_mod_destroy,
-	.block_init = ertt_block_init,
-	.block_destroy = ertt_block_destroy,
-	.flags = HELPER_NEEDS_DBLOCK
+	.flags = HELPER_NEEDS_DBLOCK,
+	.class = HELPER_CLASS_TCP
 };
 
 
@@ -96,25 +95,19 @@ ertt_mod_destroy(void)
 }
 
 int
-ertt_block_init(void **block)
+ertt_uma_ctor(void *mem, int size, void *arg, int flags)
 {
-	*block = malloc(sizeof(struct ertt), M_HELPER, M_NOWAIT);
+	printf("Creating ertt block %p\n", mem);
 
-	((struct ertt *)*block)->test = 5;
-
-	printf("Malloced %ld bytes for ertt and set the value to %d\n",
-	sizeof(struct ertt), ((struct ertt *)*block)->test);
+	((struct ertt *)mem)->test = 5;
 
 	return (0);
 }
 
-int
-ertt_block_destroy(void *block)
+void
+ertt_uma_dtor(void *mem, int size, void *arg)
 {
-	KASSERT(block != NULL, ("Block is NULL!"));
-	free(block, M_HELPER);
-
-	return (0);
+	printf("Destroying ertt block %p\n", mem);
 }
 
-DECLARE_HELPER(ertt, &ertt_helper);
+DECLARE_HELPER_UMA(ertt, &ertt_helper, sizeof(struct ertt), ertt_uma_ctor, ertt_uma_dtor);

Modified: projects/tcp_cc_head/sys/netinet/helper.c
==============================================================================
--- projects/tcp_cc_head/sys/netinet/helper.c	Mon Feb  8 10:02:01 2010	(r203660)
+++ projects/tcp_cc_head/sys/netinet/helper.c	Mon Feb  8 14:04:32 2010	(r203661)
@@ -40,6 +40,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/rwlock.h>
 #include <sys/systm.h>
 
+#include <vm/uma.h>
+
 #include <netinet/helper.h>
 #include <netinet/helper_module.h>
 
@@ -78,16 +80,23 @@ init_helper_dblocks(struct helper_dblock
 	if (*dblocks != NULL) {
 		printf("Malloced ptr %p for %d data blocks\n", *dblocks, num_dblocks);
 		STAILQ_FOREACH(h, &helpers, h_next) {
-			if (h->block_init != NULL) {
+			if (h->flags & HELPER_NEEDS_DBLOCK) {
 				dblock = dblocks[i];
-				h->block_init(&dblock->block);
+				dblock->block = uma_zalloc(h->zone, M_NOWAIT);
+				/*
+				if (dblock[i]->block == NULL) {
+					XXX: Free all previous dblocks.
+					error = ENOMEM
+					break;
+				}
+				*/
 				dblock->id = h->id;
 				printf("dblock[%d]: id=%d, block=%p\n", i,
 				dblock->id, dblock->block);
+				i++;
 			}
-			i++;
 		}
-		*nblocks = num_dblocks;
+		*nblocks = i;
 	} else
 		error = ENOMEM;
 
@@ -96,26 +105,26 @@ init_helper_dblocks(struct helper_dblock
 }
 
 int
-destroy_helper_dblocks(struct helper_dblock *array_head, int nblocks)
+destroy_helper_dblocks(struct helper_dblock *dblocks, int nblocks)
 {
 	struct helper *h;
 
 	HELPER_LIST_WLOCK();
 
 	for (nblocks--; nblocks >= 0; nblocks--) {
-		h = get_helper(array_head[nblocks].id);
-		if (h->block_destroy != NULL)
-			h->block_destroy(array_head[nblocks].block);
+		h = get_helper(dblocks[nblocks].id);
+		uma_zfree(h->zone, dblocks[nblocks].block);
 	}
 
 	HELPER_LIST_WUNLOCK();
+	free(dblocks, M_HELPER);
 	return (0);
 }
 
 int
 register_helper(struct helper *h)
 {
-	printf("Register helper 0x%p\n", h);
+	printf("Register helper %p\n", h);
 
 	HELPER_LIST_WLOCK();
 
@@ -123,26 +132,27 @@ register_helper(struct helper *h)
 		num_dblocks++;
 
 	h->id = helper_id++;
-
 	STAILQ_INSERT_TAIL(&helpers, h, h_next);
-
 	HELPER_LIST_WUNLOCK();
-
 	return (0);
 }
 
 int
 deregister_helper(struct helper *h)
 {
-	printf("Deregister helper 0x%p\n", h);
+	printf("Deregister helper %p\n", h);
+
+	/*
+	HHOOK_WLOCK
+	Remove this helper's hooks
+	HHOOK_WUNLOCK
+	*/
 
 	HELPER_LIST_WLOCK();
 	STAILQ_REMOVE(&helpers, h, helper, h_next);
-	num_dblocks--;
+	if (h->flags | HELPER_NEEDS_DBLOCK)
+		num_dblocks--;
 	HELPER_LIST_WUNLOCK();
-
-	/* Block unload if there are still consumers to avoid mem leak*/
-
 	return (0);
 }
 
@@ -167,23 +177,38 @@ get_helper(int id)
  * Handles kld related events. Returns 0 on success, non-zero on failure.
  */
 int
-hlpr_modevent(module_t mod, int event_type, void *data)
+helper_modevent(module_t mod, int event_type, void *data)
 {
 	int error = 0;
-	struct helper *h = (struct helper *)data;
+	struct helper_modevent_data *hmd = (struct helper_modevent_data *)data;
 
 	switch(event_type) {
 		case MOD_LOAD:
-			if (h->mod_init != NULL)
-				error = h->mod_init();
+			if (hmd->helper->flags & HELPER_NEEDS_DBLOCK) {
+				if (hmd->uma_zsize <= 0) {
+					printf("Use DECLARE_HELPER_UMA() instead!\n");
+					error = EDOOFUS;
+					break;
+				}
+				hmd->helper->zone = uma_zcreate(hmd->name,
+				    hmd->uma_zsize, hmd->umactor, hmd->umadtor,
+				    NULL, NULL, 0, 0);
+				if (hmd->helper->zone == NULL) {
+					error = ENOMEM;
+					break;
+				}
+			}
+			if (hmd->helper->mod_init != NULL)
+				error = hmd->helper->mod_init();
 			if (!error)
-				error = register_helper(h);
+				error = register_helper(hmd->helper);
 			break;
 
 		case MOD_QUIESCE:
-			error = deregister_helper(h);
-			if (!error && h->mod_destroy != NULL)
-				h->mod_destroy();
+			error = deregister_helper(hmd->helper);
+			uma_zdestroy(hmd->helper->zone);
+			if (!error && hmd->helper->mod_destroy != NULL)
+				hmd->helper->mod_destroy();
 			break;
 
 		case MOD_SHUTDOWN:

Modified: projects/tcp_cc_head/sys/netinet/helper.h
==============================================================================
--- projects/tcp_cc_head/sys/netinet/helper.h	Mon Feb  8 10:02:01 2010	(r203660)
+++ projects/tcp_cc_head/sys/netinet/helper.h	Mon Feb  8 14:04:32 2010	(r203661)
@@ -48,10 +48,10 @@ struct helper {
 	/* Cleanup global module state on kldunload. */
 	int (*mod_destroy) (void);
 
-	int (*block_init) (void **data);
-	int (*block_destroy) (void *data);
-
 	uint16_t	flags;
+	uint32_t	class;
+
+	uma_zone_t	zone;
 
 	//STAILQ hooks; /* which hooks does this helper want to be called from */
 	unsigned int id; /* ID assigned by system to this hlpr's data in the
@@ -64,6 +64,8 @@ struct helper {
 /* Helper flags */
 #define HELPER_NEEDS_DBLOCK	0x0001
 
+/* Helper classes */
+#define HELPER_CLASS_TCP	0x00000001
 
 int	init_helper_dblocks(struct helper_dblock **dblocks, int *nblocks);
 int	destroy_helper_dblocks(struct helper_dblock *array_head, int nblocks);

Modified: projects/tcp_cc_head/sys/netinet/helper_module.h
==============================================================================
--- projects/tcp_cc_head/sys/netinet/helper_module.h	Mon Feb  8 10:02:01 2010	(r203660)
+++ projects/tcp_cc_head/sys/netinet/helper_module.h	Mon Feb  8 14:04:32 2010	(r203661)
@@ -30,22 +30,50 @@
  * $FreeBSD$
  */
 
-#ifndef _NETINET_TCP_HELPER_MODULE_H_
-#define _NETINET_TCP_HELPER_MODULE_H_
+#ifndef _NETINET_HELPER_MODULE_H_
+#define _NETINET_HELPER_MODULE_H_
 
-#define	DECLARE_HELPER(hlprname, hlpr_data) 				\
-	static moduledata_t hlpr_##hlprname = {				\
-		#hlprname,						\
-		hlpr_modevent,						\
-		hlpr_data						\
+struct helper_modevent_data {
+	char *name;
+	struct helper *helper;
+	int uma_zsize;
+	uma_ctor umactor;
+	uma_dtor umadtor;
+};
+
+#define	DECLARE_HELPER(hname, hdata) 					\
+	static struct helper_modevent_data hmd_##hname = {		\
+		.name = #hname,						\
+		.helper = hdata						\
 	};								\
-	DECLARE_MODULE(hlprname, hlpr_##hlprname, SI_SUB_PROTO_IFATTACHDOMAIN, \
+	static moduledata_t h_##hname = {				\
+		.name = #hname,						\
+		.evhand = helper_modevent,				\
+		.priv = &hmd_##hname					\
+	};								\
+	DECLARE_MODULE(hname, h_##hname, SI_SUB_PROTO_IFATTACHDOMAIN, \
+	    SI_ORDER_ANY)
+
+#define	DECLARE_HELPER_UMA(hname, hdata, size, ctor, dtor)		\
+	static struct helper_modevent_data hmd_##hname = {		\
+		.name = #hname,						\
+		.helper = hdata,					\
+		.uma_zsize = size,					\
+		.umactor = ctor,					\
+		.umadtor = dtor						\
+	};								\
+	static moduledata_t h_##hname = {				\
+		.name = #hname,						\
+		.evhand = helper_modevent,				\
+		.priv = &hmd_##hname					\
+	};								\
+	DECLARE_MODULE(hname, h_##hname, SI_SUB_PROTO_IFATTACHDOMAIN, \
 	    SI_ORDER_ANY)
 
-int	hlpr_modevent(module_t mod, int type, void *data);
+int	helper_modevent(module_t mod, int type, void *data);
 
 MALLOC_DECLARE(M_HELPER);
 MALLOC_DEFINE(M_HELPER, "helper data", "Blah");
 
 
-#endif
+#endif /* _NETINET_HELPER_MODULE_H_ */

Modified: projects/tcp_cc_head/sys/netinet/hhooks.c
==============================================================================
--- projects/tcp_cc_head/sys/netinet/hhooks.c	Mon Feb  8 10:02:01 2010	(r203660)
+++ projects/tcp_cc_head/sys/netinet/hhooks.c	Mon Feb  8 14:04:32 2010	(r203661)
@@ -39,6 +39,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/rmlock.h>
 #include <sys/systm.h>
 
+#include <vm/uma.h>
+
 #include <net/vnet.h>
 
 #include <netinet/helper.h>
@@ -227,8 +229,8 @@ run_hhooks(int hhook_type, int hhook_id,
 		return;
 
 	STAILQ_FOREACH(tmp, &hh->hh_hooks, h_next) {
-		printf("Running hook %p for helper %d\n", tmp,
-		tmp->h_helper->id);
+		//printf("Running hook %p for helper %d\n", tmp,
+		//tmp->h_helper->id);
 		if (tmp->h_helper->flags & HELPER_NEEDS_DBLOCK) {
 			if (n_dblocks == 0
 			    || i >= n_dblocks


More information about the svn-src-projects mailing list