From patchwork Fri Nov 17 14:51:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13459013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8DCBFC5AE4B for ; Fri, 17 Nov 2023 14:52:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 682016B04D7; Fri, 17 Nov 2023 09:52:00 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 59E226B04DC; Fri, 17 Nov 2023 09:52:00 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B6E86B04D7; Fri, 17 Nov 2023 09:52:00 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id C0E276B04DA for ; Fri, 17 Nov 2023 09:51:59 -0500 (EST) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 8D83CC020B for ; Fri, 17 Nov 2023 14:51:59 +0000 (UTC) X-FDA: 81467735958.12.14B9364 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf11.hostedemail.com (Postfix) with ESMTP id 6922640008 for ; Fri, 17 Nov 2023 14:51:57 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=j0pCGrSv; spf=none (imf11.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700232718; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=JrgaNSZkbdttPU8m7IV9E3SqR4RsniiNUF24kh9JfO8=; b=ADlAKfskXG+RSByQcs2m8eqF6cuwAEkrcygb3qeVbzT0yq6zqrHw6tQ3rCrzneffF/C8oT B7u2hYX6n7TSciMqNKHroqg2GSO3TJcsiqrW1SySx+1vWfDQTVnyofxXoZ4M9nPrhdn7Z1 Ut2rtookesL/vuyFtlwxc4pAArFrO8Q= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700232718; a=rsa-sha256; cv=none; b=7YK7flIa97PRnpcG7E57bpgwG4DaP39TsekmBjRDRavgzRptXpEi88xBjptBFoqqHx0mim Ko77c2X381RIUl3F+P/X5c5ZIGS0D4VzfJTTk/YgHy8D6gvWXe2mTsjy0GjvqvckwBlxX4 UN+39KmcDQgZ0o3G7btOSLDBQOhkJVA= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=j0pCGrSv; spf=none (imf11.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=JrgaNSZkbdttPU8m7IV9E3SqR4RsniiNUF24kh9JfO8=; b=j0pCGrSveYKYRXtt4HIE3G3IaJ /XXSDQT1KRDKsvIp0aEw1OPQ3r6ItpfPvYmp9t5iO2Dt1LT3Nm+QMU4PLIh2lNQ/Whkvl2XHXKcg/ NUmkcSyCUy2Pw1gzXv5O0ETHuP1cxAfVP4uISEcYEggWj4OEXXBdm4BVxFum5Nq1HfBFmaZQAVFUs hwq+cjIJVhokWwYI+yme5U4DfMhLpSRVRm1vIS0Jjg3qGTkiUhTYpYJQ6ge1tExmFzieL1U4DfYdx yDJC32wJJnGckiV08EUX7cyJrxzf+PZirjLBGP/VtznM+WnX/sAgooLYKkDbVDax43ZtDkrlNG2qB q7D+hQNg==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1r40C7-009ypx-OE; Fri, 17 Nov 2023 14:51:43 +0000 From: "Matthew Wilcox (Oracle)" To: Peter Zijlstra , Ingo Molnar , Will Deacon , Waiman Long Cc: "Matthew Wilcox (Oracle)" , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Chandan Babu R , "Darrick J . Wong" , linux-xfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v4 1/4] locking: Add rwsem_assert_held() and rwsem_assert_held_write() Date: Fri, 17 Nov 2023 14:51:39 +0000 Message-Id: <20231117145142.2378800-2-willy@infradead.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20231117145142.2378800-1-willy@infradead.org> References: <20231117145142.2378800-1-willy@infradead.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 6922640008 X-Rspam-User: X-Rspamd-Server: rspam11 X-Stat-Signature: s4s6ffwyswgddjgge74hm1u1qpmfkkef X-HE-Tag: 1700232717-587477 X-HE-Meta: U2FsdGVkX1/0/9tFoQKem3gVl1GsQk9gUomXAiG9WzjWHKn68PCfFaqjjttXQj/OnDIA49I09Hp+B57LQDExf8CAe1Zt+nYln7T5vXHTvLL1KUbIGPZ6r+a+0BcF1ECgoKPlQ87Xvd2Zal1SrZzvjDrVCh+8e2ZmUdCN76nf2APlzfSt8NGQ2mFcygn1vdfBsOvw1fOMFXejIRlT1/EQW2CUHFdHysV6nZB4VmXNwCDTy35dbw+9X1KZFXHGkVuGVXVqI4r4/rE6odC0jLU35y7bUzYrev7vuDPFweifz2UmlUgcyUW10Evk6gFFE1EsbVsA0Xoyxgg2RdMZpLWzhZHkUkTB+qQf2orGMtPOKaZbzYpBuLRiAwbdv7+uKF28N2X8I+Kc0LtKzPlPD5o+ZCycTCNFjJPJFCEdGik81x2VSHzfmgsDedUEFZ5PfDTrNR1L1FoB2tH2gtP48zraNve4FyScX2Eybr87fG8dZu/YTRCVVEMvQxP+H2WvTkW4iJnAKMq7TxrPToAWMWXyOflSITAGdDy+QkewlbuahNu+cCBq860HrQ96wXGlezITD6NrBQmuBB6Hn3qJLsw6RGUzdBbDbRzax0+OYOKXqSUyrFxYtFhpL+5hjhRdiOx2vaC6Dk81mXpdHJ10iyPsT5WC8msfG6VgWyDQ4npVsHTyEpqVc/+ydB1LqRLmXyd8tvf4CkBTTfM8cDthgrFICM+EIwXVhtiUv6lW8G+4fvJoXvxo3x5Nb/ek25f29CLdXoLWhhRvJzTw6K1lNuxtJPZITPQ1AIMUlS+CBLMSCa/PFOUU+Pgtv1udEW5M1ncWAAUG+C6Ork/Y0la+YYMCd3n0z83IUftsUi0q9ova9mz3wzM90dus3xmcsRJCUU+pJ5gBKywOlXdbspBupVhqVnDL6/ZBJvjE5AxV6pxw64TC8BSRXVM1OmDloaj1BT3rB+hDnwK1NbiVjWfJadX VK3sqEEv BkFw7J+wzMvji73EOaaynccsZ0eu44LwoHvcJcXW6hz/CEtz4uyDFWuzD9vXwAr8jRvF4sZScqDlaPFfo62Y9cWB8lqObVz35NP60IKVRBr9C3e9MlJqcz7t9Se7gj7laAPIK1l1dqalzLBclg646zur9R54MbmxuHfnEaIj4COY51EPX+G7wlUj/jeoougrMKHSSD/gIdIfSYJxDUD1xDmjepm7K9k7LMK2gkmtbJ/diuqk= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Modelled after lockdep_assert_held() and lockdep_assert_held_write(), but are always active, even when lockdep is disabled. Of course, they don't test that _this_ thread is the owner, but it's sufficient to catch many bugs and doesn't incur the same performance penalty as lockdep. Signed-off-by: Matthew Wilcox (Oracle) Acked-by: Peter Zijlstra (Intel) --- include/linux/rwbase_rt.h | 9 ++++++-- include/linux/rwsem.h | 46 ++++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/include/linux/rwbase_rt.h b/include/linux/rwbase_rt.h index 1d264dd08625..29c4e4f243e4 100644 --- a/include/linux/rwbase_rt.h +++ b/include/linux/rwbase_rt.h @@ -26,12 +26,17 @@ struct rwbase_rt { } while (0) -static __always_inline bool rw_base_is_locked(struct rwbase_rt *rwb) +static __always_inline bool rw_base_is_locked(const struct rwbase_rt *rwb) { return atomic_read(&rwb->readers) != READER_BIAS; } -static __always_inline bool rw_base_is_contended(struct rwbase_rt *rwb) +static inline void rw_base_assert_held_write(const struct rwbase_rt *rwb) +{ + WARN_ON(atomic_read(&rwb->readers) != WRITER_BIAS); +} + +static __always_inline bool rw_base_is_contended(const struct rwbase_rt *rwb) { return atomic_read(&rwb->readers) > 0; } diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h index 1dd530ce8b45..e032b9644af5 100644 --- a/include/linux/rwsem.h +++ b/include/linux/rwsem.h @@ -66,14 +66,24 @@ struct rw_semaphore { #endif }; -/* In all implementations count != 0 means locked */ +#define RWSEM_UNLOCKED_VALUE 0UL +#define RWSEM_WRITER_LOCKED (1UL << 0) +#define __RWSEM_COUNT_INIT(name) .count = ATOMIC_LONG_INIT(RWSEM_UNLOCKED_VALUE) + static inline int rwsem_is_locked(struct rw_semaphore *sem) { - return atomic_long_read(&sem->count) != 0; + return atomic_long_read(&sem->count) != RWSEM_UNLOCKED_VALUE; } -#define RWSEM_UNLOCKED_VALUE 0L -#define __RWSEM_COUNT_INIT(name) .count = ATOMIC_LONG_INIT(RWSEM_UNLOCKED_VALUE) +static inline void rwsem_assert_held_nolockdep(const struct rw_semaphore *sem) +{ + WARN_ON(atomic_long_read(&sem->count) == RWSEM_UNLOCKED_VALUE); +} + +static inline void rwsem_assert_held_write_nolockdep(const struct rw_semaphore *sem) +{ + WARN_ON(!(atomic_long_read(&sem->count) & RWSEM_WRITER_LOCKED)); +} /* Common initializer macros and functions */ @@ -152,11 +162,21 @@ do { \ __init_rwsem((sem), #sem, &__key); \ } while (0) -static __always_inline int rwsem_is_locked(struct rw_semaphore *sem) +static __always_inline int rwsem_is_locked(const struct rw_semaphore *sem) { return rw_base_is_locked(&sem->rwbase); } +static inline void rwsem_assert_held_nolockdep(const struct rw_semaphore *sem) +{ + WARN_ON(!rwsem_is_locked(sem)); +} + +static inline void rwsem_assert_held_write_nolockdep(const struct rw_semaphore *sem) +{ + rw_base_assert_held_write(sem); +} + static __always_inline int rwsem_is_contended(struct rw_semaphore *sem) { return rw_base_is_contended(&sem->rwbase); @@ -169,6 +189,22 @@ static __always_inline int rwsem_is_contended(struct rw_semaphore *sem) * the RT specific variant. */ +static inline void rwsem_assert_held(const struct rw_semaphore *sem) +{ + if (IS_ENABLED(CONFIG_LOCKDEP)) + lockdep_assert_held(sem); + else + rwsem_assert_held_nolockdep(sem); +} + +static inline void rwsem_assert_held_write(const struct rw_semaphore *sem) +{ + if (IS_ENABLED(CONFIG_LOCKDEP)) + lockdep_assert_held_write(sem); + else + rwsem_assert_held_write_nolockdep(sem); +} + /* * lock for reading */