aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-12 20:22:01 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-12 20:22:01 -0400
commit3a75ad1457d9cd84bc17d5b9cffb4d73b52be20b (patch)
tree8ca06468b1f9feffeefe04f700264ed7345d7803
parent235b84fc862ae2637dc0dabada18d97f1bfc18e1 (diff)
parent96b5b19459b3c2aed2872bac42cbe19edfae710f (diff)
Merge tag 'modules-for-v4.13' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux
Pull modules updates from Jessica Yu: "Summary of modules changes for the 4.13 merge window: - Minor code cleanups - Avoid accessing mod struct prior to checking module struct version, from Kees - Fix racy atomic inc/dec logic of kmod_concurrent_max in kmod, from Luis" * tag 'modules-for-v4.13' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux: module: make the modinfo name const kmod: reduce atomic operations on kmod_concurrent and simplify module: use list_for_each_entry_rcu() on find_module_all() kernel/module.c: suppress warning about unused nowarn variable module: Add module name to modinfo module: Pass struct load_info into symbol checks
-rw-r--r--kernel/kmod.c40
-rw-r--r--kernel/module.c85
-rw-r--r--scripts/mod/modpost.c1
3 files changed, 73 insertions, 53 deletions
diff --git a/kernel/kmod.c b/kernel/kmod.c
index 563f97e2be36..ff68198fe83b 100644
--- a/kernel/kmod.c
+++ b/kernel/kmod.c
@@ -45,8 +45,6 @@
45 45
46#include <trace/events/module.h> 46#include <trace/events/module.h>
47 47
48extern int max_threads;
49
50#define CAP_BSET (void *)1 48#define CAP_BSET (void *)1
51#define CAP_PI (void *)2 49#define CAP_PI (void *)2
52 50
@@ -56,6 +54,20 @@ static DEFINE_SPINLOCK(umh_sysctl_lock);
56static DECLARE_RWSEM(umhelper_sem); 54static DECLARE_RWSEM(umhelper_sem);
57 55
58#ifdef CONFIG_MODULES 56#ifdef CONFIG_MODULES
57/*
58 * Assuming:
59 *
60 * threads = div64_u64((u64) totalram_pages * (u64) PAGE_SIZE,
61 * (u64) THREAD_SIZE * 8UL);
62 *
63 * If you need less than 50 threads would mean we're dealing with systems
64 * smaller than 3200 pages. This assuems you are capable of having ~13M memory,
65 * and this would only be an be an upper limit, after which the OOM killer
66 * would take effect. Systems like these are very unlikely if modules are
67 * enabled.
68 */
69#define MAX_KMOD_CONCURRENT 50
70static atomic_t kmod_concurrent_max = ATOMIC_INIT(MAX_KMOD_CONCURRENT);
59 71
60/* 72/*
61 modprobe_path is set via /proc/sys. 73 modprobe_path is set via /proc/sys.
@@ -127,10 +139,7 @@ int __request_module(bool wait, const char *fmt, ...)
127{ 139{
128 va_list args; 140 va_list args;
129 char module_name[MODULE_NAME_LEN]; 141 char module_name[MODULE_NAME_LEN];
130 unsigned int max_modprobes;
131 int ret; 142 int ret;
132 static atomic_t kmod_concurrent = ATOMIC_INIT(0);
133#define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */
134 static int kmod_loop_msg; 143 static int kmod_loop_msg;
135 144
136 /* 145 /*
@@ -154,21 +163,7 @@ int __request_module(bool wait, const char *fmt, ...)
154 if (ret) 163 if (ret)
155 return ret; 164 return ret;
156 165
157 /* If modprobe needs a service that is in a module, we get a recursive 166 if (atomic_dec_if_positive(&kmod_concurrent_max) < 0) {
158 * loop. Limit the number of running kmod threads to max_threads/2 or
159 * MAX_KMOD_CONCURRENT, whichever is the smaller. A cleaner method
160 * would be to run the parents of this process, counting how many times
161 * kmod was invoked. That would mean accessing the internals of the
162 * process tables to get the command line, proc_pid_cmdline is static
163 * and it is not worth changing the proc code just to handle this case.
164 * KAO.
165 *
166 * "trace the ppid" is simple, but will fail if someone's
167 * parent exits. I think this is as good as it gets. --RR
168 */
169 max_modprobes = min(max_threads/2, MAX_KMOD_CONCURRENT);
170 atomic_inc(&kmod_concurrent);
171 if (atomic_read(&kmod_concurrent) > max_modprobes) {
172 /* We may be blaming an innocent here, but unlikely */ 167 /* We may be blaming an innocent here, but unlikely */
173 if (kmod_loop_msg < 5) { 168 if (kmod_loop_msg < 5) {
174 printk(KERN_ERR 169 printk(KERN_ERR
@@ -176,7 +171,6 @@ int __request_module(bool wait, const char *fmt, ...)
176 module_name); 171 module_name);
177 kmod_loop_msg++; 172 kmod_loop_msg++;
178 } 173 }
179 atomic_dec(&kmod_concurrent);
180 return -ENOMEM; 174 return -ENOMEM;
181 } 175 }
182 176
@@ -184,10 +178,12 @@ int __request_module(bool wait, const char *fmt, ...)
184 178
185 ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC); 179 ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC);
186 180
187 atomic_dec(&kmod_concurrent); 181 atomic_inc(&kmod_concurrent_max);
182
188 return ret; 183 return ret;
189} 184}
190EXPORT_SYMBOL(__request_module); 185EXPORT_SYMBOL(__request_module);
186
191#endif /* CONFIG_MODULES */ 187#endif /* CONFIG_MODULES */
192 188
193static void call_usermodehelper_freeinfo(struct subprocess_info *info) 189static void call_usermodehelper_freeinfo(struct subprocess_info *info)
diff --git a/kernel/module.c b/kernel/module.c
index b0f92a365140..40f983cbea81 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -300,6 +300,7 @@ int unregister_module_notifier(struct notifier_block *nb)
300EXPORT_SYMBOL(unregister_module_notifier); 300EXPORT_SYMBOL(unregister_module_notifier);
301 301
302struct load_info { 302struct load_info {
303 const char *name;
303 Elf_Ehdr *hdr; 304 Elf_Ehdr *hdr;
304 unsigned long len; 305 unsigned long len;
305 Elf_Shdr *sechdrs; 306 Elf_Shdr *sechdrs;
@@ -600,7 +601,7 @@ static struct module *find_module_all(const char *name, size_t len,
600 601
601 module_assert_mutex_or_preempt(); 602 module_assert_mutex_or_preempt();
602 603
603 list_for_each_entry(mod, &modules, list) { 604 list_for_each_entry_rcu(mod, &modules, list) {
604 if (!even_unformed && mod->state == MODULE_STATE_UNFORMED) 605 if (!even_unformed && mod->state == MODULE_STATE_UNFORMED)
605 continue; 606 continue;
606 if (strlen(mod->name) == len && !memcmp(mod->name, name, len)) 607 if (strlen(mod->name) == len && !memcmp(mod->name, name, len))
@@ -1273,12 +1274,13 @@ static u32 resolve_rel_crc(const s32 *crc)
1273 return *(u32 *)((void *)crc + *crc); 1274 return *(u32 *)((void *)crc + *crc);
1274} 1275}
1275 1276
1276static int check_version(Elf_Shdr *sechdrs, 1277static int check_version(const struct load_info *info,
1277 unsigned int versindex,
1278 const char *symname, 1278 const char *symname,
1279 struct module *mod, 1279 struct module *mod,
1280 const s32 *crc) 1280 const s32 *crc)
1281{ 1281{
1282 Elf_Shdr *sechdrs = info->sechdrs;
1283 unsigned int versindex = info->index.vers;
1282 unsigned int i, num_versions; 1284 unsigned int i, num_versions;
1283 struct modversion_info *versions; 1285 struct modversion_info *versions;
1284 1286
@@ -1312,17 +1314,16 @@ static int check_version(Elf_Shdr *sechdrs,
1312 } 1314 }
1313 1315
1314 /* Broken toolchain. Warn once, then let it go.. */ 1316 /* Broken toolchain. Warn once, then let it go.. */
1315 pr_warn_once("%s: no symbol version for %s\n", mod->name, symname); 1317 pr_warn_once("%s: no symbol version for %s\n", info->name, symname);
1316 return 1; 1318 return 1;
1317 1319
1318bad_version: 1320bad_version:
1319 pr_warn("%s: disagrees about version of symbol %s\n", 1321 pr_warn("%s: disagrees about version of symbol %s\n",
1320 mod->name, symname); 1322 info->name, symname);
1321 return 0; 1323 return 0;
1322} 1324}
1323 1325
1324static inline int check_modstruct_version(Elf_Shdr *sechdrs, 1326static inline int check_modstruct_version(const struct load_info *info,
1325 unsigned int versindex,
1326 struct module *mod) 1327 struct module *mod)
1327{ 1328{
1328 const s32 *crc; 1329 const s32 *crc;
@@ -1338,8 +1339,8 @@ static inline int check_modstruct_version(Elf_Shdr *sechdrs,
1338 BUG(); 1339 BUG();
1339 } 1340 }
1340 preempt_enable(); 1341 preempt_enable();
1341 return check_version(sechdrs, versindex, 1342 return check_version(info, VMLINUX_SYMBOL_STR(module_layout),
1342 VMLINUX_SYMBOL_STR(module_layout), mod, crc); 1343 mod, crc);
1343} 1344}
1344 1345
1345/* First part is kernel version, which we ignore if module has crcs. */ 1346/* First part is kernel version, which we ignore if module has crcs. */
@@ -1353,8 +1354,7 @@ static inline int same_magic(const char *amagic, const char *bmagic,
1353 return strcmp(amagic, bmagic) == 0; 1354 return strcmp(amagic, bmagic) == 0;
1354} 1355}
1355#else 1356#else
1356static inline int check_version(Elf_Shdr *sechdrs, 1357static inline int check_version(const struct load_info *info,
1357 unsigned int versindex,
1358 const char *symname, 1358 const char *symname,
1359 struct module *mod, 1359 struct module *mod,
1360 const s32 *crc) 1360 const s32 *crc)
@@ -1362,8 +1362,7 @@ static inline int check_version(Elf_Shdr *sechdrs,
1362 return 1; 1362 return 1;
1363} 1363}
1364 1364
1365static inline int check_modstruct_version(Elf_Shdr *sechdrs, 1365static inline int check_modstruct_version(const struct load_info *info,
1366 unsigned int versindex,
1367 struct module *mod) 1366 struct module *mod)
1368{ 1367{
1369 return 1; 1368 return 1;
@@ -1399,7 +1398,7 @@ static const struct kernel_symbol *resolve_symbol(struct module *mod,
1399 if (!sym) 1398 if (!sym)
1400 goto unlock; 1399 goto unlock;
1401 1400
1402 if (!check_version(info->sechdrs, info->index.vers, name, mod, crc)) { 1401 if (!check_version(info, name, mod, crc)) {
1403 sym = ERR_PTR(-EINVAL); 1402 sym = ERR_PTR(-EINVAL);
1404 goto getname; 1403 goto getname;
1405 } 1404 }
@@ -1662,31 +1661,36 @@ static inline void remove_notes_attrs(struct module *mod)
1662} 1661}
1663#endif /* CONFIG_KALLSYMS */ 1662#endif /* CONFIG_KALLSYMS */
1664 1663
1665static void add_usage_links(struct module *mod) 1664static void del_usage_links(struct module *mod)
1666{ 1665{
1667#ifdef CONFIG_MODULE_UNLOAD 1666#ifdef CONFIG_MODULE_UNLOAD
1668 struct module_use *use; 1667 struct module_use *use;
1669 int nowarn;
1670 1668
1671 mutex_lock(&module_mutex); 1669 mutex_lock(&module_mutex);
1672 list_for_each_entry(use, &mod->target_list, target_list) { 1670 list_for_each_entry(use, &mod->target_list, target_list)
1673 nowarn = sysfs_create_link(use->target->holders_dir, 1671 sysfs_remove_link(use->target->holders_dir, mod->name);
1674 &mod->mkobj.kobj, mod->name);
1675 }
1676 mutex_unlock(&module_mutex); 1672 mutex_unlock(&module_mutex);
1677#endif 1673#endif
1678} 1674}
1679 1675
1680static void del_usage_links(struct module *mod) 1676static int add_usage_links(struct module *mod)
1681{ 1677{
1678 int ret = 0;
1682#ifdef CONFIG_MODULE_UNLOAD 1679#ifdef CONFIG_MODULE_UNLOAD
1683 struct module_use *use; 1680 struct module_use *use;
1684 1681
1685 mutex_lock(&module_mutex); 1682 mutex_lock(&module_mutex);
1686 list_for_each_entry(use, &mod->target_list, target_list) 1683 list_for_each_entry(use, &mod->target_list, target_list) {
1687 sysfs_remove_link(use->target->holders_dir, mod->name); 1684 ret = sysfs_create_link(use->target->holders_dir,
1685 &mod->mkobj.kobj, mod->name);
1686 if (ret)
1687 break;
1688 }
1688 mutex_unlock(&module_mutex); 1689 mutex_unlock(&module_mutex);
1690 if (ret)
1691 del_usage_links(mod);
1689#endif 1692#endif
1693 return ret;
1690} 1694}
1691 1695
1692static int module_add_modinfo_attrs(struct module *mod) 1696static int module_add_modinfo_attrs(struct module *mod)
@@ -1797,13 +1801,18 @@ static int mod_sysfs_setup(struct module *mod,
1797 if (err) 1801 if (err)
1798 goto out_unreg_param; 1802 goto out_unreg_param;
1799 1803
1800 add_usage_links(mod); 1804 err = add_usage_links(mod);
1805 if (err)
1806 goto out_unreg_modinfo_attrs;
1807
1801 add_sect_attrs(mod, info); 1808 add_sect_attrs(mod, info);
1802 add_notes_attrs(mod, info); 1809 add_notes_attrs(mod, info);
1803 1810
1804 kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); 1811 kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
1805 return 0; 1812 return 0;
1806 1813
1814out_unreg_modinfo_attrs:
1815 module_remove_modinfo_attrs(mod);
1807out_unreg_param: 1816out_unreg_param:
1808 module_param_sysfs_remove(mod); 1817 module_param_sysfs_remove(mod);
1809out_unreg_holders: 1818out_unreg_holders:
@@ -2910,9 +2919,15 @@ static int rewrite_section_headers(struct load_info *info, int flags)
2910 info->index.vers = 0; /* Pretend no __versions section! */ 2919 info->index.vers = 0; /* Pretend no __versions section! */
2911 else 2920 else
2912 info->index.vers = find_sec(info, "__versions"); 2921 info->index.vers = find_sec(info, "__versions");
2922 info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC;
2923
2913 info->index.info = find_sec(info, ".modinfo"); 2924 info->index.info = find_sec(info, ".modinfo");
2925 if (!info->index.info)
2926 info->name = "(missing .modinfo section)";
2927 else
2928 info->name = get_modinfo(info, "name");
2914 info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC; 2929 info->sechdrs[info->index.info].sh_flags &= ~(unsigned long)SHF_ALLOC;
2915 info->sechdrs[info->index.vers].sh_flags &= ~(unsigned long)SHF_ALLOC; 2930
2916 return 0; 2931 return 0;
2917} 2932}
2918 2933
@@ -2952,21 +2967,29 @@ static struct module *setup_load_info(struct load_info *info, int flags)
2952 2967
2953 info->index.mod = find_sec(info, ".gnu.linkonce.this_module"); 2968 info->index.mod = find_sec(info, ".gnu.linkonce.this_module");
2954 if (!info->index.mod) { 2969 if (!info->index.mod) {
2955 pr_warn("No module found in object\n"); 2970 pr_warn("%s: No module found in object\n",
2971 info->name ?: "(missing .modinfo name field)");
2956 return ERR_PTR(-ENOEXEC); 2972 return ERR_PTR(-ENOEXEC);
2957 } 2973 }
2958 /* This is temporary: point mod into copy of data. */ 2974 /* This is temporary: point mod into copy of data. */
2959 mod = (void *)info->sechdrs[info->index.mod].sh_addr; 2975 mod = (void *)info->sechdrs[info->index.mod].sh_addr;
2960 2976
2977 /*
2978 * If we didn't load the .modinfo 'name' field, fall back to
2979 * on-disk struct mod 'name' field.
2980 */
2981 if (!info->name)
2982 info->name = mod->name;
2983
2961 if (info->index.sym == 0) { 2984 if (info->index.sym == 0) {
2962 pr_warn("%s: module has no symbols (stripped?)\n", mod->name); 2985 pr_warn("%s: module has no symbols (stripped?)\n", info->name);
2963 return ERR_PTR(-ENOEXEC); 2986 return ERR_PTR(-ENOEXEC);
2964 } 2987 }
2965 2988
2966 info->index.pcpu = find_pcpusec(info); 2989 info->index.pcpu = find_pcpusec(info);
2967 2990
2968 /* Check module struct version now, before we try to use module. */ 2991 /* Check module struct version now, before we try to use module. */
2969 if (!check_modstruct_version(info->sechdrs, info->index.vers, mod)) 2992 if (!check_modstruct_version(info, mod))
2970 return ERR_PTR(-ENOEXEC); 2993 return ERR_PTR(-ENOEXEC);
2971 2994
2972 return mod; 2995 return mod;
@@ -2987,7 +3010,7 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
2987 return err; 3010 return err;
2988 } else if (!same_magic(modmagic, vermagic, info->index.vers)) { 3011 } else if (!same_magic(modmagic, vermagic, info->index.vers)) {
2989 pr_err("%s: version magic '%s' should be '%s'\n", 3012 pr_err("%s: version magic '%s' should be '%s'\n",
2990 mod->name, modmagic, vermagic); 3013 info->name, modmagic, vermagic);
2991 return -ENOEXEC; 3014 return -ENOEXEC;
2992 } 3015 }
2993 3016
@@ -3237,7 +3260,7 @@ int __weak module_frob_arch_sections(Elf_Ehdr *hdr,
3237 3260
3238/* module_blacklist is a comma-separated list of module names */ 3261/* module_blacklist is a comma-separated list of module names */
3239static char *module_blacklist; 3262static char *module_blacklist;
3240static bool blacklisted(char *module_name) 3263static bool blacklisted(const char *module_name)
3241{ 3264{
3242 const char *p; 3265 const char *p;
3243 size_t len; 3266 size_t len;
@@ -3267,7 +3290,7 @@ static struct module *layout_and_allocate(struct load_info *info, int flags)
3267 if (IS_ERR(mod)) 3290 if (IS_ERR(mod))
3268 return mod; 3291 return mod;
3269 3292
3270 if (blacklisted(mod->name)) 3293 if (blacklisted(info->name))
3271 return ERR_PTR(-EPERM); 3294 return ERR_PTR(-EPERM);
3272 3295
3273 err = check_modinfo(mod, info, flags); 3296 err = check_modinfo(mod, info, flags);
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 30d752a4a6a6..48397feb08fb 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -2126,6 +2126,7 @@ static void add_header(struct buffer *b, struct module *mod)
2126 buf_printf(b, "#include <linux/compiler.h>\n"); 2126 buf_printf(b, "#include <linux/compiler.h>\n");
2127 buf_printf(b, "\n"); 2127 buf_printf(b, "\n");
2128 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); 2128 buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n");
2129 buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n");
2129 buf_printf(b, "\n"); 2130 buf_printf(b, "\n");
2130 buf_printf(b, "__visible struct module __this_module\n"); 2131 buf_printf(b, "__visible struct module __this_module\n");
2131 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n"); 2132 buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");