+++ /dev/null
-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
-
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
+++ /dev/null
-From 67064982a48219091d421b3a3782a3eb5035a268 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 9f033dfd2766..50d309662d78 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>
-
-@@ -35,6 +36,7 @@
-
- int ftrace_arch_code_modify_prepare(void)
- {
-+ mutex_lock(&text_mutex);
- set_kernel_text_rw();
- set_all_modules_text_rw();
- return 0;
-@@ -44,6 +46,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 0a0bb839ac5e..118ecce14386 100644
---- a/kernel/trace/ftrace.c
-+++ b/kernel/trace/ftrace.c
-@@ -35,7 +35,6 @@
- #include <linux/hash.h>
- #include <linux/rcupdate.h>
- #include <linux/kprobes.h>
--#include <linux/memory.h>
-
- #include <trace/events/sched.h>
-
-@@ -2628,12 +2627,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.
-@@ -2645,9 +2642,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,
-@@ -5771,7 +5765,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;
-@@ -5833,7 +5826,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
-
mm-vmscan.c-prevent-useless-kswapd-loops.patch
btrfs-ensure-replaced-device-doesn-t-have-pending-chunk-allocation.patch
tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch
-ftrace-x86-remove-possible-deadlock-between-register.patch
mlxsw-spectrum-handle-vlan-device-unlinking.patch
net-smc-move-unhash-before-release-of-clcsock.patch
media-s5p-mfc-fix-incorrect-bus-assignment-in-virtua.patch
+++ /dev/null
-From ec581b3fd5576fce9d4af96f937079ed695341ac 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 6e0c0ed8e4bf..ba3656405fcc 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>
-
-@@ -35,6 +36,7 @@
-
- int ftrace_arch_code_modify_prepare(void)
- {
-+ mutex_lock(&text_mutex);
- set_kernel_text_rw();
- set_all_modules_text_rw();
- return 0;
-@@ -44,6 +46,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 2469d54b3e43..6b6fa18f0a02 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>
-
-@@ -2615,12 +2614,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.
-@@ -2632,9 +2629,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,
-@@ -5788,7 +5782,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;
-@@ -5850,7 +5843,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
-
mm-vmscan.c-prevent-useless-kswapd-loops.patch
btrfs-ensure-replaced-device-doesn-t-have-pending-chunk-allocation.patch
tty-rocket-fix-incorrect-forward-declaration-of-rp_i.patch
-ftrace-x86-remove-possible-deadlock-between-register.patch
s390-mm-fix-pxd_bad-with-folded-page-tables.patch