From: Sasha Levin Date: Fri, 5 Jul 2019 14:07:44 +0000 (-0400) Subject: fixes for 4.14 X-Git-Tag: v5.1.17~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=82ed44ed90dd6565c681869ccead0a438066db83;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.14 Signed-off-by: Sasha Levin --- diff --git a/queue-4.14/ftrace-x86-remove-possible-deadlock-between-register.patch b/queue-4.14/ftrace-x86-remove-possible-deadlock-between-register.patch new file mode 100644 index 00000000000..5f73b509eef --- /dev/null +++ b/queue-4.14/ftrace-x86-remove-possible-deadlock-between-register.patch @@ -0,0 +1,189 @@ +From 0c5a9db41f4de11debca422d73b07523de010235 Mon Sep 17 00:00:00 2001 +From: Petr Mladek +Date: Thu, 27 Jun 2019 10:13:34 +0200 +Subject: ftrace/x86: Remove possible deadlock between register_kprobe() and + ftrace_run_update_code() + +[ Upstream commit d5b844a2cf507fc7642c9ae80a9d585db3065c28 ] + +The commit 9f255b632bf12c4dd7 ("module: Fix livepatch/ftrace module text +permissions race") causes a possible deadlock between register_kprobe() +and ftrace_run_update_code() when ftrace is using stop_machine(). + +The existing dependency chain (in reverse order) is: + +-> #1 (text_mutex){+.+.}: + validate_chain.isra.21+0xb32/0xd70 + __lock_acquire+0x4b8/0x928 + lock_acquire+0x102/0x230 + __mutex_lock+0x88/0x908 + mutex_lock_nested+0x32/0x40 + register_kprobe+0x254/0x658 + init_kprobes+0x11a/0x168 + do_one_initcall+0x70/0x318 + kernel_init_freeable+0x456/0x508 + kernel_init+0x22/0x150 + ret_from_fork+0x30/0x34 + kernel_thread_starter+0x0/0xc + +-> #0 (cpu_hotplug_lock.rw_sem){++++}: + check_prev_add+0x90c/0xde0 + validate_chain.isra.21+0xb32/0xd70 + __lock_acquire+0x4b8/0x928 + lock_acquire+0x102/0x230 + cpus_read_lock+0x62/0xd0 + stop_machine+0x2e/0x60 + arch_ftrace_update_code+0x2e/0x40 + ftrace_run_update_code+0x40/0xa0 + ftrace_startup+0xb2/0x168 + register_ftrace_function+0x64/0x88 + klp_patch_object+0x1a2/0x290 + klp_enable_patch+0x554/0x980 + do_one_initcall+0x70/0x318 + do_init_module+0x6e/0x250 + load_module+0x1782/0x1990 + __s390x_sys_finit_module+0xaa/0xf0 + system_call+0xd8/0x2d0 + + Possible unsafe locking scenario: + + CPU0 CPU1 + ---- ---- + lock(text_mutex); + lock(cpu_hotplug_lock.rw_sem); + lock(text_mutex); + lock(cpu_hotplug_lock.rw_sem); + +It is similar problem that has been solved by the commit 2d1e38f56622b9b +("kprobes: Cure hotplug lock ordering issues"). Many locks are involved. +To be on the safe side, text_mutex must become a low level lock taken +after cpu_hotplug_lock.rw_sem. + +This can't be achieved easily with the current ftrace design. +For example, arm calls set_all_modules_text_rw() already in +ftrace_arch_code_modify_prepare(), see arch/arm/kernel/ftrace.c. +This functions is called: + + + outside stop_machine() from ftrace_run_update_code() + + without stop_machine() from ftrace_module_enable() + +Fortunately, the problematic fix is needed only on x86_64. It is +the only architecture that calls set_all_modules_text_rw() +in ftrace path and supports livepatching at the same time. + +Therefore it is enough to move text_mutex handling from the generic +kernel/trace/ftrace.c into arch/x86/kernel/ftrace.c: + + ftrace_arch_code_modify_prepare() + ftrace_arch_code_modify_post_process() + +This patch basically reverts the ftrace part of the problematic +commit 9f255b632bf12c4dd7 ("module: Fix livepatch/ftrace module +text permissions race"). And provides x86_64 specific-fix. + +Some refactoring of the ftrace code will be needed when livepatching +is implemented for arm or nds32. These architectures call +set_all_modules_text_rw() and use stop_machine() at the same time. + +Link: http://lkml.kernel.org/r/20190627081334.12793-1-pmladek@suse.com + +Fixes: 9f255b632bf12c4dd7 ("module: Fix livepatch/ftrace module text permissions race") +Acked-by: Thomas Gleixner +Reported-by: Miroslav Benes +Reviewed-by: Miroslav Benes +Reviewed-by: Josh Poimboeuf +Signed-off-by: Petr Mladek +[ + As reviewed by Miroslav Benes , removed return value of + ftrace_run_update_code() as it is a void function. +] +Signed-off-by: Steven Rostedt (VMware) +Signed-off-by: Sasha Levin +--- + arch/x86/kernel/ftrace.c | 3 +++ + kernel/trace/ftrace.c | 10 +--------- + 2 files changed, 4 insertions(+), 9 deletions(-) + +diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c +index c020ba4b7eb6..ccc2b9d2956a 100644 +--- a/arch/x86/kernel/ftrace.c ++++ b/arch/x86/kernel/ftrace.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include + +@@ -36,6 +37,7 @@ + + int ftrace_arch_code_modify_prepare(void) + { ++ mutex_lock(&text_mutex); + set_kernel_text_rw(); + set_all_modules_text_rw(); + return 0; +@@ -45,6 +47,7 @@ int ftrace_arch_code_modify_post_process(void) + { + set_all_modules_text_ro(); + set_kernel_text_ro(); ++ mutex_unlock(&text_mutex); + return 0; + } + +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index ff3c8ca907c4..c4a0ad18c859 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -34,7 +34,6 @@ + #include + #include + #include +-#include + + #include + +@@ -2693,12 +2692,10 @@ static void ftrace_run_update_code(int command) + { + int ret; + +- mutex_lock(&text_mutex); +- + ret = ftrace_arch_code_modify_prepare(); + FTRACE_WARN_ON(ret); + if (ret) +- goto out_unlock; ++ return; + + /* + * By default we use stop_machine() to modify the code. +@@ -2710,9 +2707,6 @@ static void ftrace_run_update_code(int command) + + ret = ftrace_arch_code_modify_post_process(); + FTRACE_WARN_ON(ret); +- +-out_unlock: +- mutex_unlock(&text_mutex); + } + + static void ftrace_run_modify_code(struct ftrace_ops *ops, int command, +@@ -5800,7 +5794,6 @@ void ftrace_module_enable(struct module *mod) + struct ftrace_page *pg; + + mutex_lock(&ftrace_lock); +- mutex_lock(&text_mutex); + + if (ftrace_disabled) + goto out_unlock; +@@ -5861,7 +5854,6 @@ void ftrace_module_enable(struct module *mod) + ftrace_arch_code_modify_post_process(); + + out_unlock: +- mutex_unlock(&text_mutex); + mutex_unlock(&ftrace_lock); + + process_cached_mods(mod->name); +-- +2.20.1 + diff --git a/queue-4.14/series b/queue-4.14/series index fd28cf93728..aff960e8282 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -45,3 +45,5 @@ vhost-introduce-vhost_exceeds_weight.patch vhost_net-fix-possible-infinite-loop.patch vhost-vsock-add-weight-support.patch vhost-scsi-add-weight-support.patch +tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch +ftrace-x86-remove-possible-deadlock-between-register.patch diff --git a/queue-4.14/tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch b/queue-4.14/tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch new file mode 100644 index 00000000000..2bde7547d22 --- /dev/null +++ b/queue-4.14/tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch @@ -0,0 +1,36 @@ +From d27810767b3392c46504cab2a290309865fbee2f Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Mon, 6 May 2019 11:28:23 -0700 +Subject: tty: rocket: fix incorrect forward declaration of 'rp_init()' + +[ Upstream commit 423ea3255424b954947d167681b71ded1b8fca53 ] + +Make the forward declaration actually match the real function +definition, something that previous versions of gcc had just ignored. + +This is another patch to fix new warnings from gcc-9 before I start the +merge window pulls. I don't want to miss legitimate new warnings just +because my system update brought a new compiler with new warnings. + +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + drivers/tty/rocket.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c +index 070733ca94d5..32943afacffd 100644 +--- a/drivers/tty/rocket.c ++++ b/drivers/tty/rocket.c +@@ -279,7 +279,7 @@ MODULE_PARM_DESC(pc104_3, "set interface types for ISA(PC104) board #3 (e.g. pc1 + module_param_array(pc104_4, ulong, NULL, 0); + MODULE_PARM_DESC(pc104_4, "set interface types for ISA(PC104) board #4 (e.g. pc104_4=232,232,485,485,..."); + +-static int rp_init(void); ++static int __init rp_init(void); + static void rp_cleanup_module(void); + + module_init(rp_init); +-- +2.20.1 +