FAILED: patch "[PATCH] kprobes: fix kill kprobe which has been marked as gone" failed to apply to 4.14-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.14-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.
Fixes e8386a0cb22f ("kprobes: support probing module __exit function")
Co-developed-by Chengming Zhou <[email protected]>
Signed-off-by Muchun Song <[email protected]>
Signed-off-by Chengming Zhou <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
Acked-by Masami Hiramatsu <[email protected]>
Cc "Naveen N . Rao" <[email protected]>
Cc Anil S Keshavamurthy <[email protected]>
Cc David S. Miller <[email protected]>
Cc Song Liu <[email protected]>
Cc Steven Rostedt <[email protected]>
Cc <[email protected]>
Signed-off-by Linus Torvalds <[email protected]>
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);