summaryrefslogtreecommitdiffstats
path: root/include/linux/jump_label.h
diff options
context:
space:
mode:
authorJason Baron <jbaron@redhat.com>2010-10-01 17:23:48 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-10-28 09:17:40 -0400
commit91bad2f8d3057482b9afb599f14421b007136960 (patch)
treeea5e09e74107593dcfc192c65c1395ed22674df4 /include/linux/jump_label.h
parentb842f8faf6c7dc2005c6a70631c1a91bac02f180 (diff)
downloadlinux-91bad2f8d3057482b9afb599f14421b007136960.tar.gz
linux-91bad2f8d3057482b9afb599f14421b007136960.tar.bz2
linux-91bad2f8d3057482b9afb599f14421b007136960.zip
jump label: Fix deadlock b/w jump_label_mutex vs. text_mutex
register_kprobe() downs the 'text_mutex' and then calls jump_label_text_reserved(), which downs the 'jump_label_mutex'. However, the jump label code takes those mutexes in the reverse order. Fix by requiring the caller of jump_label_text_reserved() to do the jump label locking via the newly added: jump_label_lock(), jump_label_unlock(). Currently, kprobes is the only user of jump_label_text_reserved(). Reported-by: Ingo Molnar <mingo@elte.hu> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Jason Baron <jbaron@redhat.com> LKML-Reference: <759032c48d5e30c27f0bba003d09bffa8e9f28bb.1285965957.git.jbaron@redhat.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'include/linux/jump_label.h')
-rw-r--r--include/linux/jump_label.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index b67cb180e6e9..1947a1212678 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -18,6 +18,8 @@ struct module;
extern struct jump_entry __start___jump_table[];
extern struct jump_entry __stop___jump_table[];
+extern void jump_label_lock(void);
+extern void jump_label_unlock(void);
extern void arch_jump_label_transform(struct jump_entry *entry,
enum jump_label_type type);
extern void arch_jump_label_text_poke_early(jump_label_t addr);
@@ -59,6 +61,9 @@ static inline int jump_label_text_reserved(void *start, void *end)
return 0;
}
+static inline void jump_label_lock(void) {}
+static inline void jump_label_unlock(void) {}
+
#endif
#define COND_STMT(key, stmt) \