From nobody Sat May 30 23:51:44 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 4gScSw4WsKz6gtjl for ; Sat, 30 May 2026 23:51:44 +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 4gScSw2VdWz3bfb for ; Sat, 30 May 2026 23:51:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1780185104; 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=26705TwZti5b7XMvmkwEEQMSQ3fl8Lyl03vpxP5zQ+o=; b=EaKjVt26EC9TFIKSu66jCevm5WVtGMWYP/NkPXJFKwjXrf7uaKHDpYuYiaJvGIz7P58Pg7 eTnqolxn0WlFEpGOgW63izUitmpaKkKcfVSkhXQKcG435V/vm4Tb0GVM1Jve5kK+ereeD/ oiyzdyZbk6DeqsHR4OYqM195qW8fVEhmAFyi2XZtkF5bKQMFJxamOZ9kDBEKiK+4m5+0U1 v/h37bALBedPYqogoOFQf9lc62ml5SMdkDy7L1Y/kB00esk298rLUoP0hmmc7htrBd5Dlh IamTDjrietADQ7CjEYHFgJS6Qp+Dxr1SCccJNlSL/WvT4KOhXDdJKU66V3/quA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1780185104; a=rsa-sha256; cv=none; b=YxJ1i+/5TyZyucFAX6dgl387snEPRyxhQvTlpMZjljiWQZ5ipoBBUlWvYuhflnZ0Rj3TqR FZCiWOx/abTXztD88rgNYYsNbyKtNR+fUhmbNgX2tfsxETW7FwyHc1m2/M9FxrBoQ4lrMb 9ic4G7ozF8BbkJQihhvJhdREicHoWE6awDnAhbhEeyi2exVS8NwHUkL6zw1Og8ZXZja9ag he05CZEdthGe2+iAjbqryH9XEmle24PnDUsUDDSNJe8ErKLMH6ewA2vxoK4ul1qW9tsYcF Te9XkMYfn1e21OBYncowRC7AVx0kEHbZgwsozL4FGR+QjbC2qBaP4iUaNckUtQ== 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=1780185104; 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=26705TwZti5b7XMvmkwEEQMSQ3fl8Lyl03vpxP5zQ+o=; b=O2jvcAQJsT3bALvcza/s+mBBPdAZBe8eJkEABjqiMFMzmbYCkSrXEQ3w1U4LIkIupwgCsy JZLPbeleYH4E3qycVYCbhkCJ6rPf76m0+wRw2tc1Nqb7I4hDdmHM6dckjatWpbVVzlnfYl irhgs0Dg8OFXXd7pENKEcheSOWuUTOHpNYp0IC83dNxLhvnAc2qmfg3EpzaYcoUVsHptll PjEhdwUY6Qmn9HjSkEEKaBAvKToIQmWkPiBvymjDi7hzVIghXo43394TTgJgaUNY7KFkzr cCH2BaZDRcHaq2IxLUKQlU4A86VCu5zk8rVm9O9F2mYFYR034xMJllf17tjAcQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gScSw24YNzBDh for ; Sat, 30 May 2026 23:51:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1910b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 30 May 2026 23:51:44 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Bjoern A. Zeeb Subject: git: b53eab322946 - main - LinuxKPi: idr: use macros for lock idr lock operations 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: bz X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: b53eab322946e88fb95ea4e143d1147d3de18d04 Auto-Submitted: auto-generated Date: Sat, 30 May 2026 23:51:44 +0000 Message-Id: <6a1b7810.1910b.37c17b6e@gitrepo.freebsd.org> The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=b53eab322946e88fb95ea4e143d1147d3de18d04 commit b53eab322946e88fb95ea4e143d1147d3de18d04 Author: Bjoern A. Zeeb AuthorDate: 2026-02-17 03:06:19 +0000 Commit: Bjoern A. Zeeb CommitDate: 2026-05-30 21:45:47 +0000 LinuxKPi: idr: use macros for lock idr lock operations Our idr implementation is using a mtx lock which in the past has already caused problems (613723bac219c). In order to make it easier to tackle the problem start by factoring out all the operations related to the idr->lock into macros as we have often done in other parts of code as well. Sponsored by: The FreeBSD Foundation MFC after: 3 days Reviewed by: wulf, emaste Differential Revision: https://reviews.freebsd.org/D55392 --- sys/compat/linuxkpi/common/src/linux_idr.c | 67 +++++++++++++++++------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_idr.c b/sys/compat/linuxkpi/common/src/linux_idr.c index 664177835c85..7e5f0d28867e 100644 --- a/sys/compat/linuxkpi/common/src/linux_idr.c +++ b/sys/compat/linuxkpi/common/src/linux_idr.c @@ -62,6 +62,13 @@ DPCPU_DEFINE_STATIC(struct linux_idr_cache, linux_idr_cache); */ static MALLOC_DEFINE(M_IDR, "idr", "Linux IDR compat"); +#define IDR_LOCK_INIT(_idr) mtx_init(&(_idr)->lock, "idr", NULL, MTX_DEF); +#define IDR_LOCK_DESTROY(_idr) mtx_destroy(&(_idr)->lock); +#define IDR_LOCK(_idr) mtx_lock(&(_idr)->lock); +#define IDR_UNLOCK(_idr) mtx_unlock(&(_idr)->lock); +#define IDR_LOCK_ASSERT(_idr) mtx_assert(&(_idr)->lock, MA_OWNED); +#define IDR_LOCK_INITALIZED(_idr) mtx_initialized(&(_idr)->lock) + static struct idr_layer * idr_preload_dequeue_locked(struct linux_idr_cache *lic) { @@ -168,7 +175,7 @@ void idr_init(struct idr *idr) { bzero(idr, sizeof(*idr)); - mtx_init(&idr->lock, "idr", NULL, MTX_DEF); + IDR_LOCK_INIT(idr); } /* Only frees cached pages. */ @@ -182,17 +189,17 @@ idr_destroy(struct idr *idr) * without a idr_init(). Check if this is the case. If we do not do this * then the mutex will panic while asserting that it is valid. */ - if (mtx_initialized(&idr->lock) == 0) + if (IDR_LOCK_INITALIZED(idr) == 0) return; idr_remove_all(idr); - mtx_lock(&idr->lock); + IDR_LOCK(idr); for (il = idr->free; il != NULL; il = iln) { iln = il->ary[0]; free(il, M_IDR); } - mtx_unlock(&idr->lock); - mtx_destroy(&idr->lock); + IDR_UNLOCK(idr); + IDR_LOCK_DESTROY(idr); } static void @@ -215,11 +222,11 @@ void idr_remove_all(struct idr *idr) { - mtx_lock(&idr->lock); + IDR_LOCK(idr); idr_remove_layer(idr->top, idr->layers - 1); idr->top = NULL; idr->layers = 0; - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); } static void * @@ -266,9 +273,9 @@ idr_remove(struct idr *idr, int id) { void *res; - mtx_lock(&idr->lock); + IDR_LOCK(idr); res = idr_remove_locked(idr, id); - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (res); } @@ -298,7 +305,7 @@ idr_replace(struct idr *idr, void *ptr, int id) void *res; int idx; - mtx_lock(&idr->lock); + IDR_LOCK(idr); il = idr_find_layer_locked(idr, id); idx = id & IDR_MASK; @@ -309,7 +316,7 @@ idr_replace(struct idr *idr, void *ptr, int id) res = il->ary[idx]; il->ary[idx] = ptr; } - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (res); } @@ -319,7 +326,7 @@ idr_find_locked(struct idr *idr, int id) struct idr_layer *il; void *res; - mtx_assert(&idr->lock, MA_OWNED); + IDR_LOCK_ASSERT(idr); il = idr_find_layer_locked(idr, id); if (il != NULL) res = il->ary[id & IDR_MASK]; @@ -333,9 +340,9 @@ idr_find(struct idr *idr, int id) { void *res; - mtx_lock(&idr->lock); + IDR_LOCK(idr); res = idr_find_locked(idr, id); - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (res); } @@ -345,7 +352,7 @@ idr_get_next(struct idr *idr, int *nextidp) void *res = NULL; int id = *nextidp; - mtx_lock(&idr->lock); + IDR_LOCK(idr); for (; id <= idr_max(idr); id++) { res = idr_find_locked(idr, id); if (res == NULL) @@ -353,7 +360,7 @@ idr_get_next(struct idr *idr, int *nextidp) *nextidp = id; break; } - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (res); } @@ -364,12 +371,12 @@ idr_pre_get(struct idr *idr, gfp_t gfp_mask) struct idr_layer *head; int need; - mtx_lock(&idr->lock); + IDR_LOCK(idr); for (;;) { need = idr->layers + 1; for (il = idr->free; il != NULL; il = il->ary[0]) need--; - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); if (need <= 0) break; for (head = NULL; need; need--) { @@ -385,7 +392,7 @@ idr_pre_get(struct idr *idr, gfp_t gfp_mask) } if (head == NULL) return (0); - mtx_lock(&idr->lock); + IDR_LOCK(idr); il->ary[0] = idr->free; idr->free = head; } @@ -435,7 +442,7 @@ idr_get_new_locked(struct idr *idr, void *ptr, int *idp) int idx; int id; - mtx_assert(&idr->lock, MA_OWNED); + IDR_LOCK_ASSERT(idr); error = -EAGAIN; /* @@ -506,9 +513,9 @@ idr_get_new(struct idr *idr, void *ptr, int *idp) { int retval; - mtx_lock(&idr->lock); + IDR_LOCK(idr); retval = idr_get_new_locked(idr, ptr, idp); - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (retval); } @@ -522,7 +529,7 @@ idr_get_new_above_locked(struct idr *idr, void *ptr, int starting_id, int *idp) int idx, sidx; int id; - mtx_assert(&idr->lock, MA_OWNED); + IDR_LOCK_ASSERT(idr); error = -EAGAIN; /* @@ -624,9 +631,9 @@ idr_get_new_above(struct idr *idr, void *ptr, int starting_id, int *idp) { int retval; - mtx_lock(&idr->lock); + IDR_LOCK(idr); retval = idr_get_new_above_locked(idr, ptr, starting_id, idp); - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (retval); } @@ -643,7 +650,7 @@ idr_alloc_locked(struct idr *idr, void *ptr, int start, int end) int error; int id; - mtx_assert(&idr->lock, MA_OWNED); + IDR_LOCK_ASSERT(idr); if (unlikely(start < 0)) return (-EINVAL); @@ -669,9 +676,9 @@ idr_alloc(struct idr *idr, void *ptr, int start, int end, gfp_t gfp_mask) { int retval; - mtx_lock(&idr->lock); + IDR_LOCK(idr); retval = idr_alloc_locked(idr, ptr, start, end); - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (retval); } @@ -680,13 +687,13 @@ idr_alloc_cyclic(struct idr *idr, void *ptr, int start, int end, gfp_t gfp_mask) { int retval; - mtx_lock(&idr->lock); + IDR_LOCK(idr); retval = idr_alloc_locked(idr, ptr, max(start, idr->next_cyclic_id), end); if (unlikely(retval == -ENOSPC)) retval = idr_alloc_locked(idr, ptr, start, end); if (likely(retval >= 0)) idr->next_cyclic_id = retval + 1; - mtx_unlock(&idr->lock); + IDR_UNLOCK(idr); return (retval); }