FAILED: patch "[PATCH] kprobes: fix kill kprobe which has been marked as gone" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From b0399092ccebd9feef68d4ceb8d6219a8c0caa05 Mon Sep 17 00:00:00 2001
From: Muchun Song <[email protected]>
Date: Fri, 18 Sep 2020 21:20:21 -0700
Subject: [PATCH] kprobes: fix kill kprobe which has been marked as gone
If a kprobe is marked as gone, we should not kill it again. Otherwise, we can disarm the kprobe more than once. In that case, the statistics of kprobe_ftrace_enabled can unbalance which can lead to that kprobe do not work.
kernel/kprobes.c +8 -1
@@ -2140,6 +2140,9 @@ static void kill_kprobe(struct kprobe *p)lockdep_assert_held (&kprobe_mutex); +if (WARN_ON_ONCE (kprobe_gone (p))) +return ; + p->flags |=KPROBE_FLAG_GONE ;if (kprobe_aggrprobe (p)) {/*
@@ -2419,7 +2422,10 @@ static int kprobes_module_callback(struct notifier_block *nb,mutex_lock (&kprobe_mutex);for (i =0 ; i <KPROBE_TABLE_SIZE ; i++) { head = &kprobe_table[i]; -hlist_for_each_entry (p, head, hlist) +hlist_for_each_entry (p, head, hlist) { +if (kprobe_gone (p)) +continue ; +if (within_module_init ((unsigned long )p->addr, mod) || (checkcore &&within_module_core ((unsigned long )p->addr, mod))) {
@@ -2436,6 +2442,7 @@ static int kprobes_module_callback(struct notifier_block *nb,*/ kill_kprobe (p); } + } }if (val ==MODULE_STATE_GOING )remove_module_kprobe_blacklist (mod);
Steven Rostedt
Acked-by Masami HiramatsuQuoted 9 lines · On Mon, 21 Sep 2020 14:25:19 +0200 <[email protected]> wrote:
The patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
The below should apply and work for 5.4 - 4.4.
Masami, can you verify that I did this correctly. It appears to pass all the ftrace tests, at least all the ones that pass without the patch ;-)
-- Steve
From b0399092ccebd9feef68d4ceb8d6219a8c0caa05 Mon Sep 17 00:00:00 2001
From: Muchun Song <[email protected]>
Date: Fri, 18 Sep 2020 21:20:21 -0700
Subject: [PATCH] kprobes: fix kill kprobe which has been marked as gone
If a kprobe is marked as gone, we should not kill it again. Otherwise, we can disarm the kprobe more than once. In that case, the statistics of kprobe_ftrace_enabled can unbalance which can lead to that kprobe do not work.
kernel/kprobes.c +8 -1
@@ -2088,6 +2088,9 @@ static void kill_kprobe(struct kprobe *p {struct kprobe *kp; +if (WARN_ON_ONCE (kprobe_gone (p))) +return ; + p->flags |=KPROBE_FLAG_GONE ;if (kprobe_aggrprobe (p)) {/*
@@ -2270,7 +2273,10 @@ static int kprobes_module_callback(strucmutex_lock (&kprobe_mutex);for (i =0 ; i <KPROBE_TABLE_SIZE ; i++) { head = &kprobe_table[i]; -hlist_for_each_entry_rcu (p, head, hlist) +hlist_for_each_entry (p, head, hlist) { +if (kprobe_gone (p)) +continue ; +if (within_module_init ((unsigned long )p->addr, mod) || (checkcore &&within_module_core ((unsigned long )p->addr, mod))) {
@@ -2287,6 +2293,7 @@ static int kprobes_module_callback(struc*/ kill_kprobe (p); } + } }mutex_unlock (&kprobe_mutex);return NOTIFY_DONE ;
Quoted 10 lines · On Thu, 24 Sep 2020 18:06:06 -0400 Steven Rostedt <[email protected]> wrote:
Quoted 7 lines · On Mon, 21 Sep 2020 14:25:19 +0200 <[email protected]> wrote:
The patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
Quoted 8 lines
Quoted 2 lines
greg k-h
The below should apply and work for 5.4 - 4.4.
Masami, can you verify that I did this correctly. It appears to pass all the ftrace tests, at least all the ones that pass without the patch ;-)
Thanks Steve! I think we should keep using hlist_for_each_entry_rcu() unless backporting commit 7e6a71d8e601 ("kprobes: Use non RCU traversal APIs on
kprobe_tables if possible") (and this commit involves another improvement.)
From b2dafed7da5e4ee5e82fdfe309d69ca6e189ef0d Mon Sep 17 00:00:00 2001
From: Muchun Song <[email protected]>
Date: Fri, 18 Sep 2020 21:20:21 -0700
Subject: [PATCH] kprobes: fix kill kprobe which has been marked as gone
If a kprobe is marked as gone, we should not kill it again. Otherwise, we can disarm the kprobe more than once. In that case, the statistics of kprobe_ftrace_enabled can unbalance which can lead to that kprobe do not work.
--- kernel/kprobes.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
kernel/kprobes.c +8 -1
@@ -2088,6 +2088,9 @@ static void kill_kprobe(struct kprobe *p) {struct kprobe *kp; +if (WARN_ON_ONCE (kprobe_gone (p))) +return ; + p->flags |=KPROBE_FLAG_GONE ;if (kprobe_aggrprobe (p)) {/*
@@ -2270,7 +2273,10 @@ static int kprobes_module_callback(struct notifier_block *nb,mutex_lock (&kprobe_mutex);for (i =0 ; i <KPROBE_TABLE_SIZE ; i++) { head = &kprobe_table[i]; -hlist_for_each_entry_rcu (p, head, hlist) +hlist_for_each_entry_rcu (p, head, hlist) { +if (kprobe_gone (p)) +continue ; +if (within_module_init ((unsigned long )p->addr, mod) || (checkcore &&within_module_core ((unsigned long )p->addr, mod))) {
@@ -2287,6 +2293,7 @@ static int kprobes_module_callback(struct notifier_block *nb,*/ kill_kprobe (p); } + } }mutex_unlock (&kprobe_mutex);return NOTIFY_DONE ;
Signature · 3 lines
2.25.1 -- Masami Hiramatsu <[email protected]>