TODO.modules revision 1.6
11.6Spgoyette/* $NetBSD: TODO.modules,v 1.6 2016/09/27 22:27:50 pgoyette Exp $ */ 21.1Spgoyette 31.1SpgoyetteSome notes on the limitations of our current (as of 7.99.35) module 41.1Spgoyettesubsystem. This list was triggered by an Email exchange between 51.1Spgoyettechristos and pgoyette. 61.1Spgoyette 71.1Spgoyette1. Builtin drivers can't depend on modularized drivers (the modularized 81.1Spgoyette drivers are attempted to load as builtins). 91.1Spgoyette 101.1Spgoyette The assumption is that dependencies are loaded before those 111.1Spgoyette modules which depend on them. At load time, a module's 121.1Spgoyette undefined global symbols are resolved; if any symbols can't 131.1Spgoyette be resolved, the load fails. Similarly, if a module is 141.1Spgoyette included in (built-into) the kernel, all of its symbols must 151.1Spgoyette be resolvable by the linker, otherwise the link fails. 161.1Spgoyette 171.1Spgoyette There are ways around this (such as, having the parent 181.1Spgoyette module's initialization command recursively call the module 191.5Spgoyette load code), but they're often gross hacks. 201.5Spgoyette 211.5Spgoyette Another alternative (which is used by ppp) is to provide a 221.5Spgoyette "registration" mechanism for the "child" modules, and then when 231.5Spgoyette the need for a specific child module is encountered, use 241.5Spgoyette module_autoload() to load the child module. Of course, this 251.5Spgoyette requires that the parent module know about all potentially 261.5Spgoyette loadable children. 271.1Spgoyette 281.1Spgoyette2. Currently, config(1) has no way to "no define" drivers 291.1Spgoyette 301.1Spgoyette3. It is not always obvious by their names which drivers/options 311.1Spgoyette correspond to which modules. 321.1Spgoyette 331.1Spgoyette4. Right now critical drivers that would need to be pre-loaded (ffs, 341.1Spgoyette exec_elf64) are still built-in so that we don't need to alter the boot 351.1Spgoyette blocks to boot. 361.1Spgoyette 371.1Spgoyette This was a conscious decision by core@ some years ago. It is 381.1Spgoyette not a requirement that ffs or exec_* be built-in. The only 391.1Spgoyette requirement is that the root file-system's module must be 401.1Spgoyette available when the module subsystem is initialized, in order 411.1Spgoyette to load other modules. This can be accomplished by having the 421.1Spgoyette boot loader "push" the module at boot time. (It used to do 431.1Spgoyette this in all cases; currently the "push" only occurs if the 441.1Spgoyette booted filesystem is not ffs.) 451.1Spgoyette 461.1Spgoyette5. Not all parent bus drivers are capable of rescan, so some drivers 471.1Spgoyette just have to be built-in. 481.1Spgoyette 491.1Spgoyette6. Many (most?) drivers are not yet modularized 501.1Spgoyette 511.1Spgoyette7. There's currently no provisions for autoconfig to figure out which 521.1Spgoyette modules are needed, and thus to load the required modules. 531.1Spgoyette 541.1Spgoyette In the "normal" built-in world, autoconfigure can only ask 551.1Spgoyette existing drivers if they're willing to manage (ie, attach) a 561.1Spgoyette device. Removing the built-in drivers tends to limit the 571.1Spgoyette availability of possible managers. There's currently no 581.1Spgoyette mechanism for identifying and loading drivers based on what 591.1Spgoyette devices might be found. 601.1Spgoyette 611.2Spgoyette8. Even for existing modules, there are "surprise" dependencies with 621.2Spgoyette code that has not yet been modularized. 631.2Spgoyette 641.2Spgoyette For example, even though the bpf code has been modularized, 651.2Spgoyette there is some shared code in bpf_filter.c which is needed by 661.2Spgoyette both ipfilter and ppp. ipf is already modularized, but ppp 671.2Spgoyette is not. Thus, even though bpf_filter is modular, it MUST be 681.2Spgoyette included as a built-in module if you also have ppp in your 691.2Spgoyette configuration. 701.2Spgoyette 711.2Spgoyette Another example is sysmon_taskq module. It is required by 721.2Spgoyette other parts of the sysmon subsystem, including the 731.2Spgoyette "sysmon_power" module. Unfortunately, even though the 741.2Spgoyette sysmon_power code is modularized, it is referenced by the 751.2Spgoyette acpi code which has not been modularized. Therefore, if your 761.2Spgoyette configuration has acpi, then you must include the "sysmon_power" 771.2Spgoyette module built-in the kernel. And therefore your also need to 781.2Spgoyette have "sysmon_taskq" and "sysmon" built-in since "sysmon_power" 791.2Spgoyette rerefences them. 801.2Spgoyette 811.2Spgoyette9. As a corollary to #8 above, having dependencies on modules from code 821.2Spgoyette which has not been modularized makes it extremely difficult to test 831.2Spgoyette the module code adequately. Testing of module code should include 841.2Spgoyette both testing-as-a-built-in module and testing-as-a-loaded-module, and 851.2Spgoyette all dependencies need to be identified. 861.3Spgoyette 871.6Spgoyette10.The current /stand/$ARCH/$VERSION/modules/ hierarchy won't scale as 881.6Spgoyette we get more and more modules. There are hundreds of potential device 891.6Spgoyette driver modules. 901.6Spgoyette 911.6Spgoyette11.There currently isn't any good way to handle attachment-specific 921.6Spgoyette modules. The build infrastructure (ie, sys/modules/Makefile) doesn't 931.6Spgoyette readily lend itself to bus-specific modules irrespective of $ARCH, 941.6Spgoyette and maintaining distrib/sets/lists/modules/* is awkward at best. 951.6Spgoyette 961.6Spgoyette Furthermore, devices such as ld(4), which can attach to a large set 971.6Spgoyette of parent devices, need to be modified. The parent devices need to 981.6Spgoyette provide a common attribute (for example, ld_bud), and the ld driver 991.6Spgoyette should attach to that attribute rather than to each parent. But 1001.6Spgoyette currently, config(1) doesn't handle this - it doesn't allow an 1011.6Spgoyette attribute to be used as the device tree's pseudo-root. 1021.6Spgoyette 1031.6Spgoyette12.Item #11 gets even murkier when a particular parent can provide more 1041.6Spgoyette than one attribute. 105