| From 92fddba0a1dba3caa174a55417eae1cbcdf00062 Mon Sep 17 00:00:00 2001 |
| From: Kevin Hao <haokexin@gmail.com> |
| Date: Tue, 5 Nov 2019 21:16:57 -0800 |
| Subject: [PATCH] dump_stack: avoid the livelock of the dump_lock |
| |
| commit 5cbf2fff3bba8d3c6a4d47c1754de1cf57e2b01f upstream. |
| |
| In the current code, we use the atomic_cmpxchg() to serialize the output |
| of the dump_stack(), but this implementation suffers the thundering herd |
| problem. We have observed such kind of livelock on a Marvell cn96xx |
| board(24 cpus) when heavily using the dump_stack() in a kprobe handler. |
| Actually we can let the competitors to wait for the releasing of the |
| lock before jumping to atomic_cmpxchg(). This will definitely mitigate |
| the thundering herd problem. Thanks Linus for the suggestion. |
| |
| [akpm@linux-foundation.org: fix comment] |
| Link: http://lkml.kernel.org/r/20191030031637.6025-1-haokexin@gmail.com |
| Fixes: b58d977432c8 ("dump_stack: serialize the output from dump_stack()") |
| Signed-off-by: Kevin Hao <haokexin@gmail.com> |
| Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/lib/dump_stack.c b/lib/dump_stack.c |
| index 5cff72f18c4a..33ffbf308853 100644 |
| --- a/lib/dump_stack.c |
| +++ b/lib/dump_stack.c |
| @@ -106,7 +106,12 @@ asmlinkage __visible void dump_stack(void) |
| was_locked = 1; |
| } else { |
| local_irq_restore(flags); |
| - cpu_relax(); |
| + /* |
| + * Wait for the lock to release before jumping to |
| + * atomic_cmpxchg() in order to mitigate the thundering herd |
| + * problem. |
| + */ |
| + do { cpu_relax(); } while (atomic_read(&dump_lock) != -1); |
| goto retry; |
| } |
| |
| -- |
| 2.7.4 |
| |