brintos

brintos / linux-shallow public Read only

0
0
Text · 6.8 KiB · 12e4aec Raw
158 lines · plain
1=================2Symbol Namespaces3=================4 5The following document describes how to use Symbol Namespaces to structure the6export surface of in-kernel symbols exported through the family of7EXPORT_SYMBOL() macros.8 9.. Table of Contents10 11	=== 1 Introduction12	=== 2 How to define Symbol Namespaces13	   --- 2.1 Using the EXPORT_SYMBOL macros14	   --- 2.2 Using the DEFAULT_SYMBOL_NAMESPACE define15	=== 3 How to use Symbols exported in Namespaces16	=== 4 Loading Modules that use namespaced Symbols17	=== 5 Automatically creating MODULE_IMPORT_NS statements18 191. Introduction20===============21 22Symbol Namespaces have been introduced as a means to structure the export23surface of the in-kernel API. It allows subsystem maintainers to partition24their exported symbols into separate namespaces. That is useful for25documentation purposes (think of the SUBSYSTEM_DEBUG namespace) as well as for26limiting the availability of a set of symbols for use in other parts of the27kernel. As of today, modules that make use of symbols exported into namespaces,28are required to import the namespace. Otherwise the kernel will, depending on29its configuration, reject loading the module or warn about a missing import.30 312. How to define Symbol Namespaces32==================================33 34Symbols can be exported into namespace using different methods. All of them are35changing the way EXPORT_SYMBOL and friends are instrumented to create ksymtab36entries.37 382.1 Using the EXPORT_SYMBOL macros39==================================40 41In addition to the macros EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL(), that allow42exporting of kernel symbols to the kernel symbol table, variants of these are43available to export symbols into a certain namespace: EXPORT_SYMBOL_NS() and44EXPORT_SYMBOL_NS_GPL(). They take one additional argument: the namespace.45Please note that due to macro expansion that argument needs to be a46preprocessor symbol. E.g. to export the symbol ``usb_stor_suspend`` into the47namespace ``USB_STORAGE``, use::48 49	EXPORT_SYMBOL_NS(usb_stor_suspend, USB_STORAGE);50 51The corresponding ksymtab entry struct ``kernel_symbol`` will have the member52``namespace`` set accordingly. A symbol that is exported without a namespace will53refer to ``NULL``. There is no default namespace if none is defined. ``modpost``54and kernel/module/main.c make use the namespace at build time or module load55time, respectively.56 572.2 Using the DEFAULT_SYMBOL_NAMESPACE define58=============================================59 60Defining namespaces for all symbols of a subsystem can be very verbose and may61become hard to maintain. Therefore a default define (DEFAULT_SYMBOL_NAMESPACE)62is been provided, that, if set, will become the default for all EXPORT_SYMBOL()63and EXPORT_SYMBOL_GPL() macro expansions that do not specify a namespace.64 65There are multiple ways of specifying this define and it depends on the66subsystem and the maintainer's preference, which one to use. The first option67is to define the default namespace in the ``Makefile`` of the subsystem. E.g. to68export all symbols defined in usb-common into the namespace USB_COMMON, add a69line like this to drivers/usb/common/Makefile::70 71	ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=USB_COMMON72 73That will affect all EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL() statements. A74symbol exported with EXPORT_SYMBOL_NS() while this definition is present, will75still be exported into the namespace that is passed as the namespace argument76as this argument has preference over a default symbol namespace.77 78A second option to define the default namespace is directly in the compilation79unit as preprocessor statement. The above example would then read::80 81	#undef  DEFAULT_SYMBOL_NAMESPACE82	#define DEFAULT_SYMBOL_NAMESPACE USB_COMMON83 84within the corresponding compilation unit before any EXPORT_SYMBOL macro is85used.86 873. How to use Symbols exported in Namespaces88============================================89 90In order to use symbols that are exported into namespaces, kernel modules need91to explicitly import these namespaces. Otherwise the kernel might reject to92load the module. The module code is required to use the macro MODULE_IMPORT_NS93for the namespaces it uses symbols from. E.g. a module using the94usb_stor_suspend symbol from above, needs to import the namespace USB_STORAGE95using a statement like::96 97	MODULE_IMPORT_NS(USB_STORAGE);98 99This will create a ``modinfo`` tag in the module for each imported namespace.100This has the side effect, that the imported namespaces of a module can be101inspected with modinfo::102 103	$ modinfo drivers/usb/storage/ums-karma.ko104	[...]105	import_ns:      USB_STORAGE106	[...]107 108 109It is advisable to add the MODULE_IMPORT_NS() statement close to other module110metadata definitions like MODULE_AUTHOR() or MODULE_LICENSE(). Refer to section1115. for a way to create missing import statements automatically.112 1134. Loading Modules that use namespaced Symbols114==============================================115 116At module loading time (e.g. ``insmod``), the kernel will check each symbol117referenced from the module for its availability and whether the namespace it118might be exported to has been imported by the module. The default behaviour of119the kernel is to reject loading modules that don't specify sufficient imports.120An error will be logged and loading will be failed with EINVAL. In order to121allow loading of modules that don't satisfy this precondition, a configuration122option is available: Setting MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y will123enable loading regardless, but will emit a warning.124 1255. Automatically creating MODULE_IMPORT_NS statements126=====================================================127 128Missing namespaces imports can easily be detected at build time. In fact,129modpost will emit a warning if a module uses a symbol from a namespace130without importing it.131MODULE_IMPORT_NS() statements will usually be added at a definite location132(along with other module meta data). To make the life of module authors (and133subsystem maintainers) easier, a script and make target is available to fixup134missing imports. Fixing missing imports can be done with::135 136	$ make nsdeps137 138A typical scenario for module authors would be::139 140	- write code that depends on a symbol from a not imported namespace141	- ``make``142	- notice the warning of modpost telling about a missing import143	- run ``make nsdeps`` to add the import to the correct code location144 145For subsystem maintainers introducing a namespace, the steps are very similar.146Again, ``make nsdeps`` will eventually add the missing namespace imports for147in-tree modules::148 149	- move or add symbols to a namespace (e.g. with EXPORT_SYMBOL_NS())150	- ``make`` (preferably with an allmodconfig to cover all in-kernel151	  modules)152	- notice the warning of modpost telling about a missing import153	- run ``make nsdeps`` to add the import to the correct code location154 155You can also run nsdeps for external module builds. A typical usage is::156 157	$ make -C <path_to_kernel_src> M=$PWD nsdeps158