Skip to content

Commit d441f09

Browse files
ioworker0akpm00
authored andcommitted
hung_task: fix warnings caused by unaligned lock pointers
The blocker tracking mechanism assumes that lock pointers are at least 4-byte aligned to use their lower bits for type encoding. However, as reported by Eero Tamminen, some architectures like m68k only guarantee 2-byte alignment of 32-bit values. This breaks the assumption and causes two related WARN_ON_ONCE checks to trigger. To fix this, the runtime checks are adjusted to silently ignore any lock that is not 4-byte aligned, effectively disabling the feature in such cases and avoiding the related warnings. Thanks to Geert Uytterhoeven for bisecting! Link: https://lkml.kernel.org/r/20250909145243.17119-1-lance.yang@linux.dev Fixes: e711faa ("hung_task: replace blocker_mutex with encoded blocker") Signed-off-by: Lance Yang <lance.yang@linux.dev> Reported-by: Eero Tamminen <oak@helsinkinet.fi> Closes: https://lore.kernel.org/lkml/CAMuHMdW7Ab13DdGs2acMQcix5ObJK0O2dG_Fxzr8_g58Rc1_0g@mail.gmail.com Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> Cc: Anna Schumaker <anna.schumaker@oracle.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Finn Thain <fthain@linux-m68k.org> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Joel Granados <joel.granados@kernel.org> Cc: John Stultz <jstultz@google.com> Cc: Kent Overstreet <kent.overstreet@linux.dev> Cc: Lance Yang <lance.yang@linux.dev> Cc: Mingzhe Yang <mingzhe.yang@ly.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sergey Senozhatsky <senozhatsky@chromium.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Tomasz Figa <tfiga@chromium.org> Cc: Waiman Long <longman@redhat.com> Cc: Will Deacon <will@kernel.org> Cc: Yongliang Gao <leonylgao@tencent.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent ce4be9e commit d441f09

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

include/linux/hung_task.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
* always zero. So we can use these bits to encode the specific blocking
2121
* type.
2222
*
23+
* Note that on architectures where this is not guaranteed, or for any
24+
* unaligned lock, this tracking mechanism is silently skipped for that
25+
* lock.
26+
*
2327
* Type encoding:
2428
* 00 - Blocked on mutex (BLOCKER_TYPE_MUTEX)
2529
* 01 - Blocked on semaphore (BLOCKER_TYPE_SEM)
@@ -45,16 +49,14 @@ static inline void hung_task_set_blocker(void *lock, unsigned long type)
4549
* If the lock pointer matches the BLOCKER_TYPE_MASK, return
4650
* without writing anything.
4751
*/
48-
if (WARN_ON_ONCE(lock_ptr & BLOCKER_TYPE_MASK))
52+
if (lock_ptr & BLOCKER_TYPE_MASK)
4953
return;
5054

5155
WRITE_ONCE(current->blocker, lock_ptr | type);
5256
}
5357

5458
static inline void hung_task_clear_blocker(void)
5559
{
56-
WARN_ON_ONCE(!READ_ONCE(current->blocker));
57-
5860
WRITE_ONCE(current->blocker, 0UL);
5961
}
6062

0 commit comments

Comments
 (0)