From nobody Wed Sep 30 23:19:03 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hw9wY0VFRz6tRG8 for ; Wed, 30 Sep 2026 23:19:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hw9wX6zzgz4Hxd for ; Wed, 30 Sep 2026 23:19:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790810349; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=rReBhOJxiBCvcyTVJPRLqYFTD4pEyg7bGTg8glSx+fc=; b=KbCJ2nH4SWroue+RR5tzN4GUKQ1iqBuTztCtd3V30apl9SxB2HOpFLN4LhiyrAuh03zleQ +VKo9C1NzihHMV3exfOcp9yz23aTZPSaiEluCCXYplcLfOgl+ybpsVdWYCUoaavCLpTSVc 0phkMH7pcd8Hq30rBhBloDUnSFngx8lsZSWbB01HDJZABztLBSCqDqDWZXvY2n9dWQwl95 bPDKhSGTVQ+vYQUJ92s34afaebAeLt3kHVTkRmJga/eeYJf/+PGxmkoREug3bocsNCJMe9 ltBaPN5Uu/WUyr3kYFFgtPM7BOD6yRWDbns6+28gbSHO6vu18mQXG26Tg9E3FQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1790810349; b=W6zoYICw7GKfyKBFE5u/TFFC1dPinWfg1mTvOi2ew652U/XOztLwi58eyoXfoSxkYlH7f+ EaTXI5/jX5zCNi5oeuRQiwfkm3YGiLX7PTkwc2TL+gE5wAvzTIM3tn4AwcyFTeuywf9xOk f8q2wRcfUF5qDH8TjVQ7E2d6VikgZn1q5X9oSyQgmU0fobR8z9htkTRGPuKusFA/rhlemW QA+FTWB3yHeKLiZJWlafsGGDyCynlnJcTQJjVT27HcNK4WTtMqBbPSC4lC3O3VFyTBiZGC JXYsyU14YQpMtsLhWqyKG8SppEoZ/msv+K2V27yI5/cdhvLEstCdcqwEaeKNDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790810349; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=rReBhOJxiBCvcyTVJPRLqYFTD4pEyg7bGTg8glSx+fc=; b=YonUVJJLh5VG/4gKHzkhHvOOK/GzTCxivNjbHu3lzw7bXMgz0N2yUcAN8yilpsAQzZzKcG JQptnkeaT9smEnXqIV3PIHny6T4MyjRnYJV+ygJTygSxVhc6uFjZYHd+hryJau1IV5vvOs RpnSttZPq5lzc6qxqcnhpJ4hpT9zT8FSGMcGDIOXGC7zm36SrFLgR4yuOSJfwlFWNieTvO CN6dIDsWRqQq4TiFiNcsZJLFCwP6fz12EwuThGfQHnnYDdov2U5nROBYqZgXcvmx+0CXaU doO/olf7MWiUB56dhBpmaAr5EeFQndPVmEzKMELX2ebO1n7EgZ9+XU0Jo/+rgw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hw9wX64B3z15mw for ; Wed, 30 Sep 2026 23:19:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 43b01 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 30 Sep 2026 23:19:03 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: R. Christian McDonald Subject: git: c1241c6e30c7 - main - pf: modify pfik_flags atomically List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: rcm X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: c1241c6e30c792fb514f4689d2ed92ee21d3cf39 Auto-Submitted: auto-generated Date: Wed, 30 Sep 2026 23:19:03 +0000 Message-Id: <6abd98e7.43b01.4c711e4a@gitrepo.freebsd.org> The branch main has been updated by rcm: URL: https://cgit.FreeBSD.org/src/commit/?id=c1241c6e30c792fb514f4689d2ed92ee21d3cf39 commit c1241c6e30c792fb514f4689d2ed92ee21d3cf39 Author: R. Christian McDonald AuthorDate: 2026-09-30 22:56:22 +0000 Commit: R. Christian McDonald CommitDate: 2026-09-30 22:56:22 +0000 pf: modify pfik_flags atomically The purge thread sets PFI_IFLAG_REFS on the interfaces that states refer to without the rules lock, under which the other flags are changed. The updates can interleave, so that a "set skip on" is lost, or outlives its removal, until the next ruleset load. Use atomic operations to modify the flags. In the purge thread, only write if the flag is not already set. Reviewed by: kp Approved by: kp (mentor) MFC after: 1 week Sponsored by: Rubicon Communications, LLC ("Netgate") Differential Revision: https://reviews.freebsd.org/D60107 --- sys/netpfil/pf/pf.c | 12 ++++++++++-- sys/netpfil/pf/pf_if.c | 10 +++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c index 9c9509900ea9..73e6900ec6eb 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -3223,6 +3223,14 @@ pf_free_state(struct pf_kstate *cur) pf_counter_u64_add(&V_pf_status.fcounters[FCNT_STATE_REMOVALS], 1); } +static inline void +pf_kkif_mark(struct pfi_kkif *kif) +{ + + if ((atomic_load_int(&kif->pfik_flags) & PFI_IFLAG_REFS) == 0) + atomic_set_int(&kif->pfik_flags, PFI_IFLAG_REFS); +} + /* * Called only from pf_purge_thread(), thus serialized. */ @@ -3258,11 +3266,11 @@ relock: s->nat_rule->rule_ref |= PFRULE_REFS; if (s->anchor != NULL) s->anchor->rule_ref |= PFRULE_REFS; - s->kif->pfik_flags |= PFI_IFLAG_REFS; + pf_kkif_mark(s->kif); SLIST_FOREACH(mrm, &s->match_rules, entry) mrm->r->rule_ref |= PFRULE_REFS; if (s->act.rt_kif) - s->act.rt_kif->pfik_flags |= PFI_IFLAG_REFS; + pf_kkif_mark(s->act.rt_kif); count++; } PF_HASHROW_UNLOCK(ih); diff --git a/sys/netpfil/pf/pf_if.c b/sys/netpfil/pf/pf_if.c index aed1af15fb30..7528e920e433 100644 --- a/sys/netpfil/pf/pf_if.c +++ b/sys/netpfil/pf/pf_if.c @@ -426,7 +426,7 @@ pfi_kkif_remove_if_unref(struct pfi_kkif *kif) } RB_REMOVE(pfi_ifhead, &V_pfi_ifs, kif); - kif->pfik_flags |= PFI_IFLAG_REFS; + atomic_set_int(&kif->pfik_flags, PFI_IFLAG_REFS); mtx_lock(&pfi_unlnkdkifs_mtx); LIST_INSERT_HEAD(&V_pfi_unlinked_kifs, kif, pfik_list); @@ -460,7 +460,7 @@ pfi_kkif_purge(void) LIST_REMOVE(kif, pfik_list); pf_kkif_free(kif); } else - kif->pfik_flags &= ~PFI_IFLAG_REFS; + atomic_clear_int(&kif->pfik_flags, PFI_IFLAG_REFS); } mtx_unlock(&pfi_unlnkdkifs_mtx); } @@ -660,7 +660,7 @@ pfi_kkif_update(struct pfi_kkif *kif) if (tmpkif == NULL) continue; - tmpkif->pfik_flags |= kif->pfik_flags; + atomic_set_int(&tmpkif->pfik_flags, kif->pfik_flags); } } @@ -1018,7 +1018,7 @@ pfi_set_flags(const char *name, int flags) RB_FOREACH(p, pfi_ifhead, &V_pfi_ifs) { if (pfi_skip_if(name, p)) continue; - p->pfik_flags |= flags; + atomic_set_int(&p->pfik_flags, flags); } NET_EPOCH_EXIT(et); return (0); @@ -1034,7 +1034,7 @@ pfi_clear_flags(const char *name, int flags) RB_FOREACH_SAFE(p, pfi_ifhead, &V_pfi_ifs, tmp) { if (pfi_skip_if(name, p)) continue; - p->pfik_flags &= ~flags; + atomic_clear_int(&p->pfik_flags, flags); if (p->pfik_ifp == NULL && p->pfik_group == NULL && p->pfik_flags == 0 && p->pfik_rulerefs == 0) {