Home | History | Annotate | Line # | Download | only in doc
TODO.modules revision 1.9
      1  1.9  pgoyette /* $NetBSD: TODO.modules,v 1.9 2016/12/15 03:24:43 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.7  christos  1. Builtin drivers can't depend on modularized drivers (the modularized
      8  1.7  christos     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.5  pgoyette 	load code), but they're often gross hacks.
     20  1.5  pgoyette 
     21  1.5  pgoyette 	Another alternative (which is used by ppp) is to provide a
     22  1.5  pgoyette 	"registration" mechanism for the "child" modules, and then when
     23  1.5  pgoyette 	the need for a specific child module is encountered, use
     24  1.5  pgoyette 	module_autoload() to load the child module.  Of course, this
     25  1.5  pgoyette 	requires that the parent module know about all potentially
     26  1.5  pgoyette 	loadable children.
     27  1.1  pgoyette 
     28  1.7  christos  2. Currently, config(1) has no way to "no define" drivers
     29  1.7  christos 	XXX: I don't think this is true anymore. I think we can
     30  1.7  christos 	undefine drivers now, see MODULAR in amd64, which does
     31  1.7  christos 	no ath* and no select sppp*
     32  1.7  christos 
     33  1.7  christos  3. It is not always obvious by their names which drivers/options
     34  1.7  christos     correspond to which modules.
     35  1.7  christos 
     36  1.7  christos  4. Right now critical drivers that would need to be pre-loaded (ffs,
     37  1.7  christos     exec_elf64) are still built-in so that we don't need to alter the boot
     38  1.7  christos     blocks to boot.
     39  1.1  pgoyette 
     40  1.1  pgoyette 	This was a conscious decision by core@ some years ago.  It is
     41  1.1  pgoyette 	not a requirement that ffs or exec_* be built-in.  The only
     42  1.1  pgoyette 	requirement is that the root file-system's module must be
     43  1.1  pgoyette 	available when the module subsystem is initialized, in order
     44  1.1  pgoyette 	to load other modules.  This can be accomplished by having the
     45  1.1  pgoyette 	boot loader "push" the module at boot time.  (It used to do
     46  1.1  pgoyette 	this in all cases; currently the "push" only occurs if the
     47  1.1  pgoyette 	booted filesystem is not ffs.)
     48  1.1  pgoyette 
     49  1.7  christos  5. Not all parent bus drivers are capable of rescan, so some drivers
     50  1.7  christos     just have to be built-in.
     51  1.1  pgoyette 
     52  1.7  christos  6. Many (most?) drivers are not yet modularized
     53  1.1  pgoyette 
     54  1.7  christos  7. There's currently no provisions for autoconfig to figure out which
     55  1.7  christos     modules are needed, and thus to load the required modules.
     56  1.1  pgoyette 
     57  1.1  pgoyette 	In the "normal" built-in world, autoconfigure can only ask
     58  1.1  pgoyette 	existing drivers if they're willing to manage (ie, attach) a
     59  1.1  pgoyette 	device.  Removing the built-in drivers tends to limit the
     60  1.1  pgoyette 	availability of possible managers.  There's currently no
     61  1.1  pgoyette 	mechanism for identifying and loading drivers based on what
     62  1.1  pgoyette 	devices might be found.
     63  1.1  pgoyette 
     64  1.7  christos  8. Even for existing modules, there are "surprise" dependencies with
     65  1.7  christos     code that has not yet been modularized.
     66  1.2  pgoyette 
     67  1.2  pgoyette 	For example, even though the bpf code has been modularized,
     68  1.2  pgoyette 	there is some shared code in bpf_filter.c which is needed by
     69  1.2  pgoyette 	both ipfilter and ppp.  ipf is already modularized, but ppp
     70  1.2  pgoyette 	is not.  Thus, even though bpf_filter is modular, it MUST be
     71  1.2  pgoyette 	included as a built-in module if you also have ppp in your
     72  1.2  pgoyette 	configuration.
     73  1.2  pgoyette 
     74  1.2  pgoyette 	Another example is sysmon_taskq module.  It is required by
     75  1.2  pgoyette 	other parts of the sysmon subsystem, including the
     76  1.2  pgoyette 	"sysmon_power" module.  Unfortunately, even though the
     77  1.2  pgoyette 	sysmon_power code is modularized, it is referenced by the
     78  1.2  pgoyette 	acpi code which has not been modularized.  Therefore, if your
     79  1.2  pgoyette 	configuration has acpi, then you must include the "sysmon_power"
     80  1.2  pgoyette 	module built-in the kernel.  And therefore your also need to
     81  1.2  pgoyette 	have "sysmon_taskq" and "sysmon" built-in since "sysmon_power"
     82  1.2  pgoyette 	rerefences them.
     83  1.2  pgoyette 
     84  1.7  christos  9. As a corollary to #8 above, having dependencies on modules from code
     85  1.7  christos     which has not been modularized makes it extremely difficult to test
     86  1.7  christos     the module code adequately.  Testing of module code should include
     87  1.7  christos     both testing-as-a-built-in module and testing-as-a-loaded-module, and
     88  1.7  christos     all dependencies need to be identified.
     89  1.7  christos 
     90  1.7  christos 10. The current /stand/$ARCH/$VERSION/modules/ hierarchy won't scale as
     91  1.7  christos     we get more and more modules.  There are hundreds of potential device
     92  1.7  christos     driver modules.
     93  1.7  christos 
     94  1.7  christos 11. There currently isn't any good way to handle attachment-specific
     95  1.7  christos     modules.  The build infrastructure (ie, sys/modules/Makefile) doesn't
     96  1.7  christos     readily lend itself to bus-specific modules irrespective of $ARCH,
     97  1.7  christos     and maintaining distrib/sets/lists/modules/* is awkward at best.
     98  1.7  christos 
     99  1.7  christos     Furthermore, devices such as ld(4), which can attach to a large set
    100  1.7  christos     of parent devices, need to be modified.  The parent devices need to
    101  1.8       wiz     provide a common attribute (for example, ld_bus), and the ld driver
    102  1.7  christos     should attach to that attribute rather than to each parent.  But
    103  1.7  christos     currently, config(1) doesn't handle this - it doesn't allow an
    104  1.7  christos     attribute to be used as the device tree's pseudo-root. The current
    105  1.7  christos     directory structure where driver foo is split between ic/foo.c
    106  1.7  christos     and bus1/foo_bus1.c ... busn/foo_busn.c is annoying. It would be
    107  1.7  christos     better to switch to the FreeBSD model which puts all the driver
    108  1.7  christos     files in one directory.
    109  1.6  pgoyette 
    110  1.7  christos 12. Item #11 gets even murkier when a particular parent can provide more
    111  1.7  christos     than one attribute.
    112  1.9  pgoyette 
    113  1.9  pgoyette 13. It seems that we might want some additional sets-lists "attributes"
    114  1.9  pgoyette     to control contents of distributions.  As an example, many of our
    115  1.9  pgoyette     architectures have PCI bus capabilities, but not all.  It is rather
    116  1.9  pgoyette     painful to need to maintain individual architectures' modules/md_*
    117  1.9  pgoyette     sets lists, especially when we already have to conditionalize the
    118  1.9  pgoyette     build of the modules based on architecture.  If we had a single
    119  1.9  pgoyette     "attribute" for PCI-bus-capable, the same attribute could be used to
    120  1.9  pgoyette     select which modules to build and which modules from modules/mi to
    121  1.9  pgoyette     include in the release.  (This is not limited to PCI;  recently we
    122  1.9  pgoyette     encounter similar issues with spkr aka spkr_synth module.)
    123