hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/kernel/module.c
....@@ -2285,19 +2285,30 @@
22852285 void *__symbol_get(const char *symbol)
22862286 {
22872287 struct module *owner;
2288
+ enum mod_license license;
22882289 const struct kernel_symbol *sym;
22892290
22902291 preempt_disable();
2291
- sym = find_symbol(symbol, &owner, NULL, NULL, true, true);
2292
- if (sym && strong_try_module_get(owner))
2292
+ sym = find_symbol(symbol, &owner, NULL, &license, true, true);
2293
+ if (!sym)
2294
+ goto fail;
2295
+ if (license != GPL_ONLY) {
2296
+ pr_warn("failing symbol_get of non-GPLONLY symbol %s.\n",
2297
+ symbol);
2298
+ goto fail;
2299
+ }
2300
+ if (strong_try_module_get(owner))
22932301 sym = NULL;
22942302 preempt_enable();
22952303
22962304 return sym ? (void *)kernel_symbol_value(sym) : NULL;
2305
+fail:
2306
+ preempt_enable();
2307
+ return NULL;
22972308 }
22982309 EXPORT_SYMBOL_GPL(__symbol_get);
22992310
2300
-static bool module_init_layout_section(const char *sname)
2311
+bool module_init_layout_section(const char *sname)
23012312 {
23022313 #ifndef CONFIG_MODULE_UNLOAD
23032314 if (module_exit_section(sname))
....@@ -3686,7 +3697,8 @@
36863697 sched_annotate_sleep();
36873698 mutex_lock(&module_mutex);
36883699 mod = find_module_all(name, strlen(name), true);
3689
- ret = !mod || mod->state == MODULE_STATE_LIVE;
3700
+ ret = !mod || mod->state == MODULE_STATE_LIVE
3701
+ || mod->state == MODULE_STATE_GOING;
36903702 mutex_unlock(&module_mutex);
36913703
36923704 return ret;
....@@ -3857,20 +3869,35 @@
38573869
38583870 mod->state = MODULE_STATE_UNFORMED;
38593871
3860
-again:
38613872 mutex_lock(&module_mutex);
38623873 old = find_module_all(mod->name, strlen(mod->name), true);
38633874 if (old != NULL) {
3864
- if (old->state != MODULE_STATE_LIVE) {
3875
+ if (old->state == MODULE_STATE_COMING
3876
+ || old->state == MODULE_STATE_UNFORMED) {
38653877 /* Wait in case it fails to load. */
38663878 mutex_unlock(&module_mutex);
38673879 err = wait_event_interruptible(module_wq,
38683880 finished_loading(mod->name));
38693881 if (err)
38703882 goto out_unlocked;
3871
- goto again;
3883
+
3884
+ /* The module might have gone in the meantime. */
3885
+ mutex_lock(&module_mutex);
3886
+ old = find_module_all(mod->name, strlen(mod->name),
3887
+ true);
38723888 }
3873
- err = -EEXIST;
3889
+
3890
+ /*
3891
+ * We are here only when the same module was being loaded. Do
3892
+ * not try to load it again right now. It prevents long delays
3893
+ * caused by serialized module load failures. It might happen
3894
+ * when more devices of the same type trigger load of
3895
+ * a particular module.
3896
+ */
3897
+ if (old && old->state == MODULE_STATE_LIVE)
3898
+ err = -EEXIST;
3899
+ else
3900
+ err = -EBUSY;
38743901 goto out;
38753902 }
38763903 mod_update_bounds(mod);