Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Feb 2005 19:09:25 -0700 (MST)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        scottl@samsco.org
Cc:        hackers@freebsd.org
Subject:   Re: Driver Update Disk discussion
Message-ID:  <20050224.190925.29021204.imp@bsdimp.com>
In-Reply-To: <421E7867.9060101@samsco.org>
References:  <421E7867.9060101@samsco.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <421E7867.9060101@samsco.org>
            Scott Long <scottl@samsco.org> writes:
: - runtime support.  Where will modules be put, how will they be ensured
: to not collide with the base system modules, and how will the system
: ensure that they get loaded on every boot.  Most of the pieces are in
: place right now via the loader knowing about /boot/modules, and
: /boot/loader.conf able to be modified to point to modules in there.
: What is missing is a formal definition of how these pieces work, and
: tools to automate and manage it for the user and vendor.

Right now /boot/modules is preserved on all kernel installs.  What
else is necessary?  If we have a working packaging system, then
installation is taken care of in a manner similar to
/usr/local/bin/emacs.

A bigger issue is that most of the probe routines return 0 now.  This
means that only devices that have no support at all in the base kernel
can be overridden.  I'm working to fix this and hope to get that done
before 5.4 at least for PCI and maybe usb and firewire (those probe
routines which can be called multiple times), but maybe not for ISA
and some PC Card drivers.  This likely will be sufficient for any
vendor that will want to provide drivers for any modern system.

: - kernel option support.  How do we support vendor modules in a kernel
: that might be compiled with PAE (rather common these days), SMP, MAC,
: etc.  The loader and /boot infrastructure has no concept of this.  It's
: highly important, though.

The answer in the past is that 'there shall be only one'.  SMP doesn't
change the module ABI (you can use modules on SMP and non-SMP
kernels), but PAE does (since it changes a few key data types).  Right
now I believe that it is the only option that does change the ABI.
Last time I looked, MAC didn't change the ABI at all, but so much has
happened there that this may have changed things.  The discussions at
the time when all this was hashed out for kld(9) and /boot stuff was
that it was undesirable to be able to have options that affect the ABI
since that would quickly lead into a combinatoric nightmare.  Nothing
has really changed here: we want to have as few ABIs as possible,
ideally 1.

I believe that PAE support really should be a seprate kernel
architecture and branded as such.

Clearly, we can revisit the decisions of the past on this issue.

: - source code support.  A vendor might want to distribute source code
: for the module that would be picked up in a kernel re-compile.  Patching
: the src/ tree is the only way to do that now, and that creates problems
: when interacting with cvsup.  Solving this would tie into the problem of
: compiling drivers out of ports/.  In fact, a vendor driver, both in
: source and in binary form, should probably be treated as a port/package,
: and I describe below.

One does not need to patch the source tree at to pick up ports modules
for a kernel rebuild.  One can build the ports modules as part of the
kernel by simply defining PORTS_MODULES in a kernel config file.  In
addition, one can specify absolute paths with MODULES_OVERRIDE.  One
can also build modules outside the tree against a specific kernel (if
they somehow depend on the config files).

There is one bug with PORTS_MODULES, I'll grant, but that is easy to
fix (install should be translated into deinstall/reinstall, but
isn't).  This bug is easy to work around right now by defining
FORCE_PACKAGE_REGISTER, but it should be fixed.

: - kernel api/abi.  We are trying to keep the kernel api/abi stable now,
: which helps a lot.  However, there is a chance that these could change
: for legitimate reasons.  How do we protect binary-only modules from
: this?  Linux has a fairly draconian system of hashing all of the
: exported kernel symbols with the kernel options and the kernel
: major/minor/subminor versions, and making the linker reject modules that
: don't have the right hash.  Should we follow with something similar, or
: should we have runtime checks that check symbol/structure signatures?
: Or should we say that we make no guarantees about a binary-only module
: working on anything but a -RELEASE kernel?

Until we have a well defined API that's well documented, I think that
any pretense of a guarantee overstates what we'll be able to deliver.
Many of the APIs are documented, and most drivers can be written using
just these APIs.  However, the fussiness needs to change.  We also
need to have some sort of regression tests

There was some work done to make all 5.x drivers depend on a kernel
module version 5, but that didn't make it into 5.x due to time
constraints on my part (and no one else seemed to be motivated to pick
things up).  We might want to revisit this.

As a practical matter, we can make no guarantees about anything but
-RELEASE.  In fact, given the total lack of regression tests, it would
be hard to tell vendors that we can be sure that their drivers will
work.  The documentation for the API we have is weak, but we manage to
do a pretty good job of not making major changes to its core.  I'll
point out that most minor releases historically have changed something
in the interfaces, but it has usually been so minor that no one
noticed...

: - kernel namespace.  Devclass collisions seem to already be handled
: gracefully.  devfs collisions aren't, and maybe some seatbelts here
: would be good.  Linker symbol collisions are what I really worry about,
: since they will prevent a vendor from installing an updated driver on
: top of an existing driver with a overlapping set of non-static symbols.
: I know that we do some sort of magic symbol hiding while compiling the
: kernel, but does that apply to modules also?

All the module symbols are completely hidden from everybody who does
not profess a dependency on a module, unless the module goes out of
its way to export symbols.  So this works well for us.

devfs isn't handled at all, you are right.

: These are the big things I can think of right now.  Solving it is a big
: task, but it's something that we need to do if we want vendor support to
: continue and to grow.  If anyone is interested in helping with the
: design and engineering of this (this isn't a call for testers!), please
: let me know.

Yes.  There's a lot of issues to work through...

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050224.190925.29021204.imp>