symbol-namespaces.rst 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. =================
  2. Symbol Namespaces
  3. =================
  4. The following document describes how to use Symbol Namespaces to structure the
  5. export surface of in-kernel symbols exported through the family of
  6. EXPORT_SYMBOL() macros.
  7. Introduction
  8. ============
  9. Symbol Namespaces have been introduced as a means to structure the export
  10. surface of the in-kernel API. It allows subsystem maintainers to partition
  11. their exported symbols into separate namespaces. That is useful for
  12. documentation purposes (think of the SUBSYSTEM_DEBUG namespace) as well as for
  13. limiting the availability of a set of symbols for use in other parts of the
  14. kernel. As of today, modules that make use of symbols exported into namespaces,
  15. are required to import the namespace. Otherwise the kernel will, depending on
  16. its configuration, reject loading the module or warn about a missing import.
  17. Additionally, it is possible to put symbols into a module namespace, strictly
  18. limiting which modules are allowed to use these symbols.
  19. How to define Symbol Namespaces
  20. ===============================
  21. Symbols can be exported into namespace using different methods. All of them are
  22. changing the way EXPORT_SYMBOL and friends are instrumented to create ksymtab
  23. entries.
  24. Using the EXPORT_SYMBOL macros
  25. ------------------------------
  26. In addition to the macros EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL(), that allow
  27. exporting of kernel symbols to the kernel symbol table, variants of these are
  28. available to export symbols into a certain namespace: EXPORT_SYMBOL_NS() and
  29. EXPORT_SYMBOL_NS_GPL(). They take one additional argument: the namespace as a
  30. string constant. Note that this string must not contain whitespaces.
  31. E.g. to export the symbol ``usb_stor_suspend`` into the
  32. namespace ``USB_STORAGE``, use::
  33. EXPORT_SYMBOL_NS(usb_stor_suspend, "USB_STORAGE");
  34. The corresponding ksymtab entry struct ``kernel_symbol`` will have the member
  35. ``namespace`` set accordingly. A symbol that is exported without a namespace will
  36. refer to ``NULL``. There is no default namespace if none is defined. ``modpost``
  37. and kernel/module/main.c make use the namespace at build time or module load
  38. time, respectively.
  39. Using the DEFAULT_SYMBOL_NAMESPACE define
  40. -----------------------------------------
  41. Defining namespaces for all symbols of a subsystem can be very verbose and may
  42. become hard to maintain. Therefore a default define (DEFAULT_SYMBOL_NAMESPACE)
  43. is been provided, that, if set, will become the default for all EXPORT_SYMBOL()
  44. and EXPORT_SYMBOL_GPL() macro expansions that do not specify a namespace.
  45. There are multiple ways of specifying this define and it depends on the
  46. subsystem and the maintainer's preference, which one to use. The first option
  47. is to define the default namespace in the ``Makefile`` of the subsystem. E.g. to
  48. export all symbols defined in usb-common into the namespace USB_COMMON, add a
  49. line like this to drivers/usb/common/Makefile::
  50. ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE='"USB_COMMON"'
  51. That will affect all EXPORT_SYMBOL() and EXPORT_SYMBOL_GPL() statements. A
  52. symbol exported with EXPORT_SYMBOL_NS() while this definition is present, will
  53. still be exported into the namespace that is passed as the namespace argument
  54. as this argument has preference over a default symbol namespace.
  55. A second option to define the default namespace is directly in the compilation
  56. unit as preprocessor statement. The above example would then read::
  57. #define DEFAULT_SYMBOL_NAMESPACE "USB_COMMON"
  58. within the corresponding compilation unit before the #include for
  59. <linux/export.h>. Typically it's placed before the first #include statement.
  60. Using the EXPORT_SYMBOL_FOR_MODULES() macro
  61. -------------------------------------------
  62. Symbols exported using this macro are put into a module namespace. This
  63. namespace cannot be imported. These exports are GPL-only as they are only
  64. intended for in-tree modules.
  65. The macro takes a comma separated list of module names, allowing only those
  66. modules to access this symbol. Simple tail-globs are supported.
  67. For example::
  68. EXPORT_SYMBOL_FOR_MODULES(preempt_notifier_inc, "kvm,kvm-*")
  69. will limit usage of this symbol to modules whose name matches the given
  70. patterns.
  71. How to use Symbols exported in Namespaces
  72. =========================================
  73. In order to use symbols that are exported into namespaces, kernel modules need
  74. to explicitly import these namespaces. Otherwise the kernel might reject to
  75. load the module. The module code is required to use the macro MODULE_IMPORT_NS
  76. for the namespaces it uses symbols from. E.g. a module using the
  77. usb_stor_suspend symbol from above, needs to import the namespace USB_STORAGE
  78. using a statement like::
  79. MODULE_IMPORT_NS("USB_STORAGE");
  80. This will create a ``modinfo`` tag in the module for each imported namespace.
  81. This has the side effect, that the imported namespaces of a module can be
  82. inspected with modinfo::
  83. $ modinfo drivers/usb/storage/ums-karma.ko
  84. [...]
  85. import_ns: USB_STORAGE
  86. [...]
  87. It is advisable to add the MODULE_IMPORT_NS() statement close to other module
  88. metadata definitions like MODULE_AUTHOR() or MODULE_LICENSE().
  89. Loading Modules that use namespaced Symbols
  90. ===========================================
  91. At module loading time (e.g. ``insmod``), the kernel will check each symbol
  92. referenced from the module for its availability and whether the namespace it
  93. might be exported to has been imported by the module. The default behaviour of
  94. the kernel is to reject loading modules that don't specify sufficient imports.
  95. An error will be logged and loading will be failed with EINVAL. In order to
  96. allow loading of modules that don't satisfy this precondition, a configuration
  97. option is available: Setting MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=y will
  98. enable loading regardless, but will emit a warning.
  99. Automatically creating MODULE_IMPORT_NS statements
  100. ==================================================
  101. Missing namespaces imports can easily be detected at build time. In fact,
  102. modpost will emit a warning if a module uses a symbol from a namespace
  103. without importing it.
  104. MODULE_IMPORT_NS() statements will usually be added at a definite location
  105. (along with other module meta data). To make the life of module authors (and
  106. subsystem maintainers) easier, a script and make target is available to fixup
  107. missing imports. Fixing missing imports can be done with::
  108. $ make nsdeps
  109. A typical scenario for module authors would be::
  110. - write code that depends on a symbol from a not imported namespace
  111. - ``make``
  112. - notice the warning of modpost telling about a missing import
  113. - run ``make nsdeps`` to add the import to the correct code location
  114. For subsystem maintainers introducing a namespace, the steps are very similar.
  115. Again, ``make nsdeps`` will eventually add the missing namespace imports for
  116. in-tree modules::
  117. - move or add symbols to a namespace (e.g. with EXPORT_SYMBOL_NS())
  118. - ``make`` (preferably with an allmodconfig to cover all in-kernel
  119. modules)
  120. - notice the warning of modpost telling about a missing import
  121. - run ``make nsdeps`` to add the import to the correct code location
  122. You can also run nsdeps for external module builds. A typical usage is::
  123. $ make -C <path_to_kernel_src> M=$PWD nsdeps
  124. Note: it will happily generate an import statement for the module namespace;
  125. which will not work and generates build and runtime failures.