kprobes: remove dependency on CONFIG_MODULES
[linux-2.6-block.git] / kernel / kprobes.c
index ddd7cdc16edfc4baaa8d6c2ca627654fd6c6a074..ca2c6cbd42d219dd2d2b7d5e40b7bed12c32707c 100644 (file)
@@ -1588,7 +1588,7 @@ static int check_kprobe_address_safe(struct kprobe *p,
        }
 
        /* Get module refcount and reject __init functions for loaded modules. */
-       if (*probed_mod) {
+       if (IS_ENABLED(CONFIG_MODULES) && *probed_mod) {
                /*
                 * We must hold a refcount of the probed module while updating
                 * its code to prohibit unexpected unloading.
@@ -1603,12 +1603,13 @@ static int check_kprobe_address_safe(struct kprobe *p,
                 * kprobes in there.
                 */
                if (within_module_init((unsigned long)p->addr, *probed_mod) &&
-                   (*probed_mod)->state != MODULE_STATE_COMING) {
+                   !module_is_coming(*probed_mod)) {
                        module_put(*probed_mod);
                        *probed_mod = NULL;
                        ret = -ENOENT;
                }
        }
+
 out:
        preempt_enable();
        jump_label_unlock();
@@ -2488,24 +2489,6 @@ int kprobe_add_area_blacklist(unsigned long start, unsigned long end)
        return 0;
 }
 
-/* Remove all symbols in given area from kprobe blacklist */
-static void kprobe_remove_area_blacklist(unsigned long start, unsigned long end)
-{
-       struct kprobe_blacklist_entry *ent, *n;
-
-       list_for_each_entry_safe(ent, n, &kprobe_blacklist, list) {
-               if (ent->start_addr < start || ent->start_addr >= end)
-                       continue;
-               list_del(&ent->list);
-               kfree(ent);
-       }
-}
-
-static void kprobe_remove_ksym_blacklist(unsigned long entry)
-{
-       kprobe_remove_area_blacklist(entry, entry + 1);
-}
-
 int __weak arch_kprobe_get_kallsym(unsigned int *symnum, unsigned long *value,
                                   char *type, char *sym)
 {
@@ -2570,6 +2553,25 @@ static int __init populate_kprobe_blacklist(unsigned long *start,
        return ret ? : arch_populate_kprobe_blacklist();
 }
 
+#ifdef CONFIG_MODULES
+/* Remove all symbols in given area from kprobe blacklist */
+static void kprobe_remove_area_blacklist(unsigned long start, unsigned long end)
+{
+       struct kprobe_blacklist_entry *ent, *n;
+
+       list_for_each_entry_safe(ent, n, &kprobe_blacklist, list) {
+               if (ent->start_addr < start || ent->start_addr >= end)
+                       continue;
+               list_del(&ent->list);
+               kfree(ent);
+       }
+}
+
+static void kprobe_remove_ksym_blacklist(unsigned long entry)
+{
+       kprobe_remove_area_blacklist(entry, entry + 1);
+}
+
 static void add_module_kprobe_blacklist(struct module *mod)
 {
        unsigned long start, end;
@@ -2672,6 +2674,17 @@ static struct notifier_block kprobe_module_nb = {
        .priority = 0
 };
 
+static int kprobe_register_module_notifier(void)
+{
+       return register_module_notifier(&kprobe_module_nb);
+}
+#else
+static int kprobe_register_module_notifier(void)
+{
+       return 0;
+}
+#endif /* CONFIG_MODULES */
+
 void kprobe_free_init_mem(void)
 {
        void *start = (void *)(&__init_begin);
@@ -2731,7 +2744,7 @@ static int __init init_kprobes(void)
        if (!err)
                err = register_die_notifier(&kprobe_exceptions_nb);
        if (!err)
-               err = register_module_notifier(&kprobe_module_nb);
+               err = kprobe_register_module_notifier();
 
        kprobes_initialized = (err == 0);
        kprobe_sysctls_init();