Hi,

attached is a diff to switch the pfil(9) subsystem to rmlocks, which are 
more suited for the task.  I'd like some exposure before doing the 
switch, but I don't expect any fallout.  This email is going through the 
patched pfil already - twice.

-- 
/"\  Best regards,                      | [EMAIL PROTECTED]
\ /  Max Laier                          | ICQ #67774661
 X   http://pf4freebsd.love2party.net/  | [EMAIL PROTECTED]
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News
Index: pfil.c
===================================================================
RCS file: /home/ncvs/src/sys/net/pfil.c,v
retrieving revision 1.14
diff -u -r1.14 pfil.c
--- pfil.c	2 Feb 2006 03:13:15 -0000	1.14
+++ pfil.c	23 Nov 2007 09:06:12 -0000
@@ -34,7 +34,7 @@
 #include <sys/errno.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
-#include <sys/rwlock.h>
+#include <sys/rmlock.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
 #include <sys/systm.h>
@@ -66,11 +66,12 @@
 pfil_run_hooks(struct pfil_head *ph, struct mbuf **mp, struct ifnet *ifp,
     int dir, struct inpcb *inp)
 {
+	struct rm_priotracker rmpt;
 	struct packet_filter_hook *pfh;
 	struct mbuf *m = *mp;
 	int rv = 0;
 
-	PFIL_RLOCK(ph);
+	PFIL_RLOCK(ph, &rmpt);
 	KASSERT(ph->ph_nhooks >= 0, ("Pfil hook count dropped < 0"));
 	for (pfh = pfil_hook_get(dir, ph); pfh != NULL;
 	     pfh = TAILQ_NEXT(pfh, pfil_link)) {
@@ -80,7 +81,7 @@
 				break;
 		}
 	}
-	PFIL_RUNLOCK(ph);
+	PFIL_RUNLOCK(ph, &rmpt);
 	
 	*mp = m;
 	return (rv);
@@ -104,7 +105,7 @@
 		}
 	PFIL_LIST_UNLOCK();
 
-	rw_init(&ph->ph_mtx, "PFil hook read/write mutex");
+	PFIL_LOCK_INIT(ph);
 	PFIL_WLOCK(ph);
 	ph->ph_nhooks = 0;
 
@@ -143,7 +144,7 @@
 		free(pfh, M_IFADDR);
 	TAILQ_FOREACH_SAFE(pfh, &ph->ph_out, pfil_link, pfnext)
 		free(pfh, M_IFADDR);
-	rw_destroy(&ph->ph_mtx);
+	PFIL_LOCK_DESTROY(ph);
 	
 	return (0);
 }
Index: pfil.h
===================================================================
RCS file: /home/ncvs/src/sys/net/pfil.h,v
retrieving revision 1.16
diff -u -r1.16 pfil.h
--- pfil.h	8 Jun 2007 12:43:25 -0000	1.16
+++ pfil.h	23 Nov 2007 10:07:52 -0000
@@ -37,7 +37,7 @@
 #include <sys/_lock.h>
 #include <sys/_mutex.h>
 #include <sys/lock.h>
-#include <sys/rwlock.h>
+#include <sys/rmlock.h>
 
 struct mbuf;
 struct ifnet;
@@ -69,7 +69,7 @@
 	pfil_list_t	ph_out;
 	int		ph_type;
 	int		ph_nhooks;
-	struct rwlock	ph_mtx;
+	struct rmlock	ph_lock;
 	union {
 		u_long		phu_val;
 		void		*phu_ptr;
@@ -93,10 +93,13 @@
 struct pfil_head *pfil_head_get(int, u_long);
 
 #define	PFIL_HOOKED(p) ((p)->ph_nhooks > 0)
-#define PFIL_RLOCK(p) rw_rlock(&(p)->ph_mtx)
-#define PFIL_WLOCK(p) rw_wlock(&(p)->ph_mtx)
-#define PFIL_RUNLOCK(p) rw_runlock(&(p)->ph_mtx)
-#define PFIL_WUNLOCK(p) rw_wunlock(&(p)->ph_mtx)
+#define	PFIL_LOCK_INIT(p) \
+    rm_init(&(p)->ph_lock, "PFil hook read/write mutex", LO_RECURSABLE)
+#define	PFIL_LOCK_DESTROY(p) rm_destroy(&(p)->ph_lock)
+#define PFIL_RLOCK(p, t) rm_rlock(&(p)->ph_lock, (t))
+#define PFIL_WLOCK(p) rm_wlock(&(p)->ph_lock)
+#define PFIL_RUNLOCK(p, t) rm_runlock(&(p)->ph_lock, (t))
+#define PFIL_WUNLOCK(p) rm_wunlock(&(p)->ph_lock)
 #define PFIL_LIST_LOCK() mtx_lock(&pfil_global_lock)
 #define PFIL_LIST_UNLOCK() mtx_unlock(&pfil_global_lock)
 

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to