svn commit: r191257 - head/sys/net

Kip Macy kmacy at FreeBSD.org
Sun Apr 19 04:24:57 UTC 2009


Author: kmacy
Date: Sun Apr 19 04:24:56 2009
New Revision: 191257
URL: http://svn.freebsd.org/changeset/base/191257

Log:
  - put larger flowtable members at the end
  - fix bug where tail pointer of the free list would not get advanced
  - clear entry's next pointer when it is added to the freelist to avoid freeing
    an entry that it still points to

Modified:
  head/sys/net/flowtable.c

Modified: head/sys/net/flowtable.c
==============================================================================
--- head/sys/net/flowtable.c	Sun Apr 19 00:34:34 2009	(r191256)
+++ head/sys/net/flowtable.c	Sun Apr 19 04:24:56 2009	(r191257)
@@ -282,14 +282,12 @@ union flentryp {
 };
 
 struct flowtable {
-	union flentryp	ft_table;
 	int 		ft_size;
-	bitstr_t 	*ft_masks[MAXCPU];
-	struct mtx	*ft_locks;
 	int 		ft_lock_count;
 	uint32_t	ft_flags;
 	uint32_t	ft_collisions;
 	uint32_t	ft_allocated;
+	uint32_t	ft_misses;
 	uint64_t	ft_hits;
 
 	uint32_t	ft_udp_idle;
@@ -300,8 +298,11 @@ struct flowtable {
 	fl_lock_t	*ft_lock;
 	fl_lock_t 	*ft_unlock;
 	fl_rtalloc_t	*ft_rtalloc;
+	struct mtx	*ft_locks;
 
 	struct flowtable *ft_next;
+	union flentryp	ft_table;
+	bitstr_t 	*ft_masks[MAXCPU];
 };
 
 static struct proc *flowcleanerproc;
@@ -991,10 +992,11 @@ flowtable_free_stale(struct flowtable *f
 	flefreehead = flefreetail = NULL;
 	mask = flowtable_mask(ft);
 	while ((curbit = bit_fns(mask, ft->ft_size, curbit, &mask_tmp)) != -1) {
-		if (curbit >= ft->ft_size) {
-			log(LOG_DEBUG,
-			    "warning curbit=%d exceeds ft_size\n",
+		if (curbit >= ft->ft_size || curbit < -1) {
+			log(LOG_ALERT,
+			    "warning: bad curbit value %d \n",
 			    curbit);
+			break;
 		}
 		
 		FL_ENTRY_LOCK(ft, curbit);
@@ -1002,14 +1004,13 @@ flowtable_free_stale(struct flowtable *f
 		fle = fleprev = *flehead;
 
 		flowtable_free_checks++;
-#ifdef DIAGNOSTICS
+#ifdef DIAGNOSTIC
 		if (fle == NULL && curbit > 0) {
-			log(LOG_DEBUG,
-			    "warning bit=%d set, but no fle found index=%d p=%p index=%d p=%p\n",
-			    curbit, curbit-1, FL_ENTRY(ft, curbit - 1),
-			    curbit+1, FL_ENTRY(ft, curbit + 1));
+			log(LOG_ALERT,
+			    "warning bit=%d set, but no fle found\n",
+			    curbit);
 		}
-#endif
+#endif		
 		while (fle != NULL) {	
 			if (!flow_stale(ft, fle)) {
 				fleprev = fle;
@@ -1037,8 +1038,11 @@ flowtable_free_stale(struct flowtable *f
 			
 			if (flefreehead == NULL)
 				flefreehead = flefreetail = fletmp;
-			else
+			else {
 				flefreetail->f_next = fletmp;
+				flefreetail = fletmp;
+			}
+			fletmp->f_next = NULL;
 		}
 		if (*flehead == NULL)
 			bit_clear(mask, curbit);


More information about the svn-src-all mailing list