]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
fixes for 4.14
authorSasha Levin <sashal@kernel.org>
Fri, 5 Jul 2019 14:07:44 +0000 (10:07 -0400)
committerSasha Levin <sashal@kernel.org>
Fri, 5 Jul 2019 14:07:44 +0000 (10:07 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.14/ftrace-x86-remove-possible-deadlock-between-register.patch [new file with mode: 0644]
queue-4.14/series
queue-4.14/tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch [new file with mode: 0644]

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 (file)
index 0000000..5f73b50
--- /dev/null
@@ -0,0 +1,189 @@
+From 0c5a9db41f4de11debca422d73b07523de010235 Mon Sep 17 00:00:00 2001
+From: Petr Mladek <pmladek@suse.com>
+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 <tglx@linutronix.de>
+Reported-by: Miroslav Benes <mbenes@suse.cz>
+Reviewed-by: Miroslav Benes <mbenes@suse.cz>
+Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
+Signed-off-by: Petr Mladek <pmladek@suse.com>
+[
+  As reviewed by Miroslav Benes <mbenes@suse.cz>, removed return value of
+  ftrace_run_update_code() as it is a void function.
+]
+Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <linux/init.h>
+ #include <linux/list.h>
+ #include <linux/module.h>
++#include <linux/memory.h>
+ #include <trace/syscall.h>
+@@ -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 <linux/hash.h>
+ #include <linux/rcupdate.h>
+ #include <linux/kprobes.h>
+-#include <linux/memory.h>
+ #include <trace/events/sched.h>
+@@ -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
+
index fd28cf93728216b28087f7e63ebee27ac796c8d6..aff960e82821d2826475d4002b55315f002ad29c 100644 (file)
@@ -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 (file)
index 0000000..2bde754
--- /dev/null
@@ -0,0 +1,36 @@
+From d27810767b3392c46504cab2a290309865fbee2f Mon Sep 17 00:00:00 2001
+From: Linus Torvalds <torvalds@linux-foundation.org>
+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 <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+