From nobody Thu Apr 30 19:42:54 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 4g64Mf6921z6c7f5 for ; Thu, 30 Apr 2026 19:42: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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g64Mf3vLJz3DRW for ; Thu, 30 Apr 2026 19:42:54 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777578174; 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=Gu06OTWpN/GxXFBg09zCJTfqmMHxp/HYi7mOk+S/9U8=; b=OPYYLEFWLJeDLf3JfwJL9qetDD1crR3o+iynOM+Eodu7gJZOYMKsYC2m/DMAvv5IPTDfY/ 2Pc4MDwxsU+lEFyzhsDeACXIF9Xq5HbVegg0F6EkIozo1zuZtQocybvM7nTytU+2TDczdq k9msOyjFAvLWOciy7BK6zGFLGBTuhoBP46wPJ7UINCarGrda79DfyzLHHHdsdQMc8+6obD ZB6k7Kg9CH8GBNhdZ0fcFVXj8SGuaQeA2xvK3urVfwpNK3bpj+EqlBba8rZWEPGj+/G4QL 3dFfyisjLWKErS9R8tLD49XcYQnLqNXPHveFo5CQYezLmx3k0eZ4HrYjd0UfBg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777578174; a=rsa-sha256; cv=none; b=gCUGDqepdJ9ml7THVNYCvzRYmA/+qYqrgdDMeaC4gN1hRHvrbtpsJskZJVDsdBwyoMtn9j V3LlB1kgQ0yx0AFWMT8kHoN2dSnWvQqV89XnbgkeMKpZYrUS/Dukmz07jLdGu8fW3zaS5h eYxPUWy+kmHPuEWeITPqhDRNe8tWAw2EjC6qFsxxNApZ4kCRAD422/m+VzP/coANhSWXUK NZ9lnGVjk6zYqdcwSjRkl5CI+I7NhRyG3ImsTlgjbGtBtDR3DoEtiueL4u7P8dtSduP5FR L8BurARfZstOvH/l+W7VgR6uiDCImsJVNEEiByBwpiko5cNEbjNPO0U1f/fNYw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777578174; 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=Gu06OTWpN/GxXFBg09zCJTfqmMHxp/HYi7mOk+S/9U8=; b=hkmGBuvD0QlpqXxax2AVd95RUcdYfwFDkdRgC6I7yt5Vqh8/OQWzONR94miu0olNq3AlMd 8C2Pa/H1yAyBeUyFQGXyreRO9UiEKhxXbWErtSKyHy3pXh2QRBPP7tMhkpDXAjIuD7/cVO GRP8ww1IkI9NTUQYJjC6mu6lkgw0jnF/2zEeyVznKxyIeNYVqW47mYO6MpFwKEXuh4wrzt GfzSMQ9xlvY1SW0JLI65A8v/9Pur0qQfCPVXT4TMXyQsONNQUXlDMrUJ14NvHe2JgDmoGi itlvlBsk5DGrQ2J9uZkJEKW2VcDxXZkJJj6QkHIX/cL4TG1PXMyyeqHKUMeCxw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g64Mf3JJ6z9Sj for ; Thu, 30 Apr 2026 19:42:54 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3e091 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 30 Apr 2026 19:42:54 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jean-=?utf-8?Q?S=C3=A9bast?==?utf-8?Q?ien P=C3=A9?=dron Subject: git: 4a85d68009d2 - stable/15 - sx: Add `sx_has_waiters()` macro List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dumbbell X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 4a85d68009d2fe591acca6265ebbc7dbac5a9367 Auto-Submitted: auto-generated Date: Thu, 30 Apr 2026 19:42:54 +0000 Message-Id: <69f3b0be.3e091.38bd5c13@gitrepo.freebsd.org> The branch stable/15 has been updated by dumbbell: URL: https://cgit.FreeBSD.org/src/commit/?id=4a85d68009d2fe591acca6265ebbc7dbac5a9367 commit 4a85d68009d2fe591acca6265ebbc7dbac5a9367 Author: Jean-Sébastien Pédron AuthorDate: 2026-04-12 17:20:25 +0000 Commit: Jean-Sébastien Pédron CommitDate: 2026-04-30 18:07:13 +0000 sx: Add `sx_has_waiters()` macro This macro will return non-zero if there are threads waiting for this lock; otherwise, it will return zero. The function assumes (but does not assert) that the caller already holds the lock and that it is interested in other threads waiting for it to release the lock. The motivation to add this is the implementation of `rwsem_is_contended()` in linuxkpi. This Linux function indicates the same thing to the caller: if other threads are waiting for this semaphore. The amdgpu DRM driver started to use `rwsem_is_contended()` in Linux 6.12. Reviewed by: bz, olce Sponsored by: The FreeBSD Foundation (cherry picked from commit eebb643bb3799ae90dd248f0b5047ec481b26f68) --- share/man/man9/sx.9 | 12 +++++++++++- sys/compat/linuxkpi/common/include/linux/rwsem.h | 1 + sys/sys/sx.h | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/share/man/man9/sx.9 b/share/man/man9/sx.9 index 473a47c27cf4..f96ee4ffccf7 100644 --- a/share/man/man9/sx.9 +++ b/share/man/man9/sx.9 @@ -24,7 +24,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH .\" DAMAGE. .\" -.Dd November 11, 2017 +.Dd Apri 30, 2026 .Dt SX 9 .Os .Sh NAME @@ -46,6 +46,7 @@ .Nm sx_sleep , .Nm sx_xholder , .Nm sx_xlocked , +.Nm sx_has_waiters , .Nm sx_assert , .Nm SX_SYSINIT , .Nm SX_SYSINIT_FLAGS @@ -88,6 +89,8 @@ .Fn sx_xholder "struct sx *sx" .Ft int .Fn sx_xlocked "const struct sx *sx" +.Ft int +.Fn sx_has_waiters "const struct sx *sx" .Pp .Cd "options INVARIANTS" .Cd "options INVARIANT_SUPPORT" @@ -268,6 +271,13 @@ is returned instead. will return non-zero if the current thread holds the exclusive lock; otherwise, it will return zero. .Pp +.Fn sx_has_waiters +will return non-zero if there are threads waiting for this lock; +otherwise, it will return zero. +The function assumes (but does not assert) that the caller already holds the +lock and that it is interested in other threads waiting for it to release the +lock. +.Pp For ease of programming, .Fn sx_unlock is provided as a macro frontend to the respective functions, diff --git a/sys/compat/linuxkpi/common/include/linux/rwsem.h b/sys/compat/linuxkpi/common/include/linux/rwsem.h index b7a800b12e18..43688ab93796 100644 --- a/sys/compat/linuxkpi/common/include/linux/rwsem.h +++ b/sys/compat/linuxkpi/common/include/linux/rwsem.h @@ -51,6 +51,7 @@ struct rw_semaphore { #define down_read_nested(_rw, _sc) down_read(_rw) #define init_rwsem(_rw) linux_init_rwsem(_rw, rwsem_name("lnxrwsem")) #define down_write_nest_lock(sem, _rw) down_write(_rw) +#define rwsem_is_contended(_rw) sx_has_waiters(&(_rw)->sx); #ifdef WITNESS_ALL /* NOTE: the maximum WITNESS name is 64 chars */ diff --git a/sys/sys/sx.h b/sys/sys/sx.h index d28cae9d01e5..dab4fffb6f15 100644 --- a/sys/sys/sx.h +++ b/sys/sys/sx.h @@ -259,6 +259,10 @@ __sx_xunlock(struct sx *sx, struct thread *td, const char *file, int line) (void)0; /* ensure void type for expression */ \ }) +/* Return true if there are threads waiting to acquire this sx lock. */ +#define sx_has_waiters(sx) \ + ((SX_READ_VALUE(sx) & SX_LOCK_WAITERS) != 0) + #define sx_unlock(sx) sx_unlock_((sx), LOCK_FILE, LOCK_LINE) #define sx_sleep(chan, sx, pri, wmesg, timo) \