From nobody Sat May 10 19:33:10 2025 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 4ZvwyH1TQHz5vkLx; Sat, 10 May 2025 19:33:11 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZvwyG2Z6yz3Syt; Sat, 10 May 2025 19:33:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1746905590; 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=QoRRdnYYeJNdWwZNs/NXTyXPfZ2FNyDbIV43NjVbyiI=; b=Czb+BMaHsjeyptUHvP3L/fAeoPRtRyRYEKnRv5yChpkI5TsoqRziAxxdkcvIQmfFMBwXtU UVkCOetzceMh/4YuaskwU/xlAQU2s+HIa4M+LbxiXW6lNzDfab1IhMacoTan0Vlj44k/Un HwYwmFXAMbsYJobqcDn/Qdw6hPm69lxJShWTucPxyEIuopLA0cEsN0brKgOFH75zvm8k4J PNWYDQbPP0k0DbWgh4mH/TOKbm4WoMLwP8bxHQ9fmLoH5e16bYyoE1fhTQbByJruXx1HJs HBJg1vjnt8JS8fuiMAQFWz9tAll5CNACbkiCUwrHpbXTFDU3SpkgJq/vbZpBBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1746905590; 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=QoRRdnYYeJNdWwZNs/NXTyXPfZ2FNyDbIV43NjVbyiI=; b=RKAM2kKAYkPnALTYmcEos7NoGZB5ekT4pauUt3VcL6WZEuDH5vobFaTNRHu8fh+JgmrlcI i2oRoV7OdtJcVFZcjZVpTthVHVfNW/sMTgDkWxcAtJruXN+xLc9sEHWldUEIxjNjIrB4eI hoqxwIxoKEmmHTBwBnZ9VwVjcBC18e+hV/glDlzNgxKMe2yq6d4T9Z+6RkxI7tmokHaikU Kc5cxWY429mlxqANRTWW23y/OkSLJ3m0WC+IfSQ6ldn0bV9uJC5DImXskuYIWxgVq3R3zz U0uxsSNfiBzrwil/8d0JvHF/KED16Lw5BE+pEOCCwvHtwdNtQY5+uJoWNYI5MQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1746905590; a=rsa-sha256; cv=none; b=dAcAkzFA43T7Gk1pU4VrCmUUiWJ+SuniwueKZB4wB0iuuVxx0To3VYtfYjE+vOr555bbEq z2zRAn3UpgJ28Rt9lBcXGdvCqYtU54wF88owTtodszjfGeSPLFaFSVaZfsBv07Kh29lzcP vmZalcFCRRHHyMnJYvGV/TfHjq2YNIszBk/SbMbzLOnECKlnztxSqumjmHIvM5cyleGwJx cn6JdblMdydNUZUxFR9wtAUSLcbSIxKt2nHLXtbcs8el2FReINxyPTDcHuiT5FQEsXg7h6 6bfB6mdHPslRdFXfCOV/YcUBv5H1GUelIiDoFXh60UwWqnyceF+3YePp5DjgsQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZvwyG1vk4z1069; Sat, 10 May 2025 19:33:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 54AJXAZN055001; Sat, 10 May 2025 19:33:10 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 54AJXAip054998; Sat, 10 May 2025 19:33:10 GMT (envelope-from git) Date: Sat, 10 May 2025 19:33:10 GMT Message-Id: <202505101933.54AJXAip054998@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: 7865d159c5e1 - stable/14 - thr_rtld: accept read lock requests while owning the lock for write 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 7865d159c5e1b825286777ec236b502ec1261dc0 Auto-Submitted: auto-generated The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=7865d159c5e1b825286777ec236b502ec1261dc0 commit 7865d159c5e1b825286777ec236b502ec1261dc0 Author: Konstantin Belousov AuthorDate: 2025-05-02 15:09:46 +0000 Commit: Konstantin Belousov CommitDate: 2025-05-10 18:57:45 +0000 thr_rtld: accept read lock requests while owning the lock for write PR: 286505 (cherry picked from commit 812c4bf3f17024f192980bbb8a781676cb9cf6b6) --- lib/libthr/thread/thr_rtld.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/libthr/thread/thr_rtld.c b/lib/libthr/thread/thr_rtld.c index 55197a9c5461..5195b208f287 100644 --- a/lib/libthr/thread/thr_rtld.c +++ b/lib/libthr/thread/thr_rtld.c @@ -51,8 +51,11 @@ static int _thr_rtld_set_flag(int); static void _thr_rtld_wlock_acquire(void *); struct rtld_lock { - struct urwlock lock; - char _pad[CACHE_LINE_SIZE - sizeof(struct urwlock)]; + struct urwlock lock; + struct pthread *wowner; + u_int rlocks; + char _pad[CACHE_LINE_SIZE - sizeof(struct urwlock) - + sizeof(struct pthread *) - sizeof(u_int)]; }; static struct rtld_lock lock_place[MAX_RTLD_LOCKS] __aligned(CACHE_LINE_SIZE); @@ -117,9 +120,13 @@ _thr_rtld_rlock_acquire(void *lock) SAVE_ERRNO(); l = (struct rtld_lock *)lock; - THR_CRITICAL_ENTER(curthread); - while (_thr_rwlock_rdlock(&l->lock, 0, NULL) != 0) - ; + if (l->wowner == curthread) { + l->rlocks++; + } else { + THR_CRITICAL_ENTER(curthread); + while (_thr_rwlock_rdlock(&l->lock, 0, NULL) != 0) + ; + } curthread->rdlock_count++; RESTORE_ERRNO(); } @@ -138,6 +145,7 @@ _thr_rtld_wlock_acquire(void *lock) THR_CRITICAL_ENTER(curthread); while (_thr_rwlock_wrlock(&l->lock, NULL) != 0) ; + l->wowner = curthread; RESTORE_ERRNO(); } @@ -165,6 +173,14 @@ _thr_rtld_lock_release(void *lock) l->lock.rw_blocked_readers = 0; l->lock.rw_blocked_writers = 0; } + if ((state & URWLOCK_WRITE_OWNER) != 0) { + if (l->rlocks > 0) { + l->rlocks--; + return; + } else { + l->wowner = NULL; + } + } if (_thr_rwlock_unlock(&l->lock) == 0) { if ((state & URWLOCK_WRITE_OWNER) == 0) curthread->rdlock_count--;