From nobody Wed Apr 27 23:27:47 2022 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 973AE1AA8F3F; Wed, 27 Apr 2022 23:27:47 +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 4KpZfq3CsRz4YPy; Wed, 27 Apr 2022 23:27:47 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1651102067; 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=JN5JyGRKaqNvEFKei2gGRZ9vPXNYHispbKl7mpmatb0=; b=JRGyRVJS9h8/L8ioYy3Z0x5myxBGJli4sxho2Is6kPpvwBNzq9gLH/+V4u+pt9ru3+h9RI lcqjCLOcX6Au3Eom07U90ElPPQcg+SdiKhEVBLKEr+gWs+VvwVYjwDSt+iz7giZN6k12sl 8Fwl9Te3cF3eGr+0++itY74YzICnkPVd5ohedu46dZGDaqHp7nik8LPqZzZhksLUlzXkow gJT47g//jQc/kLOiv2gZvb2+IT60yK9ukMSNWK3swpZg8RrZgpXZ2BL1H5xsT+AkqdZrLP TZ9TwZUE1VUPZ9uUSxtbUyYlEkm2tKV8/ETOQitYGwgysvR66RNolZSAs/bZHg== 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 41C9955D5; Wed, 27 Apr 2022 23:27:47 +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 23RNRlSQ071791; Wed, 27 Apr 2022 23:27:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 23RNRlRB071790; Wed, 27 Apr 2022 23:27:47 GMT (envelope-from git) Date: Wed, 27 Apr 2022 23:27:47 GMT Message-Id: <202204272327.23RNRlRB071790@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: e59b940dcb45 - main - unr(9): allow to avoid internal locking 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: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: 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: e59b940dcb45b887974aeae8d8f86665aed2c913 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1651102067; 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=JN5JyGRKaqNvEFKei2gGRZ9vPXNYHispbKl7mpmatb0=; b=Vv0aiDD3KTOVeV5UW2rw1FzB212SU4TOKFtxfB5rnKlXuRiM9VuTQO2pR2BB+HK6Tgb375 xXmNNATyvImtGJG4C7vhG7uPRJnxFb0ejhLZlq0BkhnFPpthbji+voH9HYXHo3/fLChezA eYWgSugLPZyylyjX5OX6x/zMVUfdQrqBoZjiS3tBH7avc4KxF/twSoy79gu48VXFDIeKL/ IZO+aA9+MGD4gInsEomBXDwY5GcESVY2ycnQsdRejNLhbQjYKA+v5y7Fq98WxH8SAcEYYF U86d5Zj3LfetQzpEzPp29n7kGA0Frv+SeKfT5WGyTS8CjI1SW+BvGm4CfDDd8g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1651102067; a=rsa-sha256; cv=none; b=xzazKbjzMvPc+/Epi8wG670gBgUsv3rSmHPN79xMMwcOEmGoOMwRoxugT6CNu/TxrIRR5a GWhHVxYbfbozqg51oDJvLWyNHLoMBs657AdK2MzB7zKz5cnP1C0uOl1QOC65WW/YIJaf5z V5CPyad4zIOkgb7NV4zpBS3SN6L3WTV5dJxPgymDsjsKDuaho0x8ER+gHnhbfdcFaiGiRb IkeEFMsmzhl9QzHjNyFdZwtocDErDTFrZS7l2+0ektku4i7D0FSgPkfYsRO4GuSpIHjWkG jtSDpISEPQNbKMruh/W0mw5Oq9EYER+6ueb9sJEbCZ2WE+JDf2w0iGXvZH+7KA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=e59b940dcb45b887974aeae8d8f86665aed2c913 commit e59b940dcb45b887974aeae8d8f86665aed2c913 Author: Konstantin Belousov AuthorDate: 2022-04-20 22:14:37 +0000 Commit: Konstantin Belousov CommitDate: 2022-04-27 23:27:34 +0000 unr(9): allow to avoid internal locking Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D35014 --- share/man/man9/unr.9 | 5 ++++- sys/kern/subr_unit.c | 43 +++++++++++++++++++++++++++++-------------- sys/sys/systm.h | 1 + 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/share/man/man9/unr.9 b/share/man/man9/unr.9 index fe1299d40e5d..c2e9b3943829 100644 --- a/share/man/man9/unr.9 +++ b/share/man/man9/unr.9 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd October 4, 2017 +.Dd April 21, 2022 .Dt UNR 9 .Os .Sh NAME @@ -72,6 +72,9 @@ If is not .Dv NULL , it is used for locking when allocating and freeing units. +If the passed value is the token +.Va UNR_NO_MTX , +then no locking is applied internally. Otherwise, internal mutex is used. .It Fn clear_unrhdr uh Clear all units from the specified unit number allocator entity. diff --git a/sys/kern/subr_unit.c b/sys/kern/subr_unit.c index 9ca67bcfe7a2..66314887ac39 100644 --- a/sys/kern/subr_unit.c +++ b/sys/kern/subr_unit.c @@ -312,12 +312,15 @@ clean_unrhdrl(struct unrhdr *uh) { struct unr *up; - mtx_assert(uh->mtx, MA_OWNED); + if (uh->mtx != NULL) + mtx_assert(uh->mtx, MA_OWNED); while ((up = TAILQ_FIRST(&uh->ppfree)) != NULL) { TAILQ_REMOVE(&uh->ppfree, up, list); - mtx_unlock(uh->mtx); + if (uh->mtx != NULL) + mtx_unlock(uh->mtx); Free(up); - mtx_lock(uh->mtx); + if (uh->mtx != NULL) + mtx_lock(uh->mtx); } } @@ -326,9 +329,11 @@ void clean_unrhdr(struct unrhdr *uh) { - mtx_lock(uh->mtx); + if (uh->mtx != NULL) + mtx_lock(uh->mtx); clean_unrhdrl(uh); - mtx_unlock(uh->mtx); + if (uh->mtx != NULL) + mtx_unlock(uh->mtx); } void @@ -337,7 +342,9 @@ init_unrhdr(struct unrhdr *uh, int low, int high, struct mtx *mutex) KASSERT(low >= 0 && low <= high, ("UNR: use error: new_unrhdr(%d, %d)", low, high)); - if (mutex != NULL) + if (mutex == UNR_NO_MTX) + uh->mtx = NULL; + else if (mutex != NULL) uh->mtx = mutex; else uh->mtx = &unitmtx; @@ -608,7 +615,8 @@ alloc_unrl(struct unrhdr *uh) u_int x; int y; - mtx_assert(uh->mtx, MA_OWNED); + if (uh->mtx != NULL) + mtx_assert(uh->mtx, MA_OWNED); check_unrhdr(uh, __LINE__); x = uh->low + uh->first; @@ -653,10 +661,12 @@ alloc_unr(struct unrhdr *uh) { int i; - mtx_lock(uh->mtx); + if (uh->mtx != NULL) + mtx_lock(uh->mtx); i = alloc_unrl(uh); clean_unrhdrl(uh); - mtx_unlock(uh->mtx); + if (uh->mtx != NULL) + mtx_unlock(uh->mtx); return (i); } @@ -667,7 +677,8 @@ alloc_unr_specificl(struct unrhdr *uh, u_int item, void **p1, void **p2) struct unrb *ub; u_int i, last, tl; - mtx_assert(uh->mtx, MA_OWNED); + if (uh->mtx != NULL) + mtx_assert(uh->mtx, MA_OWNED); if (item < uh->low + uh->first || item > uh->high) return (-1); @@ -773,9 +784,11 @@ alloc_unr_specific(struct unrhdr *uh, u_int item) p1 = Malloc(sizeof(struct unr)); p2 = Malloc(sizeof(struct unr)); - mtx_lock(uh->mtx); + if (uh->mtx != NULL) + mtx_lock(uh->mtx); i = alloc_unr_specificl(uh, item, &p1, &p2); - mtx_unlock(uh->mtx); + if (uh->mtx != NULL) + mtx_unlock(uh->mtx); if (p1 != NULL) Free(p1); @@ -906,10 +919,12 @@ free_unr(struct unrhdr *uh, u_int item) WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, "free_unr"); p1 = Malloc(sizeof(struct unr)); p2 = Malloc(sizeof(struct unr)); - mtx_lock(uh->mtx); + if (uh->mtx != NULL) + mtx_lock(uh->mtx); free_unrl(uh, item, &p1, &p2); clean_unrhdrl(uh); - mtx_unlock(uh->mtx); + if (uh->mtx != NULL) + mtx_unlock(uh->mtx); if (p1 != NULL) Free(p1); if (p2 != NULL) diff --git a/sys/sys/systm.h b/sys/sys/systm.h index 043f347ac0d6..98637c4f4838 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -498,6 +498,7 @@ int root_mounted(void); * Unit number allocation API. (kern/subr_unit.c) */ struct unrhdr; +#define UNR_NO_MTX ((void *)(uintptr_t)-1) struct unrhdr *new_unrhdr(int low, int high, struct mtx *mutex); void init_unrhdr(struct unrhdr *uh, int low, int high, struct mtx *mutex); void delete_unrhdr(struct unrhdr *uh);