aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2022-02-28 10:39:02 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2022-03-10 17:20:41 +0000
commitb163dcab27862f90e0108a73185945456cafd2f3 (patch)
treeb571ed34f3e3d619943a6e5ae600ebb799743e3d
parentf11b6505f14600d350dfa427f61abb8d1c7e1db4 (diff)
downloadsrc-b163dcab27862f90e0108a73185945456cafd2f3.tar.gz
src-b163dcab27862f90e0108a73185945456cafd2f3.zip
pf: hoist the unlinked rules lock out of the mass rule removal loop
Reviewed by: kp Sponsored by: Rubicon Communications, LLC ("Netgate")
-rw-r--r--sys/netpfil/pf/pf_ioctl.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sys/netpfil/pf/pf_ioctl.c b/sys/netpfil/pf/pf_ioctl.c
index ef7092c0ed1b..68307c9e7bb3 100644
--- a/sys/netpfil/pf/pf_ioctl.c
+++ b/sys/netpfil/pf/pf_ioctl.c
@@ -474,16 +474,26 @@ pf_empty_kpool(struct pf_kpalist *poola)
}
static void
-pf_unlink_rule(struct pf_krulequeue *rulequeue, struct pf_krule *rule)
+pf_unlink_rule_locked(struct pf_krulequeue *rulequeue, struct pf_krule *rule)
{
PF_RULES_WASSERT();
+ PF_UNLNKDRULES_ASSERT();
TAILQ_REMOVE(rulequeue, rule, entries);
- PF_UNLNKDRULES_LOCK();
rule->rule_ref |= PFRULE_REFS;
TAILQ_INSERT_TAIL(&V_pf_unlinked_rules, rule, entries);
+}
+
+static void
+pf_unlink_rule(struct pf_krulequeue *rulequeue, struct pf_krule *rule)
+{
+
+ PF_RULES_WASSERT();
+
+ PF_UNLNKDRULES_LOCK();
+ pf_unlink_rule_locked(rulequeue, rule);
PF_UNLNKDRULES_UNLOCK();
}
@@ -1338,8 +1348,10 @@ pf_commit_rules(u_int32_t ticket, int rs_num, char *anchor)
pf_calc_skip_steps(rs->rules[rs_num].active.ptr);
/* Purge the old rule list. */
+ PF_UNLNKDRULES_LOCK();
while ((rule = TAILQ_FIRST(old_rules)) != NULL)
- pf_unlink_rule(old_rules, rule);
+ pf_unlink_rule_locked(old_rules, rule);
+ PF_UNLNKDRULES_UNLOCK();
if (rs->rules[rs_num].inactive.ptr_array)
free(rs->rules[rs_num].inactive.ptr_array, M_TEMP);
rs->rules[rs_num].inactive.ptr_array = NULL;