]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - kernel/module.c
drm/amd/display: turn off cursor when disconnect plane
[linux.git] / kernel / module.c
index dea01ac9cb74c4ef619c51b5eba4e869d9e4fdc8..ad2d420024f6d01086f07b47e60fd1fbde0ff1dc 100644 (file)
@@ -2863,6 +2863,15 @@ static int check_modinfo_livepatch(struct module *mod, struct load_info *info)
 }
 #endif /* CONFIG_LIVEPATCH */
 
+static void check_modinfo_retpoline(struct module *mod, struct load_info *info)
+{
+       if (retpoline_module_ok(get_modinfo(info, "retpoline")))
+               return;
+
+       pr_warn("%s: loading module not compiled with retpoline compiler.\n",
+               mod->name);
+}
+
 /* Sets info->hdr and info->len. */
 static int copy_module_from_user(const void __user *umod, unsigned long len,
                                  struct load_info *info)
@@ -3029,6 +3038,8 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
                add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
        }
 
+       check_modinfo_retpoline(mod, info);
+
        if (get_modinfo(info, "staging")) {
                add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
                pr_warn("%s: module is from the staging directory, the quality "
@@ -3118,7 +3129,11 @@ static int find_module_sections(struct module *mod, struct load_info *info)
                                             sizeof(*mod->ftrace_callsites),
                                             &mod->num_ftrace_callsites);
 #endif
-
+#ifdef CONFIG_FUNCTION_ERROR_INJECTION
+       mod->ei_funcs = section_objs(info, "_error_injection_whitelist",
+                                           sizeof(*mod->ei_funcs),
+                                           &mod->num_ei_funcs);
+#endif
        mod->extable = section_objs(info, "__ex_table",
                                    sizeof(*mod->extable), &mod->num_exentries);
 
@@ -3789,6 +3804,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
        module_disable_nx(mod);
 
  ddebug_cleanup:
+       ftrace_release_mod(mod);
        dynamic_debug_remove(mod, info->debug);
        synchronize_sched();
        kfree(mod->args);
@@ -3808,12 +3824,6 @@ static int load_module(struct load_info *info, const char __user *uargs,
        synchronize_sched();
        mutex_unlock(&module_mutex);
  free_module:
-       /*
-        * Ftrace needs to clean up what it initialized.
-        * This does nothing if ftrace_module_init() wasn't called,
-        * but it must be called outside of module_mutex.
-        */
-       ftrace_release_mod(mod);
        /* Free lock-classes; relies on the preceding sync_rcu() */
        lockdep_free_key_range(mod->core_layout.base, mod->core_layout.size);
 
@@ -3938,6 +3948,12 @@ static const char *get_ksymbol(struct module *mod,
        return symname(kallsyms, best);
 }
 
+void * __weak dereference_module_function_descriptor(struct module *mod,
+                                                    void *ptr)
+{
+       return ptr;
+}
+
 /* For kallsyms to ask for address resolution.  NULL means not found.  Careful
  * not to lock to avoid deadlock on oopses, simply disable preemption. */
 const char *module_address_lookup(unsigned long addr,