On Tue, Aug 13, 2019 at 01:17:00PM +0100, Matthias Maennich wrote: > The EXPORT_SYMBOL_NS() and EXPORT_SYMBOL_NS_GPL() macros can be used to > export a symbol to a specific namespace. There are no _GPL_FUTURE and > _UNUSED variants because these are currently unused, and I'm not sure > they are necessary. > > I didn't add EXPORT_SYMBOL_NS() for ASM exports; this patch sets the > namespace of ASM exports to NULL by default. In case of relative > references, it will be relocatable to NULL. If there's a need, this > should be pretty easy to add. > > A module that wants to use a symbol exported to a namespace must add a > MODULE_IMPORT_NS() statement to their module code; otherwise, modpost > will complain when building the module, and the kernel module loader > will emit an error and fail when loading the module. > > MODULE_IMPORT_NS() adds a modinfo tag 'import_ns' to the module. That > tag can be observed by the modinfo command, modpost and kernel/module.c > at the time of loading the module. > > The ELF symbols are renamed to include the namespace with an asm label; > for example, symbol 'usb_stor_suspend' in namespace USB_STORAGE becomes > 'usb_stor_suspend.USB_STORAGE'. This allows modpost to do namespace > checking, without having to go through all the effort of parsing ELF and > relocation records just to get to the struct kernel_symbols. > > On x86_64 I saw no difference in binary size (compression), but at > runtime this will require a word of memory per export to hold the > namespace. An alternative could be to store namespaced symbols in their > own section and use a separate 'struct namespaced_kernel_symbol' for > that section, at the cost of making the module loader more complex. > > Co-developed-by: Martijn Coenen <maco@xxxxxxxxxxx> > Signed-off-by: Martijn Coenen <maco@xxxxxxxxxxx> > Signed-off-by: Matthias Maennich <maennich@xxxxxxxxxx> Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>