From nobody Fri Jun 17 19:37:24 2022 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 63AED85A815; Fri, 17 Jun 2022 19:37:25 +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 4LPq7S5WMPz3Phv; Fri, 17 Jun 2022 19:37:24 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494644; 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=OMHtNyDOKqTte+2KpmyL3dH3d9oIhL7ihiVz02eEnLk=; b=PvZwD6JChdv2Hco6WRQeZXLl6JO2aCY7mJZy7tnKzAeC8kwaoln+Wge737lF6QbnJtv2Z7 yCrrE1OOiZ0T6i94qDsnAjNiYNcTdmSKmMF7XLzgialNrGxNhx9zPkVOFoNg20KRqqx+zP J8Ku0epKUXnRCZM/9UEkVRb0/JVM+dHC3IrZqtQlHDrLcp/Y8EMwtn5PXmhkOovg22yGfT JCkoIdiWTnmTC7A2FSff4RzuuM0w1U5A4VX5Qs0MAZ0SInvoNq0sG7wcHHNR2ojSJdkeXA 4rb/SmRojL72pL/JzrzkNJA1UJsE3b2jWIVTDLxy0QHZl9JvklJ+c/LBEDp41Q== 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 822E125C38; Fri, 17 Jun 2022 19:37:24 +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 25HJbOKR013311; Fri, 17 Jun 2022 19:37:24 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 25HJbO6X013310; Fri, 17 Jun 2022 19:37:24 GMT (envelope-from git) Date: Fri, 17 Jun 2022 19:37:24 GMT Message-Id: <202206171937.25HJbO6X013310@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Dmitry Chagin Subject: git: 6d6fb6026d5f - stable/13 - umtx: Add bitset conditional wakeup functionality. 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: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 6d6fb6026d5f49c509531e926c328e83a8b8ae1f Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1655494644; 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=OMHtNyDOKqTte+2KpmyL3dH3d9oIhL7ihiVz02eEnLk=; b=RAjMEnoZFsSwTc1PaHaH9oTmYoA+tXHVumJQ/sPN2rbiwaPd8W4LbRP0Juu1eRvc79IbsK ZhrKQ3S+OsADv2XdMABhA6bZ5D6lmX+Crma4cLcdS6nnxAPOoUEoBVPsKF64VAkh3TLdW9 9DYoCaOh0ozKcPMuJhXe04PzozwPdLMnY9kh2ycbWOmcYaBDrhGPlC8CxmQrnO3Qgq4xir VR8N8S5eSILUv73QE3PTP8SmsndcuoKt6rhPeTndJ8L6IBhckAhyPtr4CfFklEdfR28KsY YZLQEKXYsDkceOb0VfdF2uyZYDBEu+x0m8KKrIkHzwPmPYgyyJgOhY6y9ZjTGg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1655494644; a=rsa-sha256; cv=none; b=HCJsrNnEm9X77ksaeFc8LqO4fHbeco6UGsFgE1fX9CJP8o+5tvJGWGZTLVfOiskw22BIUb F34BTMMp/Eb5bBZdhsAYTF5cKqg+fvEUyIWCd0vMDUua+7MWpGK5R+cGbUP/KoChYpFZ+z MOgaq280vZ3igdAdtvijYtQ37GJLf2VZDqNuibCDVDdzzPzhWJ4wL+45yintpvy6DIako7 8QGZNHVdllsBllbsOpu/iSNFVF1uKLPl2WvQ1Q9niMMTveLnixEGIZ0EAA4PEcHLqAPoqv OddHRe8ip58ctp8yqjMnfxS7NsHn4ZTbxrzrR8dFL7df97ruto+iU9geWrqFUA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=6d6fb6026d5f49c509531e926c328e83a8b8ae1f commit 6d6fb6026d5f49c509531e926c328e83a8b8ae1f Author: Dmitry Chagin AuthorDate: 2021-07-29 09:42:49 +0000 Commit: Dmitry Chagin CommitDate: 2022-06-17 19:33:17 +0000 umtx: Add bitset conditional wakeup functionality. The bitset is a Linux emulation layer extension. This 32-bit mask, in which at least one bit must be set, is used to select which threads should be woken up. The bitset is stored in the umtx_q structure, which is used to enqueue the waiter into the umtx waitqueue. Put the bitset into the hole, that appeared on LP64 due to data alignment, to prevent the growth of the struct umtx_q. Reviewed by: kib Differential Revision: https://reviews.freebsd.org/D31234 MFC after: 2 weeks (cherry picked from commit 7caa29115b4a2023128ed07942b71074507a44a1) --- sys/kern/kern_umtx.c | 26 ++++++++++++++++++++++++++ sys/sys/umtxvar.h | 4 ++++ 2 files changed, 30 insertions(+) diff --git a/sys/kern/kern_umtx.c b/sys/kern/kern_umtx.c index ebe52aa206ec..256c7e048ba5 100644 --- a/sys/kern/kern_umtx.c +++ b/sys/kern/kern_umtx.c @@ -558,6 +558,32 @@ umtxq_count_pi(struct umtx_key *key, struct umtx_q **first) return (0); } +/* + * Wake up threads waiting on an userland object by a bit mask. + */ +int +umtxq_signal_mask(struct umtx_key *key, int n_wake, u_int bitset) +{ + struct umtxq_queue *uh; + struct umtx_q *uq, *uq_temp; + int ret; + + ret = 0; + UMTXQ_LOCKED_ASSERT(umtxq_getchain(key)); + uh = umtxq_queue_lookup(key, UMTX_SHARED_QUEUE); + if (uh == NULL) + return (0); + TAILQ_FOREACH_SAFE(uq, &uh->head, uq_link, uq_temp) { + if ((uq->uq_bitset & bitset) == 0) + continue; + umtxq_remove_queue(uq, UMTX_SHARED_QUEUE); + wakeup_one(uq); + if (++ret >= n_wake) + break; + } + return (ret); +} + /* * Wake up threads waiting on an userland object. */ diff --git a/sys/sys/umtxvar.h b/sys/sys/umtxvar.h index 68f261fe6abf..de1b649ed8d7 100644 --- a/sys/sys/umtxvar.h +++ b/sys/sys/umtxvar.h @@ -120,6 +120,9 @@ struct umtx_q { int uq_flags; #define UQF_UMTXQ 0x0001 + /* Futex bitset mask */ + u_int uq_bitset; + /* The thread waits on. */ struct thread *uq_thread; @@ -207,6 +210,7 @@ void umtxq_free(struct umtx_q *); struct umtxq_chain *umtxq_getchain(struct umtx_key *); void umtxq_insert_queue(struct umtx_q *, int); void umtxq_remove_queue(struct umtx_q *, int); +int umtxq_signal_mask(struct umtx_key *, int, u_int); int umtxq_sleep(struct umtx_q *, const char *, struct umtx_abs_timeout *); void umtxq_unbusy(struct umtx_key *);