On Mon, May 17, 2021 at 04:24:15PM +0200, Alexandr Nedvedicky wrote:
> in current tree the ether_input() is protected by NET_LOCK(), which is grabbed
> by caller as a writer. bluhm's diff changes NET_LOCK() readlock, so
> ether_input() can run concurrently. Switching NET_LOCK() to r-lock has
> implications on smr read section above. The ting is the call to eb->eb_input()
> can sleep now. This is something what needs to be avoided within smr section.

Do you think the sleeping occures in PF_LOCK()?  Could it be that
this rwlock did never sleep before, but was acquired instantly?

Having sleeps in the packet forwarding path is a bad idea.  And
refcounting per packet looks like a workarund.  It does not make
things faster.

How about implementing PF_LOCK() with a mutex?

I made such a diff a few months ago.  It is not well tested yet.
There were some problems when allocating pf mutex in ioctl path.
mpi@ did not like it, as it removes the pf lock in pf ioctl and
relies on net lock for reconfigure.

It is a design question.  Do we want to keep net lock for reconfigure?
If we process packets with shared netlock and reconfigure pf with
exclusive netlock this looks reasonable.

Do we want to go this way?  Then I will polish and test this diff.

bluhm

Index: net/pf.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pf.c,v
retrieving revision 1.1116
diff -u -p -r1.1116 pf.c
--- net/pf.c    27 Apr 2021 09:38:29 -0000      1.1116
+++ net/pf.c    17 May 2021 17:38:20 -0000
@@ -6819,6 +6819,8 @@ pf_test(sa_family_t af, int fwdir, struc
        if (!pf_status.running)
                return (PF_PASS);
 
+       NET_ASSERT_LOCKED();
+
 #if NCARP > 0
        if (ifp->if_type == IFT_CARP &&
                (ifp0 = if_get(ifp->if_carpdevidx)) != NULL) {
Index: net/pf_ioctl.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pf_ioctl.c,v
retrieving revision 1.363
diff -u -p -r1.363 pf_ioctl.c
--- net/pf_ioctl.c      9 Feb 2021 23:37:54 -0000       1.363
+++ net/pf_ioctl.c      17 May 2021 17:38:20 -0000
@@ -146,8 +146,8 @@ TAILQ_HEAD(pf_tags, pf_tagname)     pf_tags 
  * grab the lock as writer. Whenever packet creates state it grabs pf_lock
  * first then it locks pf_state_lock as the writer.
  */
-struct rwlock           pf_lock = RWLOCK_INITIALIZER("pf_lock");
-struct rwlock           pf_state_lock = RWLOCK_INITIALIZER("pf_state_lock");
+struct mutex   pf_lock = MUTEX_INITIALIZER(IPL_SOFTNET);
+struct mutex   pf_state_lock = MUTEX_INITIALIZER(IPL_SOFTNET);
 
 #if (PF_QNAME_SIZE != PF_TAG_NAME_SIZE)
 #error PF_QNAME_SIZE must be equal to PF_TAG_NAME_SIZE
@@ -1009,7 +1009,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 
        case DIOCSTART:
                NET_LOCK();
-               PF_LOCK();
                if (pf_status.running)
                        error = EEXIST;
                else {
@@ -1023,13 +1022,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        pf_create_queues();
                        DPFPRINTF(LOG_NOTICE, "pf: started");
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
 
        case DIOCSTOP:
                NET_LOCK();
-               PF_LOCK();
                if (!pf_status.running)
                        error = ENOENT;
                else {
@@ -1038,7 +1035,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        pf_remove_queues();
                        DPFPRINTF(LOG_NOTICE, "pf: stopped");
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
 
@@ -1048,7 +1044,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int32_t                nr = 0;
 
                NET_LOCK();
-               PF_LOCK();
                pq->ticket = pf_main_ruleset.rules.active.ticket;
 
                /* save state to not run over them all each time? */
@@ -1058,7 +1053,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        nr++;
                }
                pq->nr = nr;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1069,10 +1063,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int32_t                nr = 0;
 
                NET_LOCK();
-               PF_LOCK();
                if (pq->ticket != pf_main_ruleset.rules.active.ticket) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1083,12 +1075,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        qs = TAILQ_NEXT(qs, entries);
                if (qs == NULL) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
                memcpy(&pq->queue, qs, sizeof(pq->queue));
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1100,10 +1090,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                int                      nbytes;
 
                NET_LOCK();
-               PF_LOCK();
                if (pq->ticket != pf_main_ruleset.rules.active.ticket) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1116,7 +1104,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        qs = TAILQ_NEXT(qs, entries);
                if (qs == NULL) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1131,7 +1118,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                            &nbytes);
                if (error == 0)
                        pq->nbytes = nbytes;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1147,10 +1133,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                }
 
                NET_LOCK();
-               PF_LOCK();
                if (q->ticket != pf_main_ruleset.rules.inactive.ticket) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_queue_pl, qs);
                        break;
@@ -1159,7 +1143,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                qs->qid = pf_qname2qid(qs->qname, 1);
                if (qs->qid == 0) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_queue_pl, qs);
                        break;
@@ -1167,7 +1150,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                if (qs->parent[0] && (qs->parent_qid =
                    pf_qname2qid(qs->parent, 0)) == 0) {
                        error = ESRCH;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_queue_pl, qs);
                        break;
@@ -1175,7 +1157,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                qs->kif = pfi_kif_get(qs->ifname);
                if (qs->kif == NULL) {
                        error = ESRCH;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_queue_pl, qs);
                        break;
@@ -1184,7 +1165,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                pfi_kif_ref(qs->kif, PFI_KIF_REF_RULE);
 
                TAILQ_INSERT_TAIL(pf_queues_inactive, qs, entries);
-               PF_UNLOCK();
                NET_UNLOCK();
 
                break;
@@ -1202,26 +1182,22 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                }
 
                NET_LOCK();
-               PF_LOCK();
                pr->anchor[sizeof(pr->anchor) - 1] = '\0';
                ruleset = pf_find_ruleset(pr->anchor);
                if (ruleset == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_rule_pl, rule);
                        break;
                }
                if (pr->rule.return_icmp >> 8 > ICMP_MAXTYPE) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_rule_pl, rule);
                        break;
                }
                if (pr->ticket != ruleset->rules.inactive.ticket) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_rule_pl, rule);
                        break;
@@ -1229,7 +1205,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                if ((error = pf_rule_copyin(&pr->rule, rule, ruleset))) {
                        pf_rm_rule(NULL, rule);
                        rule = NULL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1249,7 +1224,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        pf_rm_rule(NULL, rule);
                        rule = NULL;
                        error = EAFNOSUPPORT;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        goto fail;
                }
@@ -1285,7 +1259,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 
                if (error) {
                        pf_rm_rule(NULL, rule);
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1293,7 +1266,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                    rule, entries);
                rule->ruleset = ruleset;
                ruleset->rules.inactive.rcount++;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1304,12 +1276,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pf_rule          *tail;
 
                NET_LOCK();
-               PF_LOCK();
                pr->anchor[sizeof(pr->anchor) - 1] = '\0';
                ruleset = pf_find_ruleset(pr->anchor);
                if (ruleset == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1319,7 +1289,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                else
                        pr->nr = 0;
                pr->ticket = ruleset->rules.active.ticket;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1331,18 +1300,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                int                      i;
 
                NET_LOCK();
-               PF_LOCK();
                pr->anchor[sizeof(pr->anchor) - 1] = '\0';
                ruleset = pf_find_ruleset(pr->anchor);
                if (ruleset == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
                if (pr->ticket != ruleset->rules.active.ticket) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1351,7 +1317,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        rule = TAILQ_NEXT(rule, entries);
                if (rule == NULL) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1369,7 +1334,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                pr->rule.ruleset = NULL;
                if (pf_anchor_copyout(ruleset, rule, pr)) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1391,7 +1355,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        rule->bytes[0] = rule->bytes[1] = 0;
                        rule->states_tot = 0;
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1415,11 +1378,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                }
 
                NET_LOCK();
-               PF_LOCK();
                ruleset = pf_find_ruleset(pcr->anchor);
                if (ruleset == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_rule_pl, newrule);
                        break;
@@ -1427,7 +1388,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 
                if (pcr->action == PF_CHANGE_GET_TICKET) {
                        pcr->ticket = ++ruleset->rules.active.ticket;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        pool_put(&pf_rule_pl, newrule);
                        break;
@@ -1435,14 +1395,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        if (pcr->ticket !=
                            ruleset->rules.active.ticket) {
                                error = EINVAL;
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                pool_put(&pf_rule_pl, newrule);
                                break;
                        }
                        if (pcr->rule.return_icmp >> 8 > ICMP_MAXTYPE) {
                                error = EINVAL;
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                pool_put(&pf_rule_pl, newrule);
                                break;
@@ -1466,7 +1424,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        default:
                                pf_rm_rule(NULL, newrule);
                                error = EAFNOSUPPORT;
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                goto fail;
                        }
@@ -1488,7 +1445,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 
                        if (error) {
                                pf_rm_rule(NULL, newrule);
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                break;
                        }
@@ -1507,7 +1463,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                if (newrule != NULL)
                                        pf_rm_rule(NULL, newrule);
                                error = EINVAL;
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                break;
                        }
@@ -1540,7 +1495,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                pf_calc_skip_steps(ruleset->rules.active.ptr);
                pf_remove_if_empty_ruleset(ruleset);
 
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1551,7 +1505,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int                    killed = 0;
 
                NET_LOCK();
-               PF_LOCK();
                PF_STATE_ENTER_WRITE();
                for (s = RB_MIN(pf_state_tree_id, &tree_id); s; s = nexts) {
                        nexts = RB_NEXT(pf_state_tree_id, &tree_id, s);
@@ -1571,7 +1524,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 #if NPFSYNC > 0
                pfsync_clear_states(pf_status.hostid, psk->psk_ifname);
 #endif /* NPFSYNC > 0 */
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1591,14 +1543,12 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        if (psk->psk_pfcmp.creatorid == 0)
                                psk->psk_pfcmp.creatorid = pf_status.hostid;
                        NET_LOCK();
-                       PF_LOCK();
                        PF_STATE_ENTER_WRITE();
                        if ((s = pf_find_state_byid(&psk->psk_pfcmp))) {
                                pf_remove_state(s);
                                psk->psk_killed = 1;
                        }
                        PF_STATE_EXIT_WRITE();
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1612,7 +1562,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        key.rdomain = psk->psk_rdomain;
 
                        NET_LOCK();
-                       PF_LOCK();
                        PF_STATE_ENTER_WRITE();
                        for (i = 0; i < nitems(dirs); i++) {
                                if (dirs[i] == PF_IN) {
@@ -1655,13 +1604,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        if (killed)
                                psk->psk_killed = killed;
                        PF_STATE_EXIT_WRITE();
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
 
                NET_LOCK();
-               PF_LOCK();
                PF_STATE_ENTER_WRITE();
                for (s = RB_MIN(pf_state_tree_id, &tree_id); s;
                    s = nexts) {
@@ -1709,7 +1656,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                }
                psk->psk_killed = killed;
                PF_STATE_EXIT_WRITE();
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1724,9 +1670,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfsync_state_import(sp, PFSYNC_SI_IOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1805,10 +1749,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
        case DIOCGETSTATUS: {
                struct pf_status *s = (struct pf_status *)addr;
                NET_LOCK();
-               PF_LOCK();
                memcpy(s, &pf_status, sizeof(struct pf_status));
                pfi_update_status(s->ifname, s);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1817,16 +1759,13 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_iface      *pi = (struct pfioc_iface *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                if (pi->pfiio_name[0] == 0) {
                        memset(pf_status.ifname, 0, IFNAMSIZ);
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
                strlcpy(pf_trans_set.statusif, pi->pfiio_name, IFNAMSIZ);
                pf_trans_set.mask |= PF_TSET_STATUSIF;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1835,11 +1774,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_iface      *pi = (struct pfioc_iface *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                /* if ifname is specified, clear counters there only */
                if (pi->pfiio_name[0]) {
                        pfi_update_status(pi->pfiio_name, NULL);
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -1849,7 +1786,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                memset(pf_status.scounters, 0, sizeof(pf_status.scounters));
                pf_status.since = getuptime();
 
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1929,12 +1865,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        goto fail;
                }
                NET_LOCK();
-               PF_LOCK();
                if (pt->timeout == PFTM_INTERVAL && pt->seconds == 0)
                        pt->seconds = 1;
                pf_default_rule_new.timeout[pt->timeout] = pt->seconds;
                pt->seconds = pf_default_rule.timeout[pt->timeout];
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1947,9 +1881,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        goto fail;
                }
                NET_LOCK();
-               PF_LOCK();
                pt->seconds = pf_default_rule.timeout[pt->timeout];
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1962,9 +1894,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        goto fail;
                }
                NET_LOCK();
-               PF_LOCK();
                pl->limit = pf_pool_limits[pl->index].limit;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -1973,32 +1903,27 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_limit      *pl = (struct pfioc_limit *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                if (pl->index < 0 || pl->index >= PF_LIMIT_MAX ||
                    pf_pool_limits[pl->index].pp == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        goto fail;
                }
                if (((struct pool *)pf_pool_limits[pl->index].pp)->pr_nout >
                    pl->limit) {
                        error = EBUSY;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        goto fail;
                }
                /* Fragments reference mbuf clusters. */
                if (pl->index == PF_LIMIT_FRAGS && pl->limit > nmbclust) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        goto fail;
                }
 
                pf_pool_limits[pl->index].limit_new = pl->limit;
                pl->limit = pf_pool_limits[pl->index].limit;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2007,10 +1932,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int32_t       *level = (u_int32_t *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                pf_trans_set.debug = *level;
                pf_trans_set.mask |= PF_TSET_DEBUG;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2021,11 +1944,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pf_anchor        *anchor;
 
                NET_LOCK();
-               PF_LOCK();
                pr->path[sizeof(pr->path) - 1] = '\0';
                if ((ruleset = pf_find_ruleset(pr->path)) == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -2040,7 +1961,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                            &ruleset->anchor->children)
                                pr->nr++;
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2052,11 +1972,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int32_t                nr = 0;
 
                NET_LOCK();
-               PF_LOCK();
                pr->path[sizeof(pr->path) - 1] = '\0';
                if ((ruleset = pf_find_ruleset(pr->path)) == NULL) {
                        error = EINVAL;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        break;
                }
@@ -2078,7 +1996,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                        break;
                                }
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                if (!pr->name[0])
                        error = EBUSY;
@@ -2093,10 +2010,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_clr_tables(&io->pfrio_table, &io->pfrio_ndel,
                    io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2109,10 +2024,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_add_tables(io->pfrio_buffer, io->pfrio_size,
                    &io->pfrio_nadd, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2125,10 +2038,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_del_tables(io->pfrio_buffer, io->pfrio_size,
                    &io->pfrio_ndel, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2141,10 +2052,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_get_tables(&io->pfrio_table, io->pfrio_buffer,
                    &io->pfrio_size, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2157,10 +2066,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_get_tstats(&io->pfrio_table, io->pfrio_buffer,
                    &io->pfrio_size, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2173,10 +2080,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_clr_tstats(io->pfrio_buffer, io->pfrio_size,
                    &io->pfrio_nzero, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2189,11 +2094,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_set_tflags(io->pfrio_buffer, io->pfrio_size,
                    io->pfrio_setflag, io->pfrio_clrflag, &io->pfrio_nchange,
                    &io->pfrio_ndel, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2206,10 +2109,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_clr_addrs(&io->pfrio_table, &io->pfrio_ndel,
                    io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2222,11 +2123,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_add_addrs(&io->pfrio_table, io->pfrio_buffer,
                    io->pfrio_size, &io->pfrio_nadd, io->pfrio_flags |
                    PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2239,11 +2138,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_del_addrs(&io->pfrio_table, io->pfrio_buffer,
                    io->pfrio_size, &io->pfrio_ndel, io->pfrio_flags |
                    PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2256,12 +2153,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_set_addrs(&io->pfrio_table, io->pfrio_buffer,
                    io->pfrio_size, &io->pfrio_size2, &io->pfrio_nadd,
                    &io->pfrio_ndel, &io->pfrio_nchange, io->pfrio_flags |
                    PFR_FLAG_USERIOCTL, 0);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2274,10 +2169,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_get_addrs(&io->pfrio_table, io->pfrio_buffer,
                    &io->pfrio_size, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2290,10 +2183,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_get_astats(&io->pfrio_table, io->pfrio_buffer,
                    &io->pfrio_size, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2306,11 +2197,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_clr_astats(&io->pfrio_table, io->pfrio_buffer,
                    io->pfrio_size, &io->pfrio_nzero, io->pfrio_flags |
                    PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2323,11 +2212,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_tst_addrs(&io->pfrio_table, io->pfrio_buffer,
                    io->pfrio_size, &io->pfrio_nmatch, io->pfrio_flags |
                    PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2340,11 +2227,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfr_ina_define(&io->pfrio_table, io->pfrio_buffer,
                    io->pfrio_size, &io->pfrio_nadd, &io->pfrio_naddr,
                    io->pfrio_ticket, io->pfrio_flags | PFR_FLAG_USERIOCTL);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2374,12 +2259,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                ioe = malloc(sizeof(*ioe), M_TEMP, M_WAITOK);
                table = malloc(sizeof(*table), M_TEMP, M_WAITOK);
                NET_LOCK();
-               PF_LOCK();
                pf_default_rule_new = pf_default_rule;
                memset(&pf_trans_set, 0, sizeof(pf_trans_set));
                for (i = 0; i < io->size; i++) {
                        if (copyin(io->array+i, ioe, sizeof(*ioe))) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2388,7 +2271,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        }
                        if (strnlen(ioe->anchor, sizeof(ioe->anchor)) ==
                            sizeof(ioe->anchor)) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2402,7 +2284,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                    sizeof(table->pfrt_anchor));
                                if ((error = pfr_ina_begin(table,
                                    &ioe->ticket, NULL, 0))) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2412,7 +2293,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        case PF_TRANS_RULESET:
                                if ((error = pf_begin_rules(&ioe->ticket,
                                    ioe->anchor))) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2420,7 +2300,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                }
                                break;
                        default:
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2428,7 +2307,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                goto fail;
                        }
                        if (copyout(ioe, io->array+i, sizeof(io->array[i]))) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2436,7 +2314,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                goto fail;
                        }
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                free(table, M_TEMP, sizeof(*table));
                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2456,10 +2333,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                ioe = malloc(sizeof(*ioe), M_TEMP, M_WAITOK);
                table = malloc(sizeof(*table), M_TEMP, M_WAITOK);
                NET_LOCK();
-               PF_LOCK();
                for (i = 0; i < io->size; i++) {
                        if (copyin(io->array+i, ioe, sizeof(*ioe))) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2468,7 +2343,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        }
                        if (strnlen(ioe->anchor, sizeof(ioe->anchor)) ==
                            sizeof(ioe->anchor)) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2482,7 +2356,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                    sizeof(table->pfrt_anchor));
                                if ((error = pfr_ina_rollback(table,
                                    ioe->ticket, NULL, 0))) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2492,7 +2365,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        case PF_TRANS_RULESET:
                                if ((error = pf_rollback_rules(ioe->ticket,
                                    ioe->anchor))) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2500,7 +2372,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                }
                                break;
                        default:
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2508,7 +2379,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                goto fail; /* really bad */
                        }
                }
-               PF_UNLOCK();
                NET_UNLOCK();
                free(table, M_TEMP, sizeof(*table));
                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2529,11 +2399,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                ioe = malloc(sizeof(*ioe), M_TEMP, M_WAITOK);
                table = malloc(sizeof(*table), M_TEMP, M_WAITOK);
                NET_LOCK();
-               PF_LOCK();
                /* first makes sure everything will succeed */
                for (i = 0; i < io->size; i++) {
                        if (copyin(io->array+i, ioe, sizeof(*ioe))) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2542,7 +2410,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        }
                        if (strnlen(ioe->anchor, sizeof(ioe->anchor)) ==
                            sizeof(ioe->anchor)) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2554,7 +2421,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                rs = pf_find_ruleset(ioe->anchor);
                                if (rs == NULL || !rs->topen || ioe->ticket !=
                                     rs->tticket) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2568,7 +2434,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                    !rs->rules.inactive.open ||
                                    rs->rules.inactive.ticket !=
                                    ioe->ticket) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2577,7 +2442,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                }
                                break;
                        default:
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2593,7 +2457,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                for (i = 0; i < PF_LIMIT_MAX; i++) {
                        if (((struct pool *)pf_pool_limits[i].pp)->pr_nout >
                            pf_pool_limits[i].limit_new) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2604,7 +2467,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                /* now do the commit - no errors should happen here */
                for (i = 0; i < io->size; i++) {
                        if (copyin(io->array+i, ioe, sizeof(*ioe))) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2613,7 +2475,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        }
                        if (strnlen(ioe->anchor, sizeof(ioe->anchor)) ==
                            sizeof(ioe->anchor)) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2627,7 +2488,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                    sizeof(table->pfrt_anchor));
                                if ((error = pfr_ina_commit(table, ioe->ticket,
                                    NULL, NULL, 0))) {
-                                       PF_UNLOCK();
                                        NET_UNLOCK();
                                        free(table, M_TEMP, sizeof(*table));
                                        free(ioe, M_TEMP, sizeof(*ioe));
@@ -2635,6 +2495,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                }
                                break;
                        case PF_TRANS_RULESET:
+                               PF_LOCK();
                                if ((error = pf_commit_rules(ioe->ticket,
                                    ioe->anchor))) {
                                        PF_UNLOCK();
@@ -2643,9 +2504,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                                        free(ioe, M_TEMP, sizeof(*ioe));
                                        goto fail; /* really bad */
                                }
+                               PF_UNLOCK();
                                break;
                        default:
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2658,7 +2519,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                            pf_pool_limits[i].limit &&
                            pool_sethardlimit(pf_pool_limits[i].pp,
                            pf_pool_limits[i].limit_new, NULL, 0) != 0) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(table, M_TEMP, sizeof(*table));
                                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2678,7 +2538,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                }
                pfi_xcommit();
                pf_trans_set_commit();
-               PF_UNLOCK();
                NET_UNLOCK();
                free(table, M_TEMP, sizeof(*table));
                free(ioe, M_TEMP, sizeof(*ioe));
@@ -2694,12 +2553,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                pstore = malloc(sizeof(*pstore), M_TEMP, M_WAITOK);
 
                NET_LOCK();
-               PF_LOCK();
                if (space == 0) {
                        RB_FOREACH(n, pf_src_tree, &tree_src_tracking)
                                nr++;
                        psn->psn_len = sizeof(struct pf_src_node) * nr;
-                       PF_UNLOCK();
                        NET_UNLOCK();
                        free(pstore, M_TEMP, sizeof(*pstore));
                        break;
@@ -2734,7 +2591,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
 
                        error = copyout(pstore, p, sizeof(*p));
                        if (error) {
-                               PF_UNLOCK();
                                NET_UNLOCK();
                                free(pstore, M_TEMP, sizeof(*pstore));
                                goto fail;
@@ -2744,7 +2600,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                }
                psn->psn_len = sizeof(struct pf_src_node) * nr;
 
-               PF_UNLOCK();
                NET_UNLOCK();
                free(pstore, M_TEMP, sizeof(*pstore));
                break;
@@ -2755,7 +2610,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pf_state         *state;
 
                NET_LOCK();
-               PF_LOCK();
                PF_STATE_ENTER_WRITE();
                RB_FOREACH(state, pf_state_tree_id, &tree_id)
                        pf_src_tree_remove_state(state);
@@ -2763,7 +2617,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                RB_FOREACH(n, pf_src_tree, &tree_src_tracking)
                        n->expire = 1;
                pf_purge_expired_src_nodes();
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2776,7 +2629,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int                   killed = 0;
 
                NET_LOCK();
-               PF_LOCK();
                RB_FOREACH(sn, pf_src_tree, &tree_src_tracking) {
                        if (pf_match_addr(psnk->psnk_src.neg,
                                &psnk->psnk_src.addr.v.a.addr,
@@ -2804,7 +2656,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        pf_purge_expired_src_nodes();
 
                psnk->psnk_killed = killed;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2813,13 +2664,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int32_t       *hostid = (u_int32_t *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                if (*hostid == 0)
                        pf_trans_set.hostid = arc4random();
                else
                        pf_trans_set.hostid = *hostid;
                pf_trans_set.mask |= PF_TSET_HOSTID;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2836,10 +2685,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                        break;
                }
                NET_LOCK();
-               PF_LOCK();
                error = pfi_get_ifaces(io->pfiio_name, io->pfiio_buffer,
                    &io->pfiio_size);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2848,9 +2695,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_iface *io = (struct pfioc_iface *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                error = pfi_set_flags(io->pfiio_name, io->pfiio_flags);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2859,9 +2704,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_iface *io = (struct pfioc_iface *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                error = pfi_clear_flags(io->pfiio_name, io->pfiio_flags);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2870,10 +2713,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int32_t       *reass = (u_int32_t *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                pf_trans_set.reass = *reass;
                pf_trans_set.mask |= PF_TSET_REASS;
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2882,9 +2723,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_synflwats *io = (struct pfioc_synflwats *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                error = pf_syncookies_setwats(io->hiwat, io->lowat);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2893,9 +2732,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                struct pfioc_synflwats *io = (struct pfioc_synflwats *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                error = pf_syncookies_getwats(io);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
@@ -2904,9 +2741,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t a
                u_int8_t        *mode = (u_int8_t *)addr;
 
                NET_LOCK();
-               PF_LOCK();
                error = pf_syncookies_setmode(*mode);
-               PF_UNLOCK();
                NET_UNLOCK();
                break;
        }
Index: net/pfvar_priv.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pfvar_priv.h,v
retrieving revision 1.6
diff -u -p -r1.6 pfvar_priv.h
--- net/pfvar_priv.h    9 Feb 2021 14:06:19 -0000       1.6
+++ net/pfvar_priv.h    17 May 2021 17:38:20 -0000
@@ -37,9 +37,7 @@
 
 #ifdef _KERNEL
 
-#include <sys/rwlock.h>
-
-extern struct rwlock pf_lock;
+#include <sys/mutex.h>
 
 struct pf_pdesc {
        struct {
@@ -104,51 +102,46 @@ extern struct timeout     pf_purge_to;
 struct pf_state                *pf_state_ref(struct pf_state *);
 void                    pf_state_unref(struct pf_state *);
 
-extern struct rwlock   pf_lock;
-extern struct rwlock   pf_state_lock;
+extern struct mutex    pf_lock;
+extern struct mutex    pf_state_lock;
 
 #define PF_LOCK()              do {                    \
                NET_ASSERT_LOCKED();                    \
-               rw_enter_write(&pf_lock);               \
+               mtx_enter(&pf_lock);                    \
        } while (0)
 
 #define PF_UNLOCK()            do {                    \
                PF_ASSERT_LOCKED();                     \
-               rw_exit_write(&pf_lock);                \
+               mtx_leave(&pf_lock);                    \
        } while (0)
 
 #define PF_ASSERT_LOCKED()     do {                    \
-               if (rw_status(&pf_lock) != RW_WRITE)    \
-                       splassert_fail(RW_WRITE,        \
-                           rw_status(&pf_lock),__func__);\
+               MUTEX_ASSERT_LOCKED(&pf_lock);          \
        } while (0)
 
 #define PF_ASSERT_UNLOCKED()   do {                    \
-               if (rw_status(&pf_lock) == RW_WRITE)    \
-                       splassert_fail(0, rw_status(&pf_lock), __func__);\
+               MUTEX_ASSERT_UNLOCKED(&pf_lock);        \
        } while (0)
 
 #define PF_STATE_ENTER_READ()  do {                    \
-               rw_enter_read(&pf_state_lock);          \
+               mtx_enter(&pf_state_lock);              \
        } while (0)
 
 #define PF_STATE_EXIT_READ()   do {                    \
-               rw_exit_read(&pf_state_lock);           \
+               mtx_leave(&pf_state_lock);              \
        } while (0)
 
 #define PF_STATE_ENTER_WRITE() do {                    \
-               rw_enter_write(&pf_state_lock);         \
+               mtx_enter(&pf_state_lock);              \
        } while (0)
 
 #define PF_STATE_EXIT_WRITE()  do {                    \
                PF_ASSERT_STATE_LOCKED();               \
-               rw_exit_write(&pf_state_lock);          \
+               mtx_leave(&pf_state_lock);              \
        } while (0)
 
 #define PF_ASSERT_STATE_LOCKED()       do {            \
-               if (rw_status(&pf_state_lock) != RW_WRITE)\
-                       splassert_fail(RW_WRITE,        \
-                           rw_status(&pf_state_lock), __func__);\
+               MUTEX_ASSERT_LOCKED(&pf_state_lock);    \
        } while (0)
 
 extern void                     pf_purge_timeout(void *);

Reply via email to