From nobody Fri Sep 18 21:31:54 2026 X-Original-To: dev-commits-src-all@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 4hmm6L6966z6t12v for ; Fri, 18 Sep 2026 21:31:54 +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 4hmm6L47Dlz4vrj for ; Fri, 18 Sep 2026 21:31:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789767114; 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=PCN9V60XZsM2jqHh34/QrhbCuvNCR6aSigkhmX+qdfs=; b=dFGKXolXVMSlPrBIclHc8O7gK6fYeCXbVoMa/hWx3EdB43mUSiySYeRuN2VXlXKFF3vpnz z0Gef8MW3/Lxxya5WYagQWRBI12hMJ21hEq3kdSmS1+FnmgaFO+OMP3foI26ucl/pFIau9 Mirj0SrjytcOk8ujQo18q88XhVbQmRpH0Rqu1LASI/ZeTE262r+EclTO3uMpNCNAsbEjX2 dDnC2a89whSBzdVSkDf75VCrE0G5ThRtYPLYCdzu/dxQ75MHBiTxLbdhzYqseyLNj7o7Yg TjHCGIanB0GzaJ4vbf9s+SPrtthOJMERJSTplSPy6mRPqGPNFrB5knx/7Wc5SQ== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1789767114; b=Z4s8KI7sZhY70WmwFC2D7C8Re9G38PdmQMPV4aV6KReqfK5XKtN9tIH4z3beSUML4lz01k 3ST/jyYbDXxEKsR49A2L/ijTxXbH5RdIMPnPffdJ8H0NGviqSzUS3MRkSC3aDdCvt39PJj gMbEy2yZ5e5fsGvQj7/MbNpgdAC37DFnSVORi+EcpeXLkOxom24s/5CAikcjSpcCSh7hZ4 oZxsIS0PnwevAO4ZWqzwm+/uNb3gZqA0M4lsQre6YAF05dMHkUiDZ3Wu4rA4T3GScgLfDz hB6l0p6rhJLIv2dylBsUj92LLfG/v98zJRa0Fwd2+epQmTGVbXBeX0O25mL9Pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1789767114; 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=PCN9V60XZsM2jqHh34/QrhbCuvNCR6aSigkhmX+qdfs=; b=OFSoXjgcQKfgl0u26kmszkPVo+zdMlhy5YntsSnLDRErxsVLKiprwTbYO8p+jqmcyadnpf dc+lrqLY+4N69z5eDtsPGM7ZGmpZAv2zU+qKcv6zm/luO3FnOuBqeERgUqMr4Y+Zz6BCMO tHQuoXNfS8+Eq++aahCw9NUE8c+Aa7IwvHhzruVhVyYVzC4bfEUgcVL4v2o9Lgjw1GC4JJ jcSBOSD3EiiwlwVau36upOqLG0sU0X6Mwb/24r3zyh0oLl8GkGmfaIFhyN8SC67NSMWslT msL9JqfkQtDGhadXfgHJ4PeaCRoC87MekMM+S8UrxxbzLuayAPtiDRW1OsCGWA== 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 4hmm6L2JpzzdJg for ; Fri, 18 Sep 2026 21:31:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 47ae6 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 18 Sep 2026 21:31:54 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: 3b498d515faf - main - buf_ring: support different lock classes List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@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: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3b498d515faf2221798a64dc15ec0ff1f371de5d Auto-Submitted: auto-generated Date: Fri, 18 Sep 2026 21:31:54 +0000 Message-Id: <6aadadca.47ae6.7724b433@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=3b498d515faf2221798a64dc15ec0ff1f371de5d commit 3b498d515faf2221798a64dc15ec0ff1f371de5d Author: Gleb Smirnoff AuthorDate: 2026-09-18 21:18:16 +0000 Commit: Gleb Smirnoff CommitDate: 2026-09-18 21:20:25 +0000 buf_ring: support different lock classes And enable locking assertions for INVARIANTS kernel. Reviewed by: gallatin, kib, markj Differential Revision: https://reviews.freebsd.org/D59457 --- share/man/man9/buf_ring.9 | 11 ++++++++--- sys/kern/subr_bufring.c | 7 +++---- sys/net/if_ovpn.c | 2 +- sys/netinet/ip_mroute.c | 3 ++- sys/sys/buf_ring.h | 38 +++++++++++++++++++------------------- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/share/man/man9/buf_ring.9 b/share/man/man9/buf_ring.9 index ae3b8505ce8c..29a5e2580800 100644 --- a/share/man/man9/buf_ring.9 +++ b/share/man/man9/buf_ring.9 @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd September 27, 2012 +.Dd September 18, 2026 .Dt BUF_RING 9 .Os .Sh NAME @@ -42,7 +42,7 @@ .In sys/param.h .In sys/buf_ring.h .Ft struct buf_ring * -.Fn buf_ring_alloc "int count" "struct malloc_type *type" "int flags" "struct mtx *sc_lock" +.Fn buf_ring_alloc "int count" "struct malloc_type *type" "int flags" "lock" .Ft void .Fn buf_ring_free "struct buf_ring *br" "struct malloc_type *type" .Ft int @@ -74,7 +74,12 @@ slots using malloc_type and memory flags .Fa flags . The single consumer interface is protected by -.Fa sc_lock . +.Fa lock . +Supported lock types are +.Xr mutex 9 , +.Xr rwlock 9 , +and +.Xr rmlock 9 . .Pp The .Fn buf_ring_free diff --git a/sys/kern/subr_bufring.c b/sys/kern/subr_bufring.c index 8ae061c559fb..25691be69be2 100644 --- a/sys/kern/subr_bufring.c +++ b/sys/kern/subr_bufring.c @@ -33,7 +33,8 @@ #include struct buf_ring * -buf_ring_alloc(int count, struct malloc_type *type, int flags, struct mtx *lock) +_buf_ring_alloc(int count, struct malloc_type *type, int flags, + struct lock_object *lo) { struct buf_ring *br; @@ -43,9 +44,7 @@ buf_ring_alloc(int count, struct malloc_type *type, int flags, struct mtx *lock) type, flags | M_ZERO); if (br == NULL) return (NULL); -#ifdef DEBUG_BUFRING - br->br_lock = lock; -#endif + br->br_lock = lo; br->br_prod_size = br->br_cons_size = count; br->br_prod_mask = br->br_cons_mask = count-1; br->br_prod_head = br->br_cons_head = 0; diff --git a/sys/net/if_ovpn.c b/sys/net/if_ovpn.c index 28e60efaeaa5..385037268230 100644 --- a/sys/net/if_ovpn.c +++ b/sys/net/if_ovpn.c @@ -2744,7 +2744,7 @@ ovpn_clone_create(struct if_clone *ifc, char *name, size_t len, rm_init_flags(&sc->lock, "if_ovpn_lock", RM_RECURSE); sc->refcount = 0; - sc->notifring = buf_ring_alloc(32, M_OVPN, M_WAITOK, NULL); + sc->notifring = buf_ring_alloc(32, M_OVPN, M_WAITOK, &sc->lock); COUNTER_ARRAY_ALLOC(sc->counters, OVPN_COUNTER_SIZE, M_WAITOK); diff --git a/sys/netinet/ip_mroute.c b/sys/netinet/ip_mroute.c index d18a9865f9bc..1e0043b4e4fe 100644 --- a/sys/netinet/ip_mroute.c +++ b/sys/netinet/ip_mroute.c @@ -403,7 +403,8 @@ mfc_alloc(void) if (rt == NULL) return rt; - rt->mfc_stall_ring = buf_ring_alloc(MAX_UPQ, M_MRTABLE, M_NOWAIT, NULL); + rt->mfc_stall_ring = buf_ring_alloc(MAX_UPQ, M_MRTABLE, M_NOWAIT, + NOLOCK); if (rt->mfc_stall_ring == NULL) { free(rt, M_MRTABLE); return NULL; diff --git a/sys/sys/buf_ring.h b/sys/sys/buf_ring.h index 07a4fa52891e..db934e083e1a 100644 --- a/sys/sys/buf_ring.h +++ b/sys/sys/buf_ring.h @@ -36,9 +36,12 @@ #include #include -#if defined(DEBUG_BUFRING) && defined(_KERNEL) +#if defined(_KERNEL) #include -#include +#define BR_LOCK_ASSERT(br) \ + LOCK_CLASS((br)->br_lock)->lc_assert((br)->br_lock, LA_XLOCKED) +#else +#define BR_LOCK_ASSERT(br) do {} while (0) #endif /* @@ -60,9 +63,7 @@ struct buf_ring { uint32_t br_cons_tail; int br_cons_size; int br_cons_mask; -#if defined(DEBUG_BUFRING) && defined(_KERNEL) - struct mtx *br_lock; -#endif + struct lock_object *br_lock; void *br_ring[0] __aligned(CACHE_LINE_SIZE); }; @@ -195,6 +196,8 @@ buf_ring_dequeue_sc(struct buf_ring *br) uint32_t prod_tail, mask; void *buf; + BR_LOCK_ASSERT(br); + mask = br->br_cons_mask; cons_head = atomic_load_32(&br->br_cons_head); prod_tail = atomic_load_acq_32(&br->br_prod_tail); @@ -210,10 +213,6 @@ buf_ring_dequeue_sc(struct buf_ring *br) #ifdef DEBUG_BUFRING br->br_ring[cons_idx] = NULL; -#ifdef _KERNEL - if (!mtx_owned(br->br_lock)) - panic("lock not held on single consumer dequeue"); -#endif if (atomic_load_32(&br->br_cons_tail) != cons_head) panic("inconsistent list cons_tail=%d cons_head=%d", atomic_load_32(&br->br_cons_tail), cons_head); @@ -287,10 +286,9 @@ buf_ring_peek(struct buf_ring *br) { uint32_t cons_head, prod_tail, mask; -#if defined(DEBUG_BUFRING) && defined(_KERNEL) - if ((br->br_lock != NULL) && !mtx_owned(br->br_lock)) - panic("lock not held on single consumer dequeue"); -#endif + if (br->br_lock != NULL) + BR_LOCK_ASSERT(br); + mask = br->br_cons_mask; prod_tail = atomic_load_acq_32(&br->br_prod_tail); cons_head = atomic_load_32(&br->br_cons_head); @@ -307,10 +305,7 @@ buf_ring_peek_clear_sc(struct buf_ring *br) uint32_t cons_head, prod_tail, mask; void *buf; -#if defined(DEBUG_BUFRING) && defined(_KERNEL) - if (!mtx_owned(br->br_lock)) - panic("lock not held on single consumer dequeue"); -#endif + BR_LOCK_ASSERT(br); mask = br->br_cons_mask; prod_tail = atomic_load_acq_32(&br->br_prod_tail); @@ -355,8 +350,13 @@ buf_ring_count(struct buf_ring *br) } #ifdef _KERNEL -struct buf_ring *buf_ring_alloc(int count, struct malloc_type *type, int flags, - struct mtx *); +struct buf_ring *_buf_ring_alloc(int count, struct malloc_type *type, + int flags, struct lock_object *); +#define buf_ring_alloc(c, mt, f, lk) _Generic((lk), \ + struct mtx *: _buf_ring_alloc((c), (mt), (f), lk2lo(lk)), \ + struct mtx_padalign *: _buf_ring_alloc((c), (mt), (f), lk2lo(lk)),\ + struct rwlock *: _buf_ring_alloc((c), (mt), (f), lk2lo(lk)), \ + struct rmlock *: _buf_ring_alloc((c), (mt), (f), lk2lo(lk))) void buf_ring_free(struct buf_ring *br, struct malloc_type *type); #else