From nobody Tue Apr 11 13:20:55 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 4PwmgX21MBz44rdY; Tue, 11 Apr 2023 13:20:56 +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 4PwmgX056Lz3rWQ; Tue, 11 Apr 2023 13:20:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681219256; 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=27ZDhA4mZFweQYxWGxek22xzdrWlznBuiQyWYbkdots=; b=nkaBkx2P4DbAnwMYng9HC+UM1f/v3r5OUHFa77uVu7O0vJTrPrw3c+pummowx6lQPq/wYv qh5GwFHnXK8YtkBlNCVdeeO/7VTRjitB6MMGUqiJOJ1cXgrGEP7X/xOb0asl05M6Nswfvi yqSpCbTJ7Gu5GwQiGVf9DSqSqDYVULdV1xTAfvOJLYzdKkYQR0PPEZQxyfCyjepzg2u/X/ zKmDdNajSFquG4bWGM47EU91XNRPIqZe61FkkW1VvYqwpp/X+SneigSOa6kSPkKSddGKCK /Zxr9H5JsxGnBU71xYVvE4nkWtl7mWAVUPLYoIxJV58/a7WlGNFS58pxu42c1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681219256; 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=27ZDhA4mZFweQYxWGxek22xzdrWlznBuiQyWYbkdots=; b=xsJM0CSQp1G95Z3HBDBPQrV1M0b0+fRaIt6KMvY3mYE50PU7oJss6owmkds/C1+8jU9Sc3 Si6XOa5FpFBdEJEp/Ct8eAhYwjnsPDQafmB00i1rYvj0l1Z+Wd6Od3gADoNJuj5n05/Mdr v8rqQb30d093wxKaSj72hvU6pwZA4Uwpvd08AfK2y2D1F8W/vu4GMxbaZyUCxGZHp3AEDN NSFTNEZFtVSw+qlEs6hurt1yd9W24G2eLAS8iIrDROUVefrm7OdZ5gGGZN0kg5mcKalQBQ MHS6EmflRkcK9Rb+g8eM+PcwKOdiXLtkn1HHs5DZeS4qKLgQW2HbEiQTvBn07A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1681219256; a=rsa-sha256; cv=none; b=DkJqIsinV1uPgJn4W0rVeBiYpYk+FeWUh7FObKtdCaUVIBNERPYSWPEmPVca4FmRpOxpVJ UHHzvUI80NcL6uW0lvXzIanoY6AQkvOf59BeeIlycEvV7YgmDVNQ3NbgBsLsjWq26meDkU PwBbTQmflSvcjTEDloNVUWoIJDYJdoohMk5ziqFM/igdbvAmPEh5rPXlU5AagMjVmDVvXh adLxDRbSfT4jefxTaunzVaZpZvSWNWk3TqgCKJVkjRnPwIQzHvR2PZSKW7aJHkgcz60R+o lr0tMzczI5nsxq6eE+nwP72z5UFd2olYJihfSEgYZopS8XTBfAMGhWmFneT68Q== 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 4PwmgW63nrzJyq; Tue, 11 Apr 2023 13:20:55 +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 33BDKtXA010249; Tue, 11 Apr 2023 13:20:55 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 33BDKt3K010248; Tue, 11 Apr 2023 13:20:55 GMT (envelope-from git) Date: Tue, 11 Apr 2023 13:20:55 GMT Message-Id: <202304111320.33BDKt3K010248@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: 75fc6f86c388 - main - Add witness_is_owned(9) 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: 75fc6f86c38807f1fb305c065c6affcf7617b029 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=75fc6f86c38807f1fb305c065c6affcf7617b029 commit 75fc6f86c38807f1fb305c065c6affcf7617b029 Author: Konstantin Belousov AuthorDate: 2023-04-10 15:54:58 +0000 Commit: Konstantin Belousov CommitDate: 2023-04-11 12:59:49 +0000 Add witness_is_owned(9) which returns an indicator if the current thread owns the specified lock. Reviewed by: jah, markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D39477 --- sys/kern/subr_witness.c | 58 ++++++++++++++++++++++++++++++++++++++++--------- sys/sys/lock.h | 1 + 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c index 97f68c812a76..839e4a4ce54b 100644 --- a/sys/kern/subr_witness.c +++ b/sys/kern/subr_witness.c @@ -2429,6 +2429,32 @@ witness_restore(struct lock_object *lock, const char *file, int line) instance->li_line = line; } +static bool +witness_find_instance(const struct lock_object *lock, + struct lock_instance **instance) +{ +#ifdef INVARIANT_SUPPORT + struct lock_class *class; + + if (lock->lo_witness == NULL || witness_watch < 1 || KERNEL_PANICKED()) + return (false); + class = LOCK_CLASS(lock); + if ((class->lc_flags & LC_SLEEPLOCK) != 0) { + *instance = find_instance(curthread->td_sleeplocks, lock); + return (true); + } else if ((class->lc_flags & LC_SPINLOCK) != 0) { + *instance = find_instance(PCPU_GET(spinlocks), lock); + return (true); + } else { + kassert_panic("Lock (%s) %s is not sleep or spin!", + class->lc_name, lock->lo_name); + return (false); + } +#else + return (false); +#endif +} + void witness_assert(const struct lock_object *lock, int flags, const char *file, int line) @@ -2437,18 +2463,9 @@ witness_assert(const struct lock_object *lock, int flags, const char *file, struct lock_instance *instance; struct lock_class *class; - if (lock->lo_witness == NULL || witness_watch < 1 || KERNEL_PANICKED()) + if (!witness_find_instance(lock, &instance)) return; class = LOCK_CLASS(lock); - if ((class->lc_flags & LC_SLEEPLOCK) != 0) - instance = find_instance(curthread->td_sleeplocks, lock); - else if ((class->lc_flags & LC_SPINLOCK) != 0) - instance = find_instance(PCPU_GET(spinlocks), lock); - else { - kassert_panic("Lock (%s) %s is not sleep or spin!", - class->lc_name, lock->lo_name); - return; - } switch (flags) { case LA_UNLOCKED: if (instance != NULL) @@ -2501,6 +2518,27 @@ witness_assert(const struct lock_object *lock, int flags, const char *file, #endif /* INVARIANT_SUPPORT */ } +/* + * Checks the ownership of the lock by curthread, consulting the witness list. + * Returns: + * 0 if witness is disabled or did not work + * -1 if not owned + * 1 if owned + */ +int +witness_is_owned(const struct lock_object *lock) +{ +#ifdef INVARIANT_SUPPORT + struct lock_instance *instance; + + if (!witness_find_instance(lock, &instance)) + return (0); + return (instance == NULL ? -1 : 1); +#else + return (0); +#endif +} + static void witness_setflag(struct lock_object *lock, int flag, int set) { diff --git a/sys/sys/lock.h b/sys/sys/lock.h index 2db38f9df89a..4031f20946c0 100644 --- a/sys/sys/lock.h +++ b/sys/sys/lock.h @@ -237,6 +237,7 @@ int witness_list_locks(struct lock_list_entry **, int (*)(const char *, ...)); int witness_warn(int, struct lock_object *, const char *, ...); void witness_assert(const struct lock_object *, int, const char *, int); +int witness_is_owned(const struct lock_object *lock); void witness_display_spinlock(struct lock_object *, struct thread *, int (*)(const char *, ...)); int witness_line(struct lock_object *);