From nobody Mon May 22 13:46:48 2023 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 4QPzJT0tqxz4BTHk; Mon, 22 May 2023 13:46:49 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QPzJT0QHkz4c5d; Mon, 22 May 2023 13:46:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1684763209; 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=oU++6TJAkLzZKMXqUpptFmJmVdIsC3HA+EOAjzxAHsU=; b=FnqCDKkZafWVjqPg/XDxkY8RuqjS5sHeCevSjmPnEs73+yfGCvmJQwJiwDBzg+4y+sOCiv cEqvYFDRvGW5KRG5A3NS7xKD/dRMjDNSad1J/lSwhtBkplo31iGLRPHQL5tHbgSuXWb8Ls YdArpH3ilkf0SspQvYa2zJp6gcY/gDzbFO0QtXW6DIfM/bENcaBiyLDOo3csku+eB4AZKk AsaUHKbqGPeCzLpuFt5a7+dQnCH7zWD0nMEv2s9ynySUddDTIeLG0DAnuy4AM741uzJZoh PObUajN06GFwiwRPY98NjsYBTatIQXhyojhkZLCKdmbeMRqEA4bSJX+Z6sc5TQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1684763209; 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=oU++6TJAkLzZKMXqUpptFmJmVdIsC3HA+EOAjzxAHsU=; b=PG0qV2wW2HuoQCWL6NwqiYO1o/HQecIRFkEcThDi+rXd39mXywjpCDGucMMJIIlOLJRMUV d8AkywEiorqyeGfsRvI4BMIVGO8fOVhYbU6Rcwq9ziqqR2DUkIcoVli2N6woeRGkCdB5Uf zF+Y/1G+sIo3nYBgm7sd2/kRC1U7O2yFfnFBteg0ZuJLnbTMyWYzoWXy6WYx+wz29nJVH+ M7R7dIWGtfVcp1j/bY3ED9WBIHDcsyfNt96x9uX1yvEkJCP4bV4ZL+YNDEJ5GAMx3zPSjN DJkum4aG38fl43zd8i/4iE9Gp2elA514FFsgmj+B13UjN5z5D9E9pWeWUa+7Pw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1684763209; a=rsa-sha256; cv=none; b=rPnmfBYiVzusT432O9v8XpiExtt8S3j8mvw/ymZ4mzxEKS4BKBnsA5zbviwfMJZGl+AH5s KzQJcYBksskFCt/JPo23tjvZ9jsuF9WGZmgLPsMsL6+jtBwd1eNq8FQql7k9mIMeD6nEmZ rLOMVxVcDb485+ELhqOBARgfNdHCm/Wg7rPvXdgdDb/Wtg+iqWW1jLC0jf8t2vTAwBDRco KaGzEXlr0xDi7zeO31At/TZYHwNH+xupLxl0Ix1WF+pf4dBN9x/6k985suKaN+6UskHl01 xihttb9bNhxw8IoeUmTXO8GUNFo7212+KQP5oCtq33RH9uo8n4hvpI5ctFH2sw== 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 4QPzJS6KrNzKmd; Mon, 22 May 2023 13:46:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 34MDkmKn076922; Mon, 22 May 2023 13:46:48 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 34MDkmo9076921; Mon, 22 May 2023 13:46:48 GMT (envelope-from git) Date: Mon, 22 May 2023 13:46:48 GMT Message-Id: <202305221346.34MDkmo9076921@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: 6f49eafb056c - main - libthr rtld locks: do not leak URWLOCK_READ_WAITERS into child 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: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: 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/main X-Git-Reftype: branch X-Git-Commit: 6f49eafb056cfa0703dfc97a731cabe4ed2596b8 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=6f49eafb056cfa0703dfc97a731cabe4ed2596b8 commit 6f49eafb056cfa0703dfc97a731cabe4ed2596b8 Author: Konstantin Belousov AuthorDate: 2023-05-20 08:11:54 +0000 Commit: Konstantin Belousov CommitDate: 2023-05-22 13:46:42 +0000 libthr rtld locks: do not leak URWLOCK_READ_WAITERS into child Since there is only the current thread in the child, no pending readers exist. Clear the bit, since it confuses future attempts to acquire write ownership of the rtld locks, due to URWLOCK_PREFER_READERS flag. To be future-proof, clear all state about pending writers and readers. PR: 271490 Reported and tested by: KJ Tsanaktsidis Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D40178 --- lib/libthr/thread/thr_fork.c | 4 ++++ lib/libthr/thread/thr_private.h | 2 ++ lib/libthr/thread/thr_rtld.c | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/lib/libthr/thread/thr_fork.c b/lib/libthr/thread/thr_fork.c index 9861e93c427d..341afc2b06ec 100644 --- a/lib/libthr/thread/thr_fork.c +++ b/lib/libthr/thread/thr_fork.c @@ -78,6 +78,8 @@ __FBSDID("$FreeBSD$"); __weak_reference(_thr_atfork, _pthread_atfork); __weak_reference(_thr_atfork, pthread_atfork); +bool _thr_after_fork = false; + int _thr_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)) @@ -243,7 +245,9 @@ thr_fork_impl(const struct thr_fork_args *a) _thr_signal_postfork_child(); if (was_threaded) { + _thr_after_fork = true; _rtld_atfork_post(rtld_locks); + _thr_after_fork = false; __thr_pshared_atfork_post(); } _thr_setthreaded(0); diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h index a64c3f1692ab..e235ff424358 100644 --- a/lib/libthr/thread/thr_private.h +++ b/lib/libthr/thread/thr_private.h @@ -779,6 +779,8 @@ extern int _suspend_all_waiters __hidden; extern int _suspend_all_cycle __hidden; extern struct pthread *_single_thread __hidden; +extern bool _thr_after_fork __hidden; + /* * Function prototype definitions. */ diff --git a/lib/libthr/thread/thr_rtld.c b/lib/libthr/thread/thr_rtld.c index a9d1924967a7..cedc13a1440e 100644 --- a/lib/libthr/thread/thr_rtld.c +++ b/lib/libthr/thread/thr_rtld.c @@ -158,6 +158,17 @@ _thr_rtld_lock_release(void *lock) l = (struct rtld_lock *)lock; state = l->lock.rw_state; + if (__predict_false(_thr_after_fork)) { + /* + * After fork, only this thread is running, there is no + * waiters. Keeping waiters recorded in rwlock breaks + * wake logic. + */ + atomic_clear_int(&l->lock.rw_state, + URWLOCK_WRITE_WAITERS | URWLOCK_READ_WAITERS); + l->lock.rw_blocked_readers = 0; + l->lock.rw_blocked_writers = 0; + } if (_thr_rwlock_unlock(&l->lock) == 0) { if ((state & URWLOCK_WRITE_OWNER) == 0) curthread->rdlock_count--;