Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

modpost: Add modname to mod_device_table alias

At this point, if a symbol is compiled as part of the kernel,
information about which module the symbol belongs to is lost.

To save this it is possible to add the module name to the alias name.
It's not very pretty, but it's possible for now.

Cc: Miguel Ojeda <ojeda@kernel.org>
Cc: Andreas Hindborg <a.hindborg@kernel.org>
Cc: Danilo Krummrich <dakr@kernel.org>
Cc: Alex Gaynor <alex.gaynor@gmail.com>
Cc: rust-for-linux@vger.kernel.org
Signed-off-by: Alexey Gladkov <legion@kernel.org>
Acked-by: Danilo Krummrich <dakr@kernel.org>
Acked-by: Nicolas Schier <nsc@kernel.org>
Link: https://patch.msgid.link/1a0d0bd87a4981d465b9ed21e14f4e78eaa03ded.1758182101.git.legion@kernel.org
Signed-off-by: Nathan Chancellor <nathan@kernel.org>

authored by

Alexey Gladkov and committed by
Nathan Chancellor
83fb4938 b88f88c2

+29 -8
+13 -1
include/linux/module.h
··· 244 244 /* What your module does. */ 245 245 #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description) 246 246 247 + /* 248 + * Format: __mod_device_table__kmod_<modname>__<type>__<name> 249 + * Parts of the string `__kmod_` and `__` are used as delimiters when parsing 250 + * a symbol in file2alias.c 251 + */ 252 + #define __mod_device_table(type, name) \ 253 + __PASTE(__mod_device_table__, \ 254 + __PASTE(__KBUILD_MODNAME, \ 255 + __PASTE(__, \ 256 + __PASTE(type, \ 257 + __PASTE(__, name))))) 258 + 247 259 #ifdef MODULE 248 260 /* Creates an alias so file2alias.c can find device table. */ 249 261 #define MODULE_DEVICE_TABLE(type, name) \ 250 - static typeof(name) __mod_device_table__##type##__##name \ 262 + static typeof(name) __mod_device_table(type, name) \ 251 263 __attribute__ ((used, alias(__stringify(name)))) 252 264 #else /* !MODULE */ 253 265 #define MODULE_DEVICE_TABLE(type, name)
+4 -4
rust/kernel/device_id.rs
··· 195 195 ($table_type: literal, $module_table_name:ident, $table_name:ident) => { 196 196 #[rustfmt::skip] 197 197 #[export_name = 198 - concat!("__mod_device_table__", $table_type, 199 - "__", module_path!(), 200 - "_", line!(), 201 - "_", stringify!($table_name)) 198 + concat!("__mod_device_table__", line!(), 199 + "__kmod_", module_path!(), 200 + "__", $table_type, 201 + "__", stringify!($table_name)) 202 202 ] 203 203 static $module_table_name: [::core::mem::MaybeUninit<u8>; $table_name.raw_ids().size()] = 204 204 unsafe { ::core::mem::transmute_copy($table_name.raw_ids()) };
+12 -3
scripts/mod/file2alias.c
··· 1476 1476 { 1477 1477 void *symval; 1478 1478 char *zeros = NULL; 1479 - const char *type, *name; 1479 + const char *type, *name, *modname; 1480 1480 size_t typelen; 1481 1481 static const char *prefix = "__mod_device_table__"; 1482 1482 ··· 1488 1488 if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT) 1489 1489 return; 1490 1490 1491 - /* All our symbols are of form __mod_device_table__<type>__<name>. */ 1491 + /* All our symbols are of form __mod_device_table__kmod_<modname>__<type>__<name>. */ 1492 1492 if (!strstarts(symname, prefix)) 1493 1493 return; 1494 - type = symname + strlen(prefix); 1494 + 1495 + modname = strstr(symname, "__kmod_"); 1496 + if (!modname) 1497 + return; 1498 + modname += strlen("__kmod_"); 1499 + 1500 + type = strstr(modname, "__"); 1501 + if (!type) 1502 + return; 1503 + type += strlen("__"); 1495 1504 1496 1505 name = strstr(type, "__"); 1497 1506 if (!name)