On Thu Aug 14, 2025 at 3:54 PM CEST, Alexey Gladkov wrote: > On Thu, Aug 14, 2025 at 03:26:53PM +0200, Danilo Krummrich wrote: >> On Thu Aug 14, 2025 at 3:07 PM CEST, Alexey Gladkov wrote: >> > 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 <oj...@kernel.org> >> > Cc: Andreas Hindborg <a.hindb...@kernel.org> >> > Cc: Danilo Krummrich <d...@kernel.org> >> > Cc: Alex Gaynor <alex.gay...@gmail.com> >> > Cc: rust-for-li...@vger.kernel.org >> > Signed-off-by: Alexey Gladkov <leg...@kernel.org> >> > --- >> > include/linux/module.h | 14 +++++++++++++- >> > rust/kernel/device_id.rs | 8 ++++---- >> > scripts/mod/file2alias.c | 18 ++++++++++++++---- >> > 3 files changed, 31 insertions(+), 9 deletions(-) >> > >> > diff --git a/include/linux/module.h b/include/linux/module.h >> > index 3319a5269d28..e31ee29fac6b 100644 >> > --- a/include/linux/module.h >> > +++ b/include/linux/module.h >> > @@ -244,10 +244,22 @@ struct module_kobject >> > *lookup_or_create_module_kobject(const char *name); >> > /* What your module does. */ >> > #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, >> > _description) >> > >> > +/* >> > + * Format: __mod_device_table__kmod_<modname>__<type>__<name> >> > + * Parts of the string `__kmod_` and `__` are used as delimiters when >> > parsing >> > + * a symbol in file2alias.c >> > + */ >> > +#define __mod_device_table(type, name) \ >> > + __PASTE(__mod_device_table__, \ >> > + __PASTE(__KBUILD_MODNAME, \ >> > + __PASTE(__, \ >> > + __PASTE(type, \ >> > + __PASTE(__, name))))) >> > + >> > #ifdef MODULE >> > /* Creates an alias so file2alias.c can find device table. */ >> > #define MODULE_DEVICE_TABLE(type, name) >> > \ >> > -static typeof(name) __mod_device_table__##type##__##name \ >> > +static typeof(name) __mod_device_table(type, name) >> > \ >> > __attribute__ ((used, alias(__stringify(name)))) >> > #else /* !MODULE */ >> > #define MODULE_DEVICE_TABLE(type, name) >> > diff --git a/rust/kernel/device_id.rs b/rust/kernel/device_id.rs >> > index 70d57814ff79..62c42da12e9d 100644 >> > --- a/rust/kernel/device_id.rs >> > +++ b/rust/kernel/device_id.rs >> > @@ -195,10 +195,10 @@ macro_rules! module_device_table { >> > ($table_type: literal, $module_table_name:ident, $table_name:ident) >> > => { >> > #[rustfmt::skip] >> > #[export_name = >> > - concat!("__mod_device_table__", $table_type, >> > - "__", module_path!(), >> > - "_", line!(), >> > - "_", stringify!($table_name)) >> > + concat!("__mod_device_table__", line!(), >> >> Why do we have line!() between "__mod_device_table__" and "__kmod_", while >> the >> format is defined as "__mod_device_table__kmod_<modname>__<type>__<name>" >> above? > > The "__mod_device_table__" is used to filter symbols. > The meaning part starts after "__kmod_" part. After that, order becomes > important. > >> The previous logic was to create a unique name with >> using "<module_path>_<line>_<table_name>" as "<name>". So, I think this >> should >> actually be: >> >> concat!("__mod_device_table__kmod_", >> module_path!(), >> "__", $table_type, >> "__", stringify!($table_name), >> "_", line!()) >> >> rather than the below. > > No. "stringify!($table_name)" should be the last thing in this string. > This is the a symbol name that will be searched for in the elf to generate > modalias.
$table_name is not guaranteed to be unique for a certain module_path!(), hence we need line!() to guarantee uniqueness. The symbol name will be unique no matter where you place line!() of course, but $table_name + line!() is the unique table name, which I think is what we want? >> >> > + "__kmod_", module_path!(), >> > + "__", $table_type, >> > + "__", stringify!($table_name)) >> > ] >> > static $module_table_name: [::core::mem::MaybeUninit<u8>; >> > $table_name.raw_ids().size()] = >> > unsafe { ::core::mem::transmute_copy($table_name.raw_ids()) }; >> > > -- > Rgrds, legion