kernel_optimize_test/kernel/debug/kdb
Petr Mladek d5d8d3d0d4 kdb: properly synchronize vkdb_printf() calls with other CPUs
kdb_printf_lock does not prevent other CPUs from entering the critical
section because it is ignored when KDB_STATE_PRINTF_LOCK is set.

The problematic situation might look like:

CPU0					CPU1

vkdb_printf()
  if (!KDB_STATE(PRINTF_LOCK))
    KDB_STATE_SET(PRINTF_LOCK);
    spin_lock_irqsave(&kdb_printf_lock, flags);

					vkdb_printf()
					  if (!KDB_STATE(PRINTF_LOCK))

BANG: The PRINTF_LOCK state is set and CPU1 is entering the critical
section without spinning on the lock.

The problem is that the code tries to implement locking using two state
variables that are not handled atomically.  Well, we need a custom
locking because we want to allow reentering the critical section on the
very same CPU.

Let's use solution from Petr Zijlstra that was proposed for a similar
scenario, see
https://lkml.kernel.org/r/20161018171513.734367391@infradead.org

This patch uses the same trick with cmpxchg().  The only difference is
that we want to handle only recursion from the same context and
therefore we disable interrupts.

In addition, KDB_STATE_PRINTF_LOCK is removed.  In fact, we are not able
to set it a non-racy way.

Link: http://lkml.kernel.org/r/1480412276-16690-3-git-send-email-pmladek@suse.com
Signed-off-by: Petr Mladek <pmladek@suse.com>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-12-14 16:04:08 -08:00
..
.gitignore kdb: core for kgdb back end (1 of 2) 2010-05-20 21:04:20 -05:00
kdb_bp.c mm/init: Add 'rodata=off' boot cmdline parameter to disable read-only kernel mappings 2016-02-22 08:51:37 +01:00
kdb_bt.c kernel/printk: use symbolic defines for console loglevels 2014-06-04 16:54:17 -07:00
kdb_cmds kdb: cleanup unused variables missed in the original kdb merge 2011-08-01 13:23:58 -05:00
kdb_debugger.c kgdb: timeout if secondary CPUs ignore the roundup 2014-11-11 09:31:53 -06:00
kdb_io.c kdb: properly synchronize vkdb_printf() calls with other CPUs 2016-12-14 16:04:08 -08:00
kdb_keyboard.c KDB: Fix usability issues relating to the 'enter' key. 2012-03-22 15:07:15 -05:00
kdb_main.c kdb: remove unused kdb_event handling 2016-12-14 16:04:08 -08:00
kdb_private.h kdb: properly synchronize vkdb_printf() calls with other CPUs 2016-12-14 16:04:08 -08:00
kdb_support.c kdb: remove the second argument of k[un]map_atomic() 2012-03-20 21:48:26 +08:00
Makefile kgdboc,keyboard: Keyboard driver for kdb with kgdb 2010-05-20 21:04:24 -05:00