From nobody Wed Oct 28 20:35:39 2026 X-Original-To: dev-commits-src-branches@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 4jFJz01NCYz6x5jw for ; Wed, 28 Oct 2026 20:35:40 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4jFJyz4yPXz4Qms for ; Wed, 28 Oct 2026 20:35:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793219739; 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=0Zq8aA2sT5OTeIOBRnP/w7RqIUextZit2fbOlEFiLHo=; b=GDTOdk3jVUEphVfZkY7IThr/H3WOgMshMVWSiqya7yyX+AORGDtalw5D1sSBe7hfdxB/5d 9JWOoDlxVDjGfxnV8Mh4ReA9GFU3L5du7fFeXXZgY+AGXh27IJ2PE731+DNWQdJWgG8hyO Zaxw91Tg65ASo2ZcYOVGLAcEuEr1ELRVyF6d73pGnv7AWyOc06NbQbBz+CpL+SDbX8uLFC 2TMbTjQOe/HDtEF0pGzmE8mEaPKXdCfynQ07PwCNRxVcMWPy/FmaYdbsLJIDJSCcL+8Kj0 Yk6in3/we9g8BCy70RLu9CAgDeL8LDN0TwzgQandxdqKo/xcoVn/oXXojjhuGw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1793219739; b=JHIFQPKWCGrvz1NNQm+Wi3A9mc3yYSLSXGKthbvgSummqI0qh4wjIem4X1KZWXmiJkAycy ThlSuDTlsYBsV4en/paLyQVXhA6c+2sxS56+TagrJLXiYeS/Pa5x8KV0YZU2zu0WJ0e5d3 bX1KSF20e/Faf6vU09rhNpmxUQcBkLgEalhRS6IRIjBPpddOoretXZN+IHO0ViEAGDLKke thu0ONdol9ORfFC5D4h990tM8A+2eeDqGxn8hRAgv1948ZvfKg+UjlcYpFnm0I85JsbYO4 8IavXYamarHAZ1BEnDOwLF8Qbuh5D4n8lijE0pF+7jcM8LFWKmZRTRejJ3OkwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1793219739; 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=0Zq8aA2sT5OTeIOBRnP/w7RqIUextZit2fbOlEFiLHo=; b=f91B22NYB9UmFdKpy58WhxLq5iHtlFRNqubdJ/uGgvnltZIKpF0//AURS4qHpCRaTmcBOD EuMquqHxCTuZhv8i5LINYIW/60xpyQWr9XrUtTgsZYvkcT5eIh6IDtSytF4HhVDYTkUKtY mZz70/5SUArzR6TFx3X1ngmQG2i1DReRgVawVwq8DmAX0BzCBzvrhQt2WuMfhzK1D/aKl3 zofYdifPpMtFKNLwgAMYAljDStkPwrkMXmg2MewbC88eOuKgy8YvmAQU5AgGLIQZDceaWy K1fxXnGGENyuPEIs+uKhN3dzkh1CCb+PiYkTw6rw1fAUWTutiq1AIf+7XgdnlA== 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 4jFJyz4d7vz1Mtv for ; Wed, 28 Oct 2026 20:35:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1d0b4 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 28 Oct 2026 20:35:39 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: R. Christian McDonald Subject: git: a928edf20d46 - stable/15 - pf: modify pfik_flags atomically List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: Commits to the stable branches of the FreeBSD src repository 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/stable/15 X-Git-Reftype: branch X-Git-Commit: a928edf20d46a2a2d1de3ea1f40a687e31683313 Auto-Submitted: auto-generated Date: Wed, 28 Oct 2026 20:35:39 +0000 Message-Id: <6ae25c9b.1d0b4.63467340@gitrepo.freebsd.org> The branch stable/15 has been updated by rcm: URL: https://cgit.FreeBSD.org/src/commit/?id=a928edf20d46a2a2d1de3ea1f40a687e31683313 commit a928edf20d46a2a2d1de3ea1f40a687e31683313 Author: R. Christian McDonald AuthorDate: 2026-09-30 22:56:22 +0000 Commit: R. Christian McDonald CommitDate: 2026-10-28 20:34:03 +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 (cherry picked from commit c1241c6e30c792fb514f4689d2ed92ee21d3cf39) --- 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 ea081fa90b34..8c2b905b4ba0 100644 --- a/sys/netpfil/pf/pf.c +++ b/sys/netpfil/pf/pf.c @@ -2908,6 +2908,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. */ @@ -2943,11 +2951,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 5703c6712d80..d108d7a2e86a 100644 --- a/sys/netpfil/pf/pf_if.c +++ b/sys/netpfil/pf/pf_if.c @@ -421,7 +421,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); @@ -455,7 +455,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); } @@ -648,7 +648,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); } } @@ -1006,7 +1006,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); @@ -1022,7 +1022,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) {