From nobody Fri May 2 18:08:19 2025 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 4ZpzS42PRZz5tq7p; Fri, 02 May 2025 18:08:20 +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 4ZpzS40hC2z3qnW; Fri, 02 May 2025 18:08:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1746209300; 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=i4U0G43YyFwIyt09ySOJhYczcAMFPnvGEQToU3E23RU=; b=h+XJXxOZVpA91Rx3tD3AsvDstnw9F8pUiytDh6Oivxn7jM+VwR3qCPnqXE0XT+sI3EFSyc p1hqZWjjTeskOlduQ/Hvb7Lu78LRI/Ti3EitK0f7mECb2CMVv/E7wjkbXRhQ2+1WGrJmfS dd0gYYTKcR1zHRGXLmT2FQsXJ7MG1QfBbQqT/98hMKa9p/T2fJysvmv/xhwQY/zplmyh7M kxPmYqGpp8zC3rr1BmFZ6vhRG76TSb6GHMQEe2/bQXG77BHqoZIj5DCqKoVfT63gonCROr SNz9AlYYWnvRrj6Qo4qy5/MYPRIpu2pE7XGCuTXVleWsGpFsMUwFGdBvylkHCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1746209300; 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=i4U0G43YyFwIyt09ySOJhYczcAMFPnvGEQToU3E23RU=; b=yzOeZvhytLGLfFFmUW8NsCMvYb9gCXF6t/XGT0JwtVWxLX/0yqsLGtPwvcSkcu0hujQ56W k8FqMOHy/NkXgr9pnz/AkrqrPiIbPucUHkiniuCSkLKQg2MyUnSOqxiheKSw0Z3PJ0EnTM S1qIw1OKtyO3XTzFX9bYwARj9YqccleG0hrPJYEsbpHGXyPNagKtILVNUem2DVibxEMo8e xGxuJEjIE1dIqbJizbpW4zohXyAnaoC1S5gr2sbrjdkSCAo83rG3bwRFIqLGu8HXJSbUnl UByIYyXHpQaJWoYZz/Rmkiy+0rcJMnqcepITYGCDptVLnpqa0mJkEuh01A63OA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1746209300; a=rsa-sha256; cv=none; b=IkVYS2jcU6Ldxn4A/yvQ4FGqF1KzgBYUOzZxsc8kLyVkT2huC7dmNaORmmu8D5uGtBo1Dx 14JtjCvginc80cv5HYC8XmF9iemxEbKzlscnDII/5Iq+T1Ygkmhu70T3lmRBUcZE3hEti7 B+NU8rWe6qOwt6m4rNsaKAgJYMrI5wOjxEb5KB9cXIKcjgDZjszEQnMMzCgytAXb6xT5ZC j+GOIRG0gTuIteYahdmCglR1QzT1MMlCpKL7rvrMB8enk31gOwRavONJLqWFhA/s+S7Pje vIW0kHDRaqvoJN3iVD+wisD/JZp+OpAxrLSLl4wFy/QLHHxDAI5p7qcA0b2OZQ== 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 4ZpzS404MSz1MKd; Fri, 02 May 2025 18:08:20 +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 542I8JXD061880; Fri, 2 May 2025 18:08:19 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 542I8J08061877; Fri, 2 May 2025 18:08:19 GMT (envelope-from git) Date: Fri, 2 May 2025 18:08:19 GMT Message-Id: <202505021808.542I8J08061877@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 812c4bf3f170 - main - thr_rtld: accept read lock requests while owning the lock for write 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 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/main X-Git-Reftype: branch X-Git-Commit: 812c4bf3f17024f192980bbb8a781676cb9cf6b6 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=812c4bf3f17024f192980bbb8a781676cb9cf6b6 commit 812c4bf3f17024f192980bbb8a781676cb9cf6b6 Author: Konstantin Belousov AuthorDate: 2025-05-02 15:09:46 +0000 Commit: Konstantin Belousov CommitDate: 2025-05-02 18:08:09 +0000 thr_rtld: accept read lock requests while owning the lock for write PR: 286505 Reviewed by: olce Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D50117 --- 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 e5a7f86de288..3cfdfc548cf2 100644 --- a/lib/libthr/thread/thr_rtld.c +++ b/lib/libthr/thread/thr_rtld.c @@ -50,8 +50,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); @@ -116,9 +119,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(); } @@ -137,6 +144,7 @@ _thr_rtld_wlock_acquire(void *lock) THR_CRITICAL_ENTER(curthread); while (_thr_rwlock_wrlock(&l->lock, NULL) != 0) ; + l->wowner = curthread; RESTORE_ERRNO(); } @@ -164,6 +172,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--;