Petr Mladek
03fc7f9c99
printk/nmi: Prevent deadlock when accessing the main log buffer in NMI
...
The commit 719f6a7040 ("printk: Use the main logbuf in NMI
when logbuf_lock is available") brought back the possible deadlocks
in printk() and NMI.
The check of logbuf_lock is done only in printk_nmi_enter() to prevent
mixed output. But another CPU might take the lock later, enter NMI, and:
+ Both NMIs might be serialized by yet another lock, for example,
the one in nmi_cpu_backtrace().
+ The other CPU might get stopped in NMI, see smp_send_stop()
in panic().
The only safe solution is to use trylock when storing the message
into the main log-buffer. It might cause reordering when some lines
go to the main lock buffer directly and others are delayed via
the per-CPU buffer. It means that it is not useful in general.
This patch replaces the problematic NMI deferred context with NMI
direct context. It can be used to mark a code that might produce
many messages in NMI and the risk of losing them is more critical
than problems with eventual reordering.
The context is then used when dumping trace buffers on oops. It was
the primary motivation for the original fix. Also the reordering is
even smaller issue there because some traces have their own time stamps.
Finally, nmi_cpu_backtrace() need not longer be serialized because
it will always us the per-CPU buffers again.
Fixes: 719f6a7040 ("printk: Use the main logbuf in NMI when logbuf_lock is available")
Cc: stable@vger.kernel.org
Link: http://lkml.kernel.org/r/20180627142028.11259-1-pmladek@suse.com
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Cc: linux-kernel@vger.kernel.org
Cc: stable@vger.kernel.org
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
2018-07-09 14:10:40 +02:00
..
bpf
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2018-05-25 19:54:42 -07:00
cgroup
Merge branch 'for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
2018-06-05 17:08:45 -07:00
configs
KVM changes for 4.16
2018-02-10 13:16:35 -08:00
debug
* Fix 2032 time access issues and new compiler warnings
2018-04-12 10:21:19 -07:00
events
perf/core: Wire up compat PERF_EVENT_IOC_QUERY_BPF, PERF_EVENT_IOC_MODIFY_ATTRIBUTES
2018-05-25 08:11:11 +02:00
gcov
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
irq
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2018-06-04 19:59:22 -07:00
livepatch
livepatch: Allow to call a custom callback when freeing shadow variables
2018-04-17 13:42:48 +02:00
locking
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2018-06-04 16:40:11 -07:00
power
Power management updates for 4.18-rc1
2018-06-05 09:38:39 -07:00
printk
printk/nmi: Prevent deadlock when accessing the main log buffer in NMI
2018-07-09 14:10:40 +02:00
rcu
rcu/x86: Provide early rcu_cpu_starting() callback
2018-05-22 16:12:26 -07:00
sched
Power management updates for 4.18-rc1
2018-06-05 09:38:39 -07:00
time
Power management updates for 4.18-rc1
2018-06-05 09:38:39 -07:00
trace
printk/nmi: Prevent deadlock when accessing the main log buffer in NMI
2018-07-09 14:10:40 +02:00
.gitignore
acct.c
kernel/acct.c: fix the acct->needcheck check in check_free_space()
2018-01-04 16:45:09 -08:00
async.c
kernel/async.c: revert "async: simplify lowest_in_progress()"
2018-02-06 18:32:44 -08:00
audit.c
audit/stable-4.17 PR 20180403
2018-04-06 15:01:25 -07:00
audit.h
audit: track the owner of the command mutex ourselves
2018-02-23 11:22:22 -05:00
audit_fsnotify.c
audit_tree.c
audit: track the owner of the command mutex ourselves
2018-02-23 11:22:22 -05:00
audit_watch.c
audit/stable-4.13 PR 20170816
2017-08-16 16:48:34 -07:00
auditfilter.c
audit: deprecate the AUDIT_FILTER_ENTRY filter
2018-02-15 14:36:29 -05:00
auditsc.c
audit: bail before bug check if audit disabled
2018-02-15 14:40:25 -05:00
backtracetest.c
bounds.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
capability.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
compat.c
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2018-06-04 20:27:54 -07:00
configs.c
context_tracking.c
cpu.c
cpu/hotplug: Fix unused function warning
2018-03-15 20:34:40 +01:00
cpu_pm.c
PM / CPU: replace raw_notifier with atomic_notifier
2017-07-31 13:09:49 +02:00
crash_core.c
kexec: export PG_swapbacked to VMCOREINFO
2018-04-13 17:10:27 -07:00
crash_dump.c
cred.c
delayacct.c
delayacct: Use raw_spinlocks
2018-04-27 14:34:51 +02:00
dma.c
proc: introduce proc_create_single{,_data}
2018-05-16 07:23:35 +02:00
elfcore.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
exec_domain.c
proc: introduce proc_create_single{,_data}
2018-05-16 07:23:35 +02:00
exit.c
kernel: use kernel_wait4() instead of sys_wait4()
2018-04-02 20:14:51 +02:00
extable.c
extable: Make init_kernel_text() global
2018-02-21 16:54:06 +01:00
fail_function.c
error-injection: Fix to prohibit jump optimization
2018-03-12 16:16:00 +01:00
fork.c
fork: unconditionally clear stack on fork
2018-04-20 17:18:35 -07:00
freezer.c
futex.c
pids: introduce find_get_task_by_vpid() helper
2018-02-06 18:32:46 -08:00
futex_compat.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
groups.c
kernel: make groups_sort calling a responsibility group_info allocators
2017-12-14 16:00:49 -08:00
hung_task.c
irq_work.c
irq/work: Improve the flag definitions
2018-01-08 19:43:15 +01:00
jump_label.c
jump_label: Disable jump labels in __exit code
2018-03-20 08:57:17 +01:00
kallsyms.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk
2018-02-01 13:36:15 -08:00
kcmp.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kcov.c
kcov: detect double association with a single task
2018-02-06 18:32:46 -08:00
kexec.c
kexec: call do_kexec_load() in compat syscall directly
2018-04-02 20:15:01 +02:00
kexec_core.c
x86/mm, kexec: Allow kexec to be used with SME
2017-07-18 11:38:04 +02:00
kexec_file.c
kernel/kexec_file.c: allow archs to set purgatory load address
2018-04-13 17:10:28 -07:00
kexec_internal.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
kmod.c
kmod: move #ifdef CONFIG_MODULES wrapper to Makefile
2017-09-08 18:26:51 -07:00
kprobes.c
kprobes: Fix random address output of blacklist file
2018-04-25 10:27:56 -04:00
ksysfs.c
kthread.c
kthread: Allow kthread_park() on a parked kthread
2018-05-25 08:03:51 +02:00
latencytop.c
Makefile
error-injection: Support fault injection framework
2018-01-12 17:33:38 -08:00
memremap.c
kernel/memremap: Remove stale devres_free() call
2018-03-06 10:58:54 -08:00
module-internal.h
module.c
init: fix false positives in W+X checking
2018-05-11 17:28:45 -07:00
module_signing.c
notifier.c
nsproxy.c
padata.c
padata: add SPDX identifier
2018-01-05 18:43:00 +11:00
panic.c
taint: add taint for randstruct
2018-04-11 10:28:35 -07:00
params.c
kernel/params.c: downgrade warning for unsafe parameters
2018-04-11 10:28:37 -07:00
pid.c
xarray: add the xa_lock to the radix_tree_root
2018-04-11 10:28:39 -07:00
pid_namespace.c
Merge branch 'userns-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2018-04-03 19:15:32 -07:00
profile.c
ptrace.c
pids: introduce find_get_task_by_vpid() helper
2018-02-06 18:32:46 -08:00
range.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
reboot.c
kernel/reboot.c: add devm_register_reboot_notifier()
2017-11-17 16:10:04 -08:00
relay.c
kernel/relay.c: limit kmalloc size to KMALLOC_MAX_SIZE
2018-02-21 15:35:43 -08:00
resource.c
resource: switch to proc_create_seq_data
2018-05-16 07:24:30 +02:00
seccomp.c
seccomp: Move speculation migitation control to arch code
2018-05-05 00:51:44 +02:00
signal.c
Merge branch 'siginfo-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2018-06-04 15:23:48 -07:00
smp.c
smp/core: Use lockdep to assert IRQs are disabled/enabled
2017-11-08 11:13:50 +01:00
smpboot.c
watchdog/core, powerpc: Lock cpus across reconfiguration
2017-10-04 10:53:54 +02:00
smpboot.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
softirq.c
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2018-06-04 19:59:22 -07:00
stacktrace.c
stop_machine.c
Linux 4.17-rc5
2018-05-15 08:10:50 +02:00
sys.c
kernel/sys.c: fix potential Spectre v1 issue
2018-05-25 18:12:11 -07:00
sys_ni.c
aio: implement io_pgetevents
2018-05-02 19:57:24 +02:00
sysctl.c
kernel/sysctl.c: add kdoc comments to do_proc_do{u}intvec_minmax_conv_param
2018-04-11 10:28:38 -07:00
sysctl_binary.c
staging: irda: remove remaining remants of irda code removal
2018-04-16 11:26:49 +02:00
task_work.c
locking/barriers: Convert users of lockless_dereference() to READ_ONCE()
2017-12-17 13:57:15 +01:00
taskstats.c
pids: introduce find_get_task_by_vpid() helper
2018-02-06 18:32:46 -08:00
test_kprobes.c
kprobes: Disable the jprobes test code
2017-10-20 11:02:54 +02:00
torture.c
rcu: Rename cond_resched_rcu_qs() to cond_resched_tasks_rcu_qs()
2018-05-15 10:27:29 -07:00
tracepoint.c
tracepoint: Do not warn on ENOMEM
2018-04-30 12:09:56 -04:00
tsacct.c
ucount.c
headers: untangle kmemleak.h from mm.h
2018-04-05 21:36:27 -07:00
uid16.c
fs: add do_fchownat(), ksys_fchown() helpers and ksys_{,l}chown() wrappers
2018-04-02 20:15:59 +02:00
uid16.h
kernel: provide ksys_*() wrappers for syscalls called by kernel/uid16.c
2018-04-02 20:15:30 +02:00
umh.c
kernel: use kernel_wait4() instead of sys_wait4()
2018-04-02 20:14:51 +02:00
up.c
smp: Avoid using two cache lines for struct call_single_data
2017-08-29 15:14:38 +02:00
user-return-notifier.c
user.c
efivarfs: Limit the rate for non-root to read files
2018-02-22 10:21:02 -08:00
user_namespace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2017-11-16 12:20:15 -08:00
utsname.c
uts: create "struct uts_namespace" from kmem_cache
2018-04-11 10:28:35 -07:00
utsname_sysctl.c
watchdog.c
Merge branch 'linus' into sched/core, to pick up fixes
2017-11-08 10:17:15 +01:00
watchdog_hld.c
Merge branch 'linus' into core/urgent, to pick up dependent commits
2017-11-04 08:53:04 +01:00
workqueue.c
workqueue: move function definitions within CONFIG_SMP block
2018-05-23 11:16:58 -07:00
workqueue_internal.h
workqueue: Set worker->desc to workqueue name by default
2018-05-18 08:47:13 -07:00