Home | History | Annotate | Line # | Download | only in doc
TODO.modules revision 1.2
      1  1.2  pgoyette /* $NetBSD: TODO.modules,v 1.2 2016/08/04 22:12:31 pgoyette Exp $ */
      2  1.1  pgoyette 
      3  1.1  pgoyette Some notes on the limitations of our current (as of 7.99.35) module
      4  1.1  pgoyette subsystem.  This list was triggered by an Email exchange between
      5  1.1  pgoyette christos and pgoyette.
      6  1.1  pgoyette 
      7  1.1  pgoyette 1. Builtin drivers can't depend on modularized drivers (the modularized
      8  1.1  pgoyette    drivers are attempted to load as builtins).
      9  1.1  pgoyette 
     10  1.1  pgoyette 	The assumption is that dependencies are loaded before those
     11  1.1  pgoyette 	modules which depend on them.  At load time, a module's
     12  1.1  pgoyette 	undefined global symbols are resolved;  if any symbols can't
     13  1.1  pgoyette 	be resolved, the load fails.  Similarly, if a module is
     14  1.1  pgoyette 	included in (built-into) the kernel, all of its symbols must
     15  1.1  pgoyette 	be resolvable by the linker, otherwise the link fails.
     16  1.1  pgoyette 
     17  1.1  pgoyette 	There are ways around this (such as, having the parent
     18  1.1  pgoyette 	module's initialization command recursively call the module
     19  1.1  pgoyette 	load code), but they're gross hacks.
     20  1.1  pgoyette 
     21  1.1  pgoyette 2. Currently, config(1) has no way to "no define" drivers
     22  1.1  pgoyette 
     23  1.1  pgoyette 3. It is not always obvious by their names which drivers/options
     24  1.1  pgoyette    correspond to which modules.
     25  1.1  pgoyette 
     26  1.1  pgoyette 4. Right now critical drivers that would need to be pre-loaded (ffs,
     27  1.1  pgoyette    exec_elf64) are still built-in so that we don't need to alter the boot
     28  1.1  pgoyette    blocks to boot.
     29  1.1  pgoyette 
     30  1.1  pgoyette 	This was a conscious decision by core@ some years ago.  It is
     31  1.1  pgoyette 	not a requirement that ffs or exec_* be built-in.  The only
     32  1.1  pgoyette 	requirement is that the root file-system's module must be
     33  1.1  pgoyette 	available when the module subsystem is initialized, in order
     34  1.1  pgoyette 	to load other modules.  This can be accomplished by having the
     35  1.1  pgoyette 	boot loader "push" the module at boot time.  (It used to do
     36  1.1  pgoyette 	this in all cases; currently the "push" only occurs if the
     37  1.1  pgoyette 	booted filesystem is not ffs.)
     38  1.1  pgoyette 
     39  1.1  pgoyette 5. Not all parent bus drivers are capable of rescan, so some drivers
     40  1.1  pgoyette    just have to be built-in.
     41  1.1  pgoyette 
     42  1.1  pgoyette 6. Many (most?) drivers are not yet modularized
     43  1.1  pgoyette 
     44  1.1  pgoyette 7. There's currently no provisions for autoconfig to figure out which
     45  1.1  pgoyette    modules are needed, and thus to load the required modules.
     46  1.1  pgoyette 
     47  1.1  pgoyette 	In the "normal" built-in world, autoconfigure can only ask
     48  1.1  pgoyette 	existing drivers if they're willing to manage (ie, attach) a
     49  1.1  pgoyette 	device.  Removing the built-in drivers tends to limit the
     50  1.1  pgoyette 	availability of possible managers.  There's currently no
     51  1.1  pgoyette 	mechanism for identifying and loading drivers based on what
     52  1.1  pgoyette 	devices might be found.
     53  1.1  pgoyette 
     54  1.2  pgoyette 8. Even for existing modules, there are "surprise" dependencies with
     55  1.2  pgoyette    code that has not yet been modularized.
     56  1.2  pgoyette 
     57  1.2  pgoyette 	For example, even though the bpf code has been modularized,
     58  1.2  pgoyette 	there is some shared code in bpf_filter.c which is needed by
     59  1.2  pgoyette 	both ipfilter and ppp.  ipf is already modularized, but ppp
     60  1.2  pgoyette 	is not.  Thus, even though bpf_filter is modular, it MUST be
     61  1.2  pgoyette 	included as a built-in module if you also have ppp in your
     62  1.2  pgoyette 	configuration.
     63  1.2  pgoyette 
     64  1.2  pgoyette 	Another example is sysmon_taskq module.  It is required by
     65  1.2  pgoyette 	other parts of the sysmon subsystem, including the
     66  1.2  pgoyette 	"sysmon_power" module.  Unfortunately, even though the
     67  1.2  pgoyette 	sysmon_power code is modularized, it is referenced by the
     68  1.2  pgoyette 	acpi code which has not been modularized.  Therefore, if your
     69  1.2  pgoyette 	configuration has acpi, then you must include the "sysmon_power"
     70  1.2  pgoyette 	module built-in the kernel.  And therefore your also need to
     71  1.2  pgoyette 	have "sysmon_taskq" and "sysmon" built-in since "sysmon_power"
     72  1.2  pgoyette 	rerefences them.
     73  1.2  pgoyette 
     74  1.2  pgoyette 9. As a corollary to #8 above, having dependencies on modules from code
     75  1.2  pgoyette    which has not been modularized makes it extremely difficult to test
     76  1.2  pgoyette    the module code adequately.  Testing of module code should include
     77  1.2  pgoyette    both testing-as-a-built-in module and testing-as-a-loaded-module, and
     78  1.2  pgoyette    all dependencies need to be identified.
     79