svn commit: r201595 - user/luigi/ipfw3-head/sys/netinet/ipfw

Luigi Rizzo luigi at FreeBSD.org
Tue Jan 5 17:05:12 UTC 2010


Author: luigi
Date: Tue Jan  5 17:05:12 2010
New Revision: 201595
URL: http://svn.freebsd.org/changeset/base/201595

Log:
  simplify a function

Modified:
  user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c

Modified: user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c
==============================================================================
--- user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c	Tue Jan  5 17:04:39 2010	(r201594)
+++ user/luigi/ipfw3-head/sys/netinet/ipfw/ip_dummynet.c	Tue Jan  5 17:05:12 2010	(r201595)
@@ -38,7 +38,6 @@ __FBSDID("$FreeBSD$");
  * Description of the data structures used is in ip_dummynet.h
  * Here you mainly find the following blocks of code:
  *  + variable declarations;
- *  + heap management functions;
  *  + scheduler and dummynet functions;
  *  + configuration and initialization.
  *
@@ -1624,6 +1623,7 @@ config_pipe(struct dn_pipe *p)
 		pipe = locate_pipe(p->pipe_nr);	/* locate pipe */
 
 		if (pipe == NULL) {		/* new pipe */
+			/* space for pipe + 3 heaps right after the pipe */
 			pipe = malloc(sizeof(struct dn_pipe) +
 				3 * sizeof(struct dn_heap), M_DUMMYNET,
 			    M_NOWAIT | M_ZERO);
@@ -1633,7 +1633,6 @@ config_pipe(struct dn_pipe *p)
 				return (ENOMEM);
 			}
 
-			/* the heaps are right after the pipe */
 			pipe->scheduler_heap = (struct dn_heap *)(pipe + 1);
 			pipe->not_eligible_heap = pipe->scheduler_heap + 1;
 			pipe->idle_heap = pipe->scheduler_heap + 2;
@@ -1820,22 +1819,21 @@ dummynet_drain(void)
 static int
 delete_pipe(struct dn_pipe *p)
 {
-
-    if (p->pipe_nr == 0 && p->fs.fs_nr == 0)
-	return EINVAL ;
-    if (p->pipe_nr != 0 && p->fs.fs_nr != 0)
+    struct dn_pipe *pipe;
+    struct dn_flow_set *fs;
+    int err = 0;
+    
+    if (p->pipe_nr != 0 && p->fs.fs_nr != 0) /* cannot have both set */
 	return EINVAL ;
+    DUMMYNET_LOCK();
     if (p->pipe_nr != 0) { /* this is an old-style pipe */
-	struct dn_pipe *pipe;
-	struct dn_flow_set *fs;
 	int i;
 
-	DUMMYNET_LOCK();
 	pipe = locate_pipe(p->pipe_nr);	/* locate pipe */
 
 	if (pipe == NULL) {
-	    DUMMYNET_UNLOCK();
-	    return (ENOENT);	/* not found */
+		err = ENOENT;	/* not found */
+		goto done;
 	}
 
 	/* Unlink from list of pipes. */
@@ -1857,18 +1855,14 @@ delete_pipe(struct dn_pipe *p)
 	/* remove reference to here from extract_heap and wfq_ready_heap */
 	heap_scan(&extract_heap, scan_remove_pipe, (uintptr_t)pipe);
 	heap_scan(&wfq_ready_heap, scan_remove_pipe, (uintptr_t)pipe);
-	DUMMYNET_UNLOCK();
-
-	free_pipe(pipe);
     } else { /* this is a WF2Q queue (dn_flow_set) */
-	struct dn_flow_set *fs;
+	pipe = NULL;
 
-	DUMMYNET_LOCK();
 	fs = locate_flowset(p->fs.fs_nr); /* locate set */
 
 	if (fs == NULL) {
-	    DUMMYNET_UNLOCK();
-	    return (ENOENT); /* not found */
+		err = ENOENT;	/* not found */
+		goto done;
 	}
 
 	/* Unlink from list of flowsets. */
@@ -1879,14 +1873,15 @@ delete_pipe(struct dn_pipe *p)
 	    fs->pipe->sum -= fs->weight * fs->backlogged ;
 	    fs_remove_from_heap(fs->pipe->not_eligible_heap, fs);
 	    fs_remove_from_heap(fs->pipe->scheduler_heap, fs);
-#if 1	/* XXX should i remove from idle_heap as well ? */
 	    fs_remove_from_heap(fs->pipe->idle_heap, fs);
-#endif
 	}
 	purge_flow_set(fs, 1);
-	DUMMYNET_UNLOCK();
     }
-    return 0 ;
+done:
+    DUMMYNET_UNLOCK();
+    if (pipe)
+	free_pipe(pipe);
+    return err;
 }
 
 /*


More information about the svn-src-user mailing list