Re: compat-drivers wishlist

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 1) Ability to copy only some drivers.
> 2) To make that easier: split all patches per *file* in addition to per change.

You could think that an alternative to these would be for me to
post-process the sources and remove everything I don't care about.
However, that gets tricky because my compat package is created from my
own tree, and there the patches don't always apply. Therefore these
wishes.

I think for 2), I'd propose the following structure:

patches/collateral-evolutions/network/0001-netdev_ops/
	-> INFO
	-> rndis.patch
	-> usbnet.patch
	-> ath6kl.patch

Since the filename doesn't matter all that much, an automated conversion
could just split the patch per file and store it in a filename obtained
as follows:
	drivers/net/usb/rndis_host.c
->	drivers_net_usb_rndis_host.c

Easy :-)

The script to apply them gets a little more difficult, but I think we
should start using python for the tree-creation-time scripting which
will make this easy enough. Just walk the tree, etc.

> 3) Separate the output from the compat-drivers tree.

Should be easy, though it probably requires rewriting admin-update.
OTOH, admin-refresh etc. all pretty much goes away since you can just rm
-rf the output directory.

> 4) Kconfig.

So my wishes 1-3 apply at "tree creation" time, which is when the compat
source tree (and later tarball) is created and patched for the
backports. I've already suggested to rewrite that scripting in python,
and I'm willing to invest time in that if it stands a chance of getting
accepted :-)

This one is a bit more difficult. On the one hand we need to have all
the symbols from the kernel, but we don't want to leak them into the
compat namespace. Right now, for example, we do things like renaming
CONFIG_USB_NET_RNDIS_HOST to CONFIG_USB_NET_COMPAT_RNDIS_HOST which we
really should do for everything -- we get into trouble occasionally
because somebody enables something in the base kernel and then tries to
disable it in compat, which doesn't work.

I've been thinking a while about this, and I think I pretty much found a
solution.

First of all, it's easy to write a small Kconfig program (using the
existing Kconfig C code of course) that generates a list of all symbols
present in a given Kconfig tree, even disabled ones. Here's the program,
you just have to link it with zconf.tab.c and pass a root Kconfig file
as the only command line argument:
http://p.sipsolutions.net/3300bc91340ae747.txt

Equipped with a list of config symbols, we can go through the sources
and Makefiles and replace CONFIG_* with (e.g.) CPTCFG_* (and also
CONFIG_*_MODULE). We can't just replace CONFIG_ with CPTCFG_ because
then we get kernel symbols wrong. We could rename all CONFIG_ to CPTCFG_
and import the kernel symbols, which we have to do for Kconfig anyway,
but I feel that doing that would make things more brittle. (*)

Now obviously if we have a local Kconfig tree, it's pretty useless. The
reason is that we'll have things like

config MYDRIVER_PCI
	tristate "my good PCI driver"
	depends on PCI && HAS_IOMEM
config MYDRIVER_USB
	tristate "my good USB driver"
	depends on USB

or something like that, and the Kconfig tree we have clearly doesn't
know about PCI, HAS_IOMEM or USB. We'll have to teach it, which is
surprisingly easy:

path/to/syms-program Kconfig > local-symbol-list
sed -i 's/$/=/' local-symbol-list
grep -v -f local-symbol-list $KLIB_BUILD/.config | dotconf-to-kconf.py > Kconfig.kernel

dotconf-to-kconf.py is this little tool: http://p.sipsolutions.net/986bfbd397ad51c5.txt
(Clearly it has to be rewritten in a different language since this has
to run at build time, not just at tarball creation time, but that's easy
to do)

Now we can "source Kconfig.kernel" into our local Kconfig tree, and the
"depends on USB" can magically work the right way. For the symbol walk
(syms program above) we'll have to include an empty file, but that's not
terribly difficult either.

Oh, whenever we execute menuconfig/oldconfig/... we set the environment
variable CONFIG_ to CPTCFG_ -- this will make the tool output CPTCFG_
instead of CONFIG_ as the prefix for all the output variables.

This is about as far as I got with the implementation. There are a few
issues left. 

1) All of the kernel symbols like USB get put into the .config file,
e.g. CPTCFG_USB. This doesn't actually matter all that much because
they're prefixed CPTCFG_ and the code we compile still looks for CONFIG_
for the kernel symbols -- remember that we only renamed the ones we
found in our local Kconfig tree.

2) I have no idea how to go from a .config file to a working
Makefile/autoconf.h system.

3) If KLIB_BUILD dir or the kernel config changes, this has to be
regenerated and oldconfig must be run. For instance, if USB was now
disabled in the base kernel then we shouldn't attempt to build USB
drivers, etc. This is a bit tricky because we also don't want to redo
everything for each "make". I'm not sure how much we care about this,
but we can probably solve it by storing a checksum of
$KLIB_BUILD/.config and doing the preparation steps only if that
changes, or so.

4) This assumes KLIB_BUILD is configured externally, it's not possible
to configure that through menuconfig since the Kconfig tree needs to be
built first. I don't think this is a problem, but it looks like Luis
wanted to put that into Kconfig so I'm saying it won't really work.

Thoughts?

johannes

(*) post-scriptum: this can and should actually happen at tree creation
time, not at build time

--
To unsubscribe from this list: send the line "unsubscribe backports" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux