Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Jun 2012 12:11:04 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r236513 - projects/pf/head/sys/contrib/pf/net
Message-ID:  <201206031211.q53CB48v060346@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Sun Jun  3 12:11:03 2012
New Revision: 236513
URL: http://svn.freebsd.org/changeset/base/236513

Log:
  Good bye PF_LOCK(), or "the pf Giant" how I have called you. I hope,
  we can sustain without you. Bye!
  
  Details:
  - Remove PF_LOCK from forwarding paths.
  - Change PF_LOCK to PF_RULES_WLOCK to protect rest of data structures,
    that wasn't protected with separate locks before.

Modified:
  projects/pf/head/sys/contrib/pf/net/if_pflog.c
  projects/pf/head/sys/contrib/pf/net/if_pfsync.c
  projects/pf/head/sys/contrib/pf/net/pf.c
  projects/pf/head/sys/contrib/pf/net/pf_ioctl.c
  projects/pf/head/sys/contrib/pf/net/pfvar.h

Modified: projects/pf/head/sys/contrib/pf/net/if_pflog.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/if_pflog.c	Sun Jun  3 11:57:05 2012	(r236512)
+++ projects/pf/head/sys/contrib/pf/net/if_pflog.c	Sun Jun  3 12:11:03 2012	(r236513)
@@ -269,14 +269,14 @@ pflog_modevent(module_t mod, int type, v
 	switch (type) {
 	case MOD_LOAD:
 		pflogattach(1);
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		pflog_packet_ptr = pflog_packet;
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	case MOD_UNLOAD:
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		pflog_packet_ptr = NULL;
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		if_clone_detach(&pflog_cloner);
 		break;
 	default:

Modified: projects/pf/head/sys/contrib/pf/net/if_pfsync.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/if_pfsync.c	Sun Jun  3 11:57:05 2012	(r236512)
+++ projects/pf/head/sys/contrib/pf/net/if_pfsync.c	Sun Jun  3 12:11:03 2012	(r236513)
@@ -629,7 +629,6 @@ pfsync_input(struct mbuf *m, __unused in
 	pkt.src = ip->ip_src;
 	pkt.flags = 0;
 
-	PF_LOCK();
 	/*
 	 * Trusting pf_chksum during packet processing, as well as seeking
 	 * in interface name tree, require holding PF_RULES_RLOCK().
@@ -646,7 +645,6 @@ pfsync_input(struct mbuf *m, __unused in
 		if (subh.action >= PFSYNC_ACT_MAX) {
 			V_pfsyncstats.pfsyncs_badact++;
 			PF_RULES_RUNLOCK();
-			PF_UNLOCK();
 			goto done;
 		}
 
@@ -655,14 +653,12 @@ pfsync_input(struct mbuf *m, __unused in
 		rv = (*pfsync_acts[subh.action])(&pkt, m, offset, count);
 		if (rv == -1) {
 			PF_RULES_RUNLOCK();
-			PF_UNLOCK();
 			return;
 		}
 
 		offset += rv;
 	}
 	PF_RULES_RUNLOCK();
-	PF_UNLOCK();
 
 done:
 	m_freem(m);
@@ -1290,12 +1286,10 @@ pfsyncioctl(struct ifnet *ifp, u_long cm
 		    ifr->ifr_mtu > sc->sc_sync_if->if_mtu)
 			return (EINVAL);
 		if (ifr->ifr_mtu < ifp->if_mtu) {
-			PF_LOCK();
 			PFSYNC_LOCK(sc);
 			if (sc->sc_len > PFSYNC_MINPKT)
 				pfsync_sendout(1);
 			PFSYNC_UNLOCK(sc);
-			PF_UNLOCK();
 		}
 		ifp->if_mtu = ifr->ifr_mtu;
 		break;
@@ -1336,7 +1330,6 @@ pfsyncioctl(struct ifnet *ifp, u_long cm
 		mship = malloc((sizeof(struct in_multi *) *
 		    IP_MIN_MEMBERSHIPS), M_PFSYNC, M_WAITOK | M_ZERO);
 
-		PF_LOCK();
 		PFSYNC_LOCK(sc);
 		if (pfsyncr.pfsyncr_syncpeer.s_addr == 0)
 			sc->sc_sync_peer.s_addr = htonl(INADDR_PFSYNC_GROUP);
@@ -1360,7 +1353,6 @@ pfsyncioctl(struct ifnet *ifp, u_long cm
 			if (imo->imo_membership)
 				pfsync_multicast_cleanup(sc);
 			PFSYNC_UNLOCK(sc);
-			PF_UNLOCK();
 			free(mship, M_PFSYNC);
 			break;
 		}
@@ -1408,7 +1400,6 @@ pfsyncioctl(struct ifnet *ifp, u_long cm
 			printf("pfsync: requesting bulk update\n");
 		pfsync_request_update(0, 0);
 		PFSYNC_UNLOCK(sc);
-		PF_UNLOCK();
 		PFSYNC_BLOCK(sc);
 		sc->sc_ureq_sent = time_uptime;
 		callout_reset(&sc->sc_bulkfail_tmo, 5 * hz, pfsync_bulk_fail,
@@ -1919,8 +1910,6 @@ pfsync_delete_state(struct pf_state *st)
 	struct pfsync_softc *sc = V_pfsyncif;
 	int schedswi = 0;
 
-	PF_LOCK_ASSERT();
-
 	PFSYNC_LOCK(sc);
 	if (st->state_flags & PFSTATE_ACK)
 		pfsync_undefer_state(st, 1);
@@ -1968,8 +1957,6 @@ pfsync_clear_states(u_int32_t creatorid,
 		struct pfsync_clr clr;
 	} __packed r;
 
-	PF_LOCK_ASSERT();
-
 	bzero(&r, sizeof(r));
 
 	r.subh.action = PFSYNC_ACT_CLR;
@@ -2039,7 +2026,6 @@ pfsync_bulk_start(void)
 	if (V_pf_status.debug >= PF_DEBUG_MISC)
 		printf("pfsync: received bulk update request\n");
 
-	PF_LOCK_ASSERT();
 	PFSYNC_BLOCK(sc);
 
 	sc->sc_ureq_received = time_uptime;
@@ -2057,7 +2043,6 @@ pfsync_bulk_update(void *arg)
 	struct pf_state *s;
 	int i, sent = 0;
 
-	PF_LOCK_ASSERT();
 	PFSYNC_BLOCK_ASSERT(sc);
 	CURVNET_SET(sc->sc_ifp->if_vnet);
 
@@ -2126,8 +2111,6 @@ pfsync_bulk_status(u_int8_t status)
 
 	struct pfsync_softc *sc = V_pfsyncif;
 
-	PF_LOCK_ASSERT();
-
 	bzero(&r, sizeof(r));
 
 	r.subh.action = PFSYNC_ACT_BUS;
@@ -2181,7 +2164,6 @@ pfsync_send_plus(void *plus, size_t plus
 {
 	struct pfsync_softc *sc = V_pfsyncif;
 
-	PF_LOCK_ASSERT();
 	PFSYNC_LOCK_ASSERT(sc);
 
 	if (sc->sc_len + pluslen > sc->sc_ifp->if_mtu)
@@ -2310,14 +2292,14 @@ pfsync_init()
 		goto fail;
 	}
 #endif
-	PF_LOCK();
+	PF_RULES_WLOCK();
 	pfsync_state_import_ptr = pfsync_state_import;
 	pfsync_insert_state_ptr = pfsync_insert_state;
 	pfsync_update_state_ptr = pfsync_update_state;
 	pfsync_delete_state_ptr = pfsync_delete_state;
 	pfsync_clear_states_ptr = pfsync_clear_states;
 	pfsync_defer_ptr = pfsync_defer;
-	PF_UNLOCK();
+	PF_RULES_WUNLOCK();
 
 	return (0);
 

Modified: projects/pf/head/sys/contrib/pf/net/pf.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf.c	Sun Jun  3 11:57:05 2012	(r236512)
+++ projects/pf/head/sys/contrib/pf/net/pf.c	Sun Jun  3 12:11:03 2012	(r236513)
@@ -1304,14 +1304,11 @@ pf_purge_thread(void *v)
 	for (;;) {
 		tsleep(pf_purge_thread, PWAIT, "pftm", hz / 10);
 
-		PF_LOCK();
-
 		if (V_pf_end_threads) {
 			pf_purge_expired_states(V_pf_hashmask + 1);
 			pf_purge_expired_fragments();
 			pf_purge_expired_src_nodes();
 			V_pf_end_threads++;
-			PF_UNLOCK();
 			wakeup(pf_purge_thread);
 			kproc_exit(0);
 		}
@@ -1332,8 +1329,6 @@ pf_purge_thread(void *v)
 			pf_purge_unlinked_rules();
 			pfi_kif_purge();
 		}
-
-		PF_UNLOCK();
 	}
 	/* not reached */
 	CURVNET_RESTORE();
@@ -2635,7 +2630,6 @@ pf_socket_lookup(int direction, struct p
 		saddr = pd->dst;
 		daddr = pd->src;
 	}
-	PF_UNLOCK();
 	switch (pd->af) {
 #ifdef INET
 	case AF_INET:
@@ -2679,7 +2673,7 @@ pf_socket_lookup(int direction, struct p
 	pd->lookup.uid = inp->inp_cred->cr_uid;
 	pd->lookup.gid = inp->inp_cred->cr_groups[0];
 	INP_RUNLOCK(inp);
-	PF_LOCK();
+
 	return (1);
 }
 
@@ -5101,14 +5095,12 @@ pf_route(struct mbuf **m, struct pf_rule
 		if ((m0 = m_dup(*m, M_NOWAIT)) == NULL) {
 			if (s)
 				PF_STATE_UNLOCK(s);
-			PF_UNLOCK();
 			return;
 		}
 	} else {
 		if ((r->rt == PF_REPLYTO) == (r->direction == dir)) {
 			if (s)
 				PF_STATE_UNLOCK(s);
-			PF_UNLOCK();
 			return;
 		}
 		m0 = *m;
@@ -5126,7 +5118,6 @@ pf_route(struct mbuf **m, struct pf_rule
 
 		if (s)
 			PF_STATE_UNLOCK(s);
-		PF_UNLOCK();
 		rt = rtalloc1_fib(sintosa(&dst), 0, 0, M_GETFIB(m0));
 		if (rt == NULL) {
 			RTFREE_LOCKED(rt);
@@ -5154,14 +5145,12 @@ pf_route(struct mbuf **m, struct pf_rule
 				dst.sin_addr.s_addr = naddr.v4.s_addr;
 			ifp = r->rpool.cur->kif ?
 			    r->rpool.cur->kif->pfik_ifp : NULL;
-			PF_UNLOCK();
 		} else {
 			if (!PF_AZERO(&s->rt_addr, AF_INET))
 				dst.sin_addr.s_addr =
 				    s->rt_addr.v4.s_addr;
 			ifp = s->rt_kif ? s->rt_kif->pfik_ifp : NULL;
 			PF_STATE_UNLOCK(s);
-			PF_UNLOCK();
 		}
 	}
 	if (ifp == NULL)
@@ -5256,7 +5245,6 @@ done:
 bad_locked:
 	if (s)
 		PF_STATE_UNLOCK(s);
-	PF_UNLOCK();
 bad:
 	m_freem(m0);
 	goto done;
@@ -5289,14 +5277,12 @@ pf_route6(struct mbuf **m, struct pf_rul
 		if ((m0 = m_dup(*m, M_NOWAIT)) == NULL) {
 			if (s)
 				PF_STATE_UNLOCK(s);
-			PF_UNLOCK();
 			return;
 		}
 	} else {
 		if ((r->rt == PF_REPLYTO) == (r->direction == dir)) {
 			if (s)
 				PF_STATE_UNLOCK(s);
-			PF_UNLOCK();
 			return;
 		}
 		m0 = *m;
@@ -5313,7 +5299,6 @@ pf_route6(struct mbuf **m, struct pf_rul
 	if (r->rt == PF_FASTROUTE) {
 		if (s)
 			PF_STATE_UNLOCK(s);
-		PF_UNLOCK();
 		m0->m_flags |= M_SKIP_FIREWALL;
 		ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL);
 		return;
@@ -5340,7 +5325,6 @@ pf_route6(struct mbuf **m, struct pf_rul
 
 	if (s)
 		PF_STATE_UNLOCK(s);
-	PF_UNLOCK();
 
 	if (ifp == NULL)
 		goto bad;
@@ -5386,7 +5370,6 @@ done:
 bad_locked:
 	if (s)
 		PF_STATE_UNLOCK(s);
-	PF_UNLOCK();
 bad:
 	m_freem(m0);
 	goto done;
@@ -5571,11 +5554,9 @@ pf_test(int dir, struct ifnet *ifp, stru
 		action = PF_DROP;
 		REASON_SET(&reason, PFRES_SHORT);
 		log = 1;
-		PF_LOCK();
 		goto done;
 	}
 
-	PF_LOCK();
 	PF_RULES_RLOCK();
 
 	if (ip_divert_ptr != NULL &&
@@ -5786,7 +5767,6 @@ done:
 
 			if (s)
 				PF_STATE_UNLOCK(s);
-			PF_UNLOCK();
 
 			m_tag_prepend(m, ipfwtag);
 			if (m->m_flags & M_FASTFWD_OURS) {
@@ -5884,7 +5864,6 @@ done:
 	}
 	if (s)
 		PF_STATE_UNLOCK(s);
-	PF_UNLOCK();
 
 	return (action);
 }
@@ -5932,11 +5911,9 @@ pf_test6(int dir, struct ifnet *ifp, str
 		action = PF_DROP;
 		REASON_SET(&reason, PFRES_SHORT);
 		log = 1;
-		PF_LOCK();
 		goto done;
 	}
 
-	PF_LOCK();
 	PF_RULES_RLOCK();
 
 	/* We do IP header normalization and packet reassembly here */
@@ -6268,7 +6245,7 @@ done:
 
 	if (s)
 		PF_STATE_UNLOCK(s);
-	PF_UNLOCK();
+
 	return (action);
 }
 #endif /* INET6 */

Modified: projects/pf/head/sys/contrib/pf/net/pf_ioctl.c
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pf_ioctl.c	Sun Jun  3 11:57:05 2012	(r236512)
+++ projects/pf/head/sys/contrib/pf/net/pf_ioctl.c	Sun Jun  3 12:11:03 2012	(r236513)
@@ -212,7 +212,6 @@ static volatile VNET_DEFINE(int, pf_pfil
 #define V_pf_pfil_hooked	VNET(pf_pfil_hooked)
 VNET_DEFINE(int,		pf_end_threads);
 
-struct mtx			pf_mtx;
 struct rwlock			pf_rules_lock;
 
 /* pfsync */
@@ -231,7 +230,6 @@ static void
 init_pf_mutex(void)
 {
 
-	mtx_init(&pf_mtx, "pf Giant", NULL, MTX_DEF);
 	rw_init(&pf_rules_lock, "pf rulesets");
 	sx_init(&V_pf_consistency_lock, "pfioctl");
 }
@@ -240,7 +238,6 @@ static void
 destroy_pf_mutex(void)
 {
 
-	mtx_destroy(&pf_mtx);
 	rw_destroy(&pf_rules_lock);
 	sx_destroy(&V_pf_consistency_lock);
 }
@@ -1121,21 +1118,20 @@ pfioctl(struct cdev *dev, u_long cmd, ca
 
 	switch (cmd) {
 	case DIOCSTART:
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		if (V_pf_status.running)
 			error = EEXIST;
 		else {
 			int cpu;
 
-			PF_UNLOCK();
+			PF_RULES_WUNLOCK();
 			error = hook_pf();
-			PF_LOCK();
 			if (error) {
 				DPFPRINTF(PF_DEBUG_MISC,
-				    ("pf: pfil registeration fail\n"));
-				PF_UNLOCK();
+				    ("pf: pfil registration failed\n"));
 				break;
 			}
+			PF_RULES_WLOCK();
 			V_pf_status.running = 1;
 			V_pf_status.since = time_second;
 
@@ -1144,27 +1140,27 @@ pfioctl(struct cdev *dev, u_long cmd, ca
 
 			DPFPRINTF(PF_DEBUG_MISC, ("pf: started\n"));
 		}
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 
 	case DIOCSTOP:
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		if (!V_pf_status.running)
 			error = ENOENT;
 		else {
 			V_pf_status.running = 0;
-			PF_UNLOCK();
+			PF_RULES_WUNLOCK();
 			error = dehook_pf();
-			PF_LOCK();
 			if (error) {
 				V_pf_status.running = 1;
 				DPFPRINTF(PF_DEBUG_MISC,
-				    ("pf: pfil unregisteration failed\n"));
+				    ("pf: pfil unregistration failed\n"));
 			}
+			PF_RULES_WLOCK();
 			V_pf_status.since = time_second;
 			DPFPRINTF(PF_DEBUG_MISC, ("pf: stopped\n"));
 		}
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 
 	case DIOCADDRULE: {
@@ -1633,7 +1629,6 @@ DIOCCHANGERULE_error:
 		struct pfioc_state_kill *psk = (struct pfioc_state_kill *)addr;
 		u_int			 i, killed = 0;
 
-		PF_LOCK();
 		for (i = 0; i <= V_pf_hashmask; i++) {
 			struct pf_idhash *ih = &V_pf_idhash[i];
 
@@ -1657,7 +1652,6 @@ relock_DIOCCLRSTATES:
 		psk->psk_killed = killed;
 		if (pfsync_clear_states_ptr != NULL)
 			pfsync_clear_states_ptr(V_pf_status.hostid, psk->psk_ifname);
-		PF_UNLOCK();
 		break;
 	}
 
@@ -1669,7 +1663,6 @@ relock_DIOCCLRSTATES:
 		struct pfioc_state_kill	*psk = (struct pfioc_state_kill *)addr;
 		u_int			 i, killed = 0;
 
-		PF_LOCK();
 		if (psk->psk_pfcmp.id) {
 			if (psk->psk_pfcmp.creatorid == 0)
 				psk->psk_pfcmp.creatorid = V_pf_status.hostid;
@@ -1678,7 +1671,6 @@ relock_DIOCCLRSTATES:
 				pf_unlink_state(s, PF_ENTER_LOCKED);
 				psk->psk_killed = 1;
 			}
-			PF_UNLOCK();
 			break;
 		}
 
@@ -1734,7 +1726,6 @@ relock_DIOCKILLSTATES:
 			}
 			PF_HASHROW_UNLOCK(ih);
 		}
-		PF_UNLOCK();
 		psk->psk_killed = killed;
 		break;
 	}
@@ -1761,17 +1752,14 @@ relock_DIOCKILLSTATES:
 		struct pfioc_state	*ps = (struct pfioc_state *)addr;
 		struct pf_state		*s;
 
-		PF_LOCK();
 		s = pf_find_state_byid(ps->state.id, ps->state.creatorid);
 		if (s == NULL) {
-			PF_UNLOCK();
 			error = ENOENT;
 			break;
 		}
 
 		pfsync_state_export(&ps->state, s);
 		PF_STATE_UNLOCK(s);
-		PF_UNLOCK();
 		break;
 	}
 
@@ -1824,36 +1812,35 @@ DIOCGETSTATES_full:
 
 	case DIOCGETSTATUS: {
 		struct pf_status *s = (struct pf_status *)addr;
-		PF_LOCK();
+		PF_RULES_RLOCK();
 		bcopy(&V_pf_status, s, sizeof(struct pf_status));
 		pfi_update_status(s->ifname, s);
-		PF_UNLOCK();
+		PF_RULES_RUNLOCK();
 		break;
 	}
 
 	case DIOCSETSTATUSIF: {
 		struct pfioc_if	*pi = (struct pfioc_if *)addr;
 
-		PF_LOCK();
 		if (pi->ifname[0] == 0) {
 			bzero(V_pf_status.ifname, IFNAMSIZ);
-			PF_UNLOCK();
 			break;
 		}
+		PF_RULES_WLOCK();
 		strlcpy(V_pf_status.ifname, pi->ifname, IFNAMSIZ);
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
 	case DIOCCLRSTATUS: {
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		bzero(V_pf_status.counters, sizeof(V_pf_status.counters));
 		bzero(V_pf_status.fcounters, sizeof(V_pf_status.fcounters));
 		bzero(V_pf_status.scounters, sizeof(V_pf_status.scounters));
 		V_pf_status.since = time_second;
 		if (*V_pf_status.ifname)
 			pfi_update_status(V_pf_status.ifname, NULL);
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
@@ -1865,7 +1852,6 @@ DIOCGETSTATES_full:
 		int			 m = 0, direction = pnl->direction;
 		int			 sidx, didx;
 
-		PF_LOCK();
 		/* NATLOOK src and dst are reversed, so reverse sidx/didx */
 		sidx = (direction == PF_IN) ? 1 : 0;
 		didx = (direction == PF_IN) ? 0 : 1;
@@ -1899,7 +1885,6 @@ DIOCGETSTATES_full:
 			} else
 				error = ENOENT;
 		}
-		PF_UNLOCK();
 		break;
 	}
 
@@ -1912,7 +1897,7 @@ DIOCGETSTATES_full:
 			error = EINVAL;
 			break;
 		}
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		old = V_pf_default_rule.timeout[pt->timeout];
 		if (pt->timeout == PFTM_INTERVAL && pt->seconds == 0)
 			pt->seconds = 1;
@@ -1920,7 +1905,7 @@ DIOCGETSTATES_full:
 		if (pt->timeout == PFTM_INTERVAL && pt->seconds < old)
 			wakeup(pf_purge_thread);
 		pt->seconds = old;
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
@@ -1931,7 +1916,9 @@ DIOCGETSTATES_full:
 			error = EINVAL;
 			break;
 		}
+		PF_RULES_RLOCK();
 		pt->seconds = V_pf_default_rule.timeout[pt->timeout];
+		PF_RULES_RUNLOCK();
 		break;
 	}
 
@@ -1942,7 +1929,9 @@ DIOCGETSTATES_full:
 			error = EINVAL;
 			break;
 		}
+		PF_RULES_RLOCK();
 		pl->limit = V_pf_limits[pl->index].limit;
+		PF_RULES_RUNLOCK();
 		break;
 	}
 
@@ -1950,10 +1939,10 @@ DIOCGETSTATES_full:
 		struct pfioc_limit	*pl = (struct pfioc_limit *)addr;
 		int			 old_limit;
 
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		if (pl->index < 0 || pl->index >= PF_LIMIT_MAX ||
 		    V_pf_limits[pl->index].zone == NULL) {
-			PF_UNLOCK();
+			PF_RULES_WUNLOCK();
 			error = EINVAL;
 			break;
 		}
@@ -1961,14 +1950,16 @@ DIOCGETSTATES_full:
 		old_limit = V_pf_limits[pl->index].limit;
 		V_pf_limits[pl->index].limit = pl->limit;
 		pl->limit = old_limit;
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
 	case DIOCSETDEBUG: {
 		u_int32_t	*level = (u_int32_t *)addr;
 
+		PF_RULES_WLOCK();
 		V_pf_status.debug = *level;
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
@@ -2874,17 +2865,17 @@ DIOCCHANGEADDR_error:
 
 	case DIOCOSFPADD: {
 		struct pf_osfp_ioctl *io = (struct pf_osfp_ioctl *)addr;
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		error = pf_osfp_add(io);
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
 	case DIOCOSFPGET: {
 		struct pf_osfp_ioctl *io = (struct pf_osfp_ioctl *)addr;
-		PF_LOCK();
+		PF_RULES_RLOCK();
 		error = pf_osfp_get(io);
-		PF_UNLOCK();
+		PF_RULES_RUNLOCK();
 		break;
 	}
 
@@ -3194,11 +3185,9 @@ DIOCCHANGEADDR_error:
 
 	case DIOCCLRSRCNODES: {
 
-		PF_LOCK();
 		pf_clear_srcnodes(NULL);
 		pf_purge_expired_src_nodes();
 		V_pf_status.src_nodes = 0;
-		PF_UNLOCK();
 		break;
 	}
 
@@ -3245,19 +3234,19 @@ DIOCCHANGEADDR_error:
 	case DIOCSETHOSTID: {
 		u_int32_t	*hostid = (u_int32_t *)addr;
 
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		if (*hostid == 0)
 			V_pf_status.hostid = arc4random();
 		else
 			V_pf_status.hostid = *hostid;
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 	}
 
 	case DIOCOSFPFLUSH:
-		PF_LOCK();
+		PF_RULES_WLOCK();
 		pf_osfp_flush();
-		PF_UNLOCK();
+		PF_RULES_WUNLOCK();
 		break;
 
 	case DIOCIGETIFACES: {
@@ -3676,8 +3665,6 @@ hook_pf(void)
 	struct pfil_head *pfh_inet6;
 #endif
 
-	PF_UNLOCK_ASSERT();
-
 	if (V_pf_pfil_hooked)
 		return (0); 
 
@@ -3717,8 +3704,6 @@ dehook_pf(void)
 	struct pfil_head *pfh_inet6;
 #endif
 
-	PF_UNLOCK_ASSERT();
-
 	if (V_pf_pfil_hooked == 0)
 		return (0);
 
@@ -3790,9 +3775,9 @@ pf_unload(void)
 {
 	int error = 0;
 
-	PF_LOCK();
+	PF_RULES_WLOCK();
 	V_pf_status.running = 0;
-	PF_UNLOCK();
+	PF_RULES_WUNLOCK();
 	m_addr_chg_pf_p = NULL;
 	swi_remove(V_pf_swi_cookie);
 	error = dehook_pf();
@@ -3805,19 +3790,19 @@ pf_unload(void)
 		printf("%s : pfil unregisteration fail\n", __FUNCTION__);
 		return error;
 	}
-	PF_LOCK();
+	PF_RULES_WLOCK();
 	shutdown_pf();
 	V_pf_end_threads = 1;
 	while (V_pf_end_threads < 2) {
 		wakeup_one(pf_purge_thread);
-		msleep(pf_purge_thread, &pf_mtx, 0, "pftmo", hz);
+		tsleep(pf_purge_thread, PWAIT, "pftmo", hz);
 	}
 	pf_normalize_cleanup();
 	pfi_cleanup();
 	pf_osfp_flush();
 	pf_osfp_cleanup();
 	pf_cleanup();
-	PF_UNLOCK();
+	PF_RULES_WUNLOCK();
 	destroy_dev(pf_dev);
 	destroy_pf_mutex();
 

Modified: projects/pf/head/sys/contrib/pf/net/pfvar.h
==============================================================================
--- projects/pf/head/sys/contrib/pf/net/pfvar.h	Sun Jun  3 11:57:05 2012	(r236512)
+++ projects/pf/head/sys/contrib/pf/net/pfvar.h	Sun Jun  3 12:11:03 2012	(r236513)
@@ -198,12 +198,6 @@ struct pfi_dynaddr {
 
 #define	PF_NAME		"pf"
 
-extern struct mtx pf_mtx;
-#define	PF_LOCK_ASSERT()	mtx_assert(&pf_mtx, MA_OWNED)
-#define	PF_UNLOCK_ASSERT()	mtx_assert(&pf_mtx, MA_NOTOWNED)
-#define	PF_LOCK()		mtx_lock(&pf_mtx)
-#define	PF_UNLOCK()		mtx_unlock(&pf_mtx)
-
 #define	PF_HASHROW_ASSERT(h)	mtx_assert(&(h)->lock, MA_OWNED)
 #define	PF_HASHROW_LOCK(h)	mtx_lock(&(h)->lock)
 #define	PF_HASHROW_UNLOCK(h)	mtx_unlock(&(h)->lock)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201206031211.q53CB48v060346>