From mboxrd@z Thu Jan 1 00:00:00 1970 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]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 34E4EC43458 for ; Tue, 30 Jun 2026 19:08:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 375EA6B00A9; Tue, 30 Jun 2026 15:08:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2B1346B00AB; Tue, 30 Jun 2026 15:08:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 00DBA6B00AC; Tue, 30 Jun 2026 15:08:53 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id CAF166B00A9 for ; Tue, 30 Jun 2026 15:08:53 -0400 (EDT) Received: from smtpin26.hostedemail.com (lb01a-stub [10.200.18.249]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 5A905C31DF for ; Tue, 30 Jun 2026 19:08:53 +0000 (UTC) X-FDA: 84937516146.26.DC86444 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf15.hostedemail.com (Postfix) with ESMTP id 0EE1AA000A for ; Tue, 30 Jun 2026 19:08:50 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=WGwIqLFl; dmarc=pass (policy=none) header.from=infradead.org; spf=pass (imf15.hostedemail.com: domain of liam@infradead.org designates 198.137.202.133 as permitted sender) smtp.mailfrom=liam@infradead.org ARC-Seal: i=1; a=rsa-sha256; d=hostedemail.com; s=arc-20220608; cv=none; t=1782846531; b=bymFQsrDw2VZfmf9tPq4VDz8/Cn5vnfxlesZuBFGJ8zPYsbji2Q+3bF9hoD4o8HpOG7RAU HmdnygkK4rajm4MZzaptk2i5zEUyshNbcvjcZRkuqVuNsG3oHun8Poh1UQikiNFPzY+6K0 j42+oxiNIFUzeOLaYI/WDX2netM0Ppo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1782846531; 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=O4S/rOt0mQDvJh08Ktp/PKJyybrhsHg85P0NQ476Smw=; b=GZWaKyFHZ6UyzvKsFeYGKsg56mhlwyIpeR5VlwpdQCIwQQCYg7ZpmLbVGp4PxKXFLkSGU7 62wqHgRsjlp4RaVjXpfpnRJlzzveC6CjWXb/JE9N0yAUDlYMrmV70hHHsHgERnbhDMzKVp TpkdtdbP9hNY4wLJd4WRhXbY8lh6kuQ= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=WGwIqLFl; dmarc=pass (policy=none) header.from=infradead.org; spf=pass (imf15.hostedemail.com: domain of liam@infradead.org designates 198.137.202.133 as permitted sender) smtp.mailfrom=liam@infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; 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=O4S/rOt0mQDvJh08Ktp/PKJyybrhsHg85P0NQ476Smw=; b=WGwIqLFlDwZ5JZPv0BhXDurfle 08py/jYDLaG8gINguhfsz8aTa297dgVKY/LNvLkIXdVVtpxHQqmywBayfb43JCPiFsoJihisu1LYd 2fHI+GODn5v1ZoBf/lRwfG+zVLW3dg2+GK7n1r4kwFDVp43uJbCHpaKdYFv/6YQM6NiBySOabTmIy jIqbHHJbkfMdcHpPNhcWvbFc/1RX/1hOLfDVWnlvUlLOnbKwGRusFrhk6nZWvnDFn6v/2FFWBBJPQ U+9HSjt37GGoem449lQ+gkQr8O9fZ0fFilM2BAuprWsXHV9GqT93EEfd3ioYqRuVLDI/LeFEj0Bfd JdoEqRrw==; Received: from [38.23.173.23] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.99.1 #2 (Red Hat Linux)) id 1wedpC-000000005oV-0DGl; Tue, 30 Jun 2026 19:08:50 +0000 From: "Liam R. Howlett (Oracle)" To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, maple-tree@lists.infradead.org, "Liam R. Howlett (Oracle)" , Ingo Molnar , Will Deacon , Boqun Feng , Waiman Long , Peter Zijlstra Subject: [PATCH v2 02/19] locking/lockdep: Add sequence counter to held_lock Date: Tue, 30 Jun 2026 15:08:26 -0400 Message-ID: <20260630190843.3563858-3-liam@infradead.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260630190843.3563858-1-liam@infradead.org> References: <20260630190843.3563858-1-liam@infradead.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 0EE1AA000A X-Stat-Signature: riqouypaznmunar88exwokkdmgxjmnos X-HE-Tag: 1782846530-438923 X-HE-Meta: U2FsdGVkX1+2tSq8KrxbrL3GAoVyQjScnIeZUh2xM5zNzG/LSWmyePTtte6EwpUnNe2oR3t8FvFrJO/dRWMOctU6gRWGhqRAqlgbXsOkWWQ0W4czS60H0E+LupQKetwqMurfbr2UlLK26mqbT2l4CY+mm0y28XvIBaWyTw1dvI7C53vOSNbR3SEA3kTH14m4y0YHFyRynmCsUn4M808tLEMbWTjEGkWjQwwSqS55udSuI33kUIcdQK65cBIvRFzdvx3XUOyb1PzQogryjNcI5waLXGxaXz4s7X0rdo1EuLrKiZKdSPzFP27olO2O01bLzqW1tFcHJdMvP5E0xv2CFYYl9YrHQ6L3CHRxfo39Liv2iiP48Nd5mQaph0cqi60zIXh8SHZO3ww48bYbO9ld5G2+rjl97wm7mjOPwg35C+IURlgHl7bgmgfVRA3B8hEX5LqqYv4C3AK66w3E311gTa1zHIfOCuJjGorh3yAWTC1YTEBuV3kumYLhL1N1btmd+Pgxu8QV1XBkvRytYP/k0pBXKkIP9uIwkIReLZdyOgQbkoavmEBmN0Qo07JAUfz8KJyIczf3JiILfOuXPbSy6uUq9qtdzTBj2CW5VBRLigXF4iI4l9ehMnLFV49+xiPjH12dXctDKMvC2vpn5OeUBQZmZV1bTEn0kWo+RpR/1pWVOCos3qxp7/ImuATgDWfXi+yKFJGPof/q+Fb/NSjl2d0Ta2oYsly37v8umxUv5glkY2Sy92Jr+uXMulK8a07PD76FimCZQS5SLd296ZuOLKrYeLMb5vzO6h9QOcQYWlyMlZ7xD/UIZkxWlCprR+xkJqp3t7YibxvFygS0t6T7qDEoJ0P14GXEJzA6eRxGYOfBcY5JR7+FaXnGBpf4teDm+1njmxeVjpmxupm9aT+PZ0H9N9c2I5QGoJJ8EDkuc9a92UJaLvhPoXctEWjKI7SNcpgtCEQhu0WCwXUmdz8 LGS4my6y CzrkpcEp4ULV7Chupn3J8GDUNBDrHsZM5Ciipibqqwmakd8VQdXS38ox0dLdV3cUu9ab/CWpawAUj5iBIYLpVVqA9ZLQ+ywEWpZVqUiDaYKESIEzSmWKBa43kLSZ4jNlEPDg6kwYTWT8Sb5B3U8XOZkirqEEvQjlPlWyPxbsU6OhOqOFNgwLdFoxvUbkX/wlQgL1NRa+IpKzz/jYDdp+LfrWY9QrXvMbm9/8UDfmlz7qa2OLHN9nEZc24OZrI0qhzvwBh9TMFMWFSP8ICwB1pHQ//l26u1SFjZwSp4IKTO+OgJYWSUiD9uWKvHyJAqnhwR2Mo6GIesGKR+GzXTLdeaU4JAaq1Kq64waDD5Brovw0Vpp2R2IbhIPlQUaVP7bBiHuF5eciTNj47dgiRW8UdkmBwqFK5L7FgxLzddKc0jqiG4ho5KLp/BHIBzQgG6Db77MnGHUJCyFW5kNq1A+D0ai+yngVkn5EW1+QUi2WOw3odty4= Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Add an 8 bit small sequence counter to the held_lock struct to detect if the lock as been dropped and reacquired. This is useful when a data structure depends on a constant locking context, but is not able to detect locking and unlocking of the lock through its own API. Since the __lock_unpin_lock() will no longer detect underflow by casting the unsigned int to a signed int, update the casting code to use a temp variable for calculations using a signed int. Cc: Ingo Molnar Cc: Will Deacon Cc: Boqun Feng Cc: Waiman Long Link: https://lore.kernel.org/all/h3tpnj5kzcrxms5picmimtkpg4aypcpip5wbd6bt2rpdj5k7eb@nhtzs3lefrkq/ Suggested-by: Peter Zijlstra Signed-off-by: Liam R. Howlett (Oracle) --- include/linux/lockdep.h | 3 ++ include/linux/lockdep_types.h | 3 +- include/linux/sched.h | 1 + kernel/locking/lockdep.c | 58 ++++++++++++++++++++++++++++++----- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 621566345406d..a6451ecbbe9a0 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -273,6 +273,9 @@ extern struct pin_cookie lock_pin_lock(struct lockdep_map *lock); extern void lock_repin_lock(struct lockdep_map *lock, struct pin_cookie); extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie); +extern u32 lock_sequence(struct lockdep_map *lock); +#define lockdep_sequence(lock) lock_sequence(&(lock)->dep_map) + #define lockdep_depth(tsk) (debug_locks ? (tsk)->lockdep_depth : 0) #define lockdep_assert(cond) \ diff --git a/include/linux/lockdep_types.h b/include/linux/lockdep_types.h index eae115a264885..55c4b152fedf7 100644 --- a/include/linux/lockdep_types.h +++ b/include/linux/lockdep_types.h @@ -253,7 +253,8 @@ struct held_lock { unsigned int hardirqs_off:1; unsigned int sync:1; unsigned int references:11; /* 32 bits */ - unsigned int pin_count; + unsigned int pin_count:24; + unsigned int seq_count:8; }; #else /* !CONFIG_LOCKDEP */ diff --git a/include/linux/sched.h b/include/linux/sched.h index 373bcc0598d10..14d5ce8dd6136 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1288,6 +1288,7 @@ struct task_struct { u64 curr_chain_key; int lockdep_depth; unsigned int lockdep_recursion; + unsigned int lockdep_seq; struct held_lock held_locks[MAX_LOCK_DEPTH]; #endif diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index 2d4c5bab5af88..a69567bdd7912 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -5077,7 +5077,7 @@ static int __lock_is_held(const struct lockdep_map *lock, int read); static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, int trylock, int read, int check, int hardirqs_off, struct lockdep_map *nest_lock, unsigned long ip, - int references, int pin_count, int sync) + int references, int pin_count, int sync, int seq) { struct task_struct *curr = current; struct lock_class *class = NULL; @@ -5183,6 +5183,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, hlock->holdtime_stamp = lockstat_clock(); #endif hlock->pin_count = pin_count; + hlock->seq_count = seq; if (check_wait_context(curr, hlock)) return 0; @@ -5388,7 +5389,7 @@ static int reacquire_held_locks(struct task_struct *curr, unsigned int depth, hlock->read, hlock->check, hlock->hardirqs_off, hlock->nest_lock, hlock->acquire_ip, - hlock->references, hlock->pin_count, 0)) { + hlock->references, hlock->pin_count, 0, hlock->seq_count)) { case 0: return 1; case 1: @@ -5669,14 +5670,17 @@ static void __lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie cookie struct held_lock *hlock = curr->held_locks + i; if (match_held_lock(hlock, lock)) { + int pin_count; + if (WARN(!hlock->pin_count, "unpinning an unpinned lock\n")) return; - hlock->pin_count -= cookie.val; + pin_count = hlock->pin_count - cookie.val; - if (WARN((int)hlock->pin_count < 0, "pin count corrupted\n")) - hlock->pin_count = 0; + if (WARN(pin_count < 0, "pin count corrupted\n")) + pin_count = 0; + hlock->pin_count = pin_count; return; } } @@ -5684,6 +5688,24 @@ static void __lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie cookie WARN(1, "unpinning an unheld lock\n"); } +static u32 __lock_sequence(struct lockdep_map *lock) +{ + struct task_struct *curr = current; + int i; + + if (unlikely(!debug_locks)) + return ~0; + + for (i = 0; i < curr->lockdep_depth; i++) { + struct held_lock *hlock = curr->held_locks + i; + + if (match_held_lock(hlock, lock)) + return hlock->seq_count; + } + + return ~0; +} + /* * Check whether we follow the irq-flags state precisely: */ @@ -5866,7 +5888,8 @@ void lock_acquire(struct lockdep_map *lock, unsigned int subclass, lockdep_recursion_inc(); __lock_acquire(lock, subclass, trylock, read, check, - irqs_disabled_flags(flags), nest_lock, ip, 0, 0, 0); + irqs_disabled_flags(flags), nest_lock, ip, 0, 0, 0, + ++current->lockdep_seq); lockdep_recursion_finish(); raw_local_irq_restore(flags); } @@ -5914,7 +5937,8 @@ void lock_sync(struct lockdep_map *lock, unsigned subclass, int read, lockdep_recursion_inc(); __lock_acquire(lock, subclass, 0, read, check, - irqs_disabled_flags(flags), nest_lock, ip, 0, 0, 1); + irqs_disabled_flags(flags), nest_lock, ip, 0, 0, 1, + ++current->lockdep_seq); check_chain_key(current); lockdep_recursion_finish(); raw_local_irq_restore(flags); @@ -6000,6 +6024,26 @@ void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie cookie) } EXPORT_SYMBOL_GPL(lock_unpin_lock); +u32 lock_sequence(struct lockdep_map *lock) +{ + unsigned long flags; + u32 seq = ~0; + + if (unlikely(!lockdep_enabled())) + return seq; + + raw_local_irq_save(flags); + check_flags(flags); + + lockdep_recursion_inc(); + seq = __lock_sequence(lock); + lockdep_recursion_finish(); + raw_local_irq_restore(flags); + + return seq; +} +EXPORT_SYMBOL_GPL(lock_sequence); + #ifdef CONFIG_LOCK_STAT static void print_lock_contention_bug(struct task_struct *curr, struct lockdep_map *lock, -- 2.47.3