* diet-kconfig: a script to trim unneeded kconfigs
@ 2008-09-16 23:55 Takashi Iwai
2008-09-18 14:01 ` Giacomo A. Catenazzi
2008-09-18 15:25 ` Mauro Carvalho Chehab
0 siblings, 2 replies; 23+ messages in thread
From: Takashi Iwai @ 2008-09-16 23:55 UTC (permalink / raw)
To: linux-kernel
Hi,
a topic that just came up in kernel summit is a script to remove
unneeded kernel configs automatically to reduce the compile time.
Incidentally, I already wrote such a script during the last SUSE hack
week a couple of weeks ago, so I'd like to share here, hopefully to
give an idea for further improvements.
The script checks the currently loaded modules and trims other
CONFIG_XXX=m simply, and tries make oldconfig, and writes out the
resultant .config in the current directory after some checks.
You can specify the config file via option, as default, it reads from
/proc/config.gz.
The script is VERY hackish. I should have begun with perl or whatever
better script language, but I chose bash and co. So, don't expect
much code quality. I'm no script guy after all :)
Takashi
---
#!/bin/sh
# this magic makes grep and co a lot faster
export LANG=C
kroot=
subarch=$(uname -i)
oldconfig=/proc/config.gz
localversion=
modulelist=
optimize_smp=
optimize_memory=
outputfile=
usage () {
cat <<EOF
diet-kconfig -- Trim down kernel configs of unused modules
Usage: diet-kconfig [-options]
Create a kernel config file based on the running system
option:
-r ROOT Specifies the linux-kernel root, default: current dir
-a ARCH Architecture (e.g. i386), default: running arch
-c FILE Old config file, default: /proc/config.gz)
-o FILE Output config file, default: kernel/.config
-l LIST Module list, default: read lsmod
-v VER Specifies the local version string, default: as is the original
-s Optimize SMP
-m Optimize memory model (for i386)
-h This help
EOF
exit 1
}
while getopts r:a:c:o:l:v:pmh opt; do
case "$opt" in
r)
kroot="$OPTARG"
;;
a)
subarch="$OPTARG"
;;
c)
oldconfig="$OPTARG"
if [ ! -f "$oldconfig" ]; then
echo "Cannot find old config $oldconfig"
exit 1
fi
;;
o)
outputfile="$OPTARG"
;;
l)
modulelist="$OPTARG"
if [ ! -f "$modulelist" ]; then
echo "Cannot find module list file modulelist"
exit 1
fi
;;
v)
localversion="-$OPTARG"
;;
s)
optimize_smp=y
;;
m)
optimize_memory=y
;;
h)
usage
;;
*)
echo "Invalid option $opt"
usage
;;
esac
done
if [ -z "$kroot" ]; then
kdir=.
else
kdir="$kroot"
fi
if [ ! -d "$kdir" -o ! -f "$kdir"/Makefile -o ! -f "$kdir"/MAINTAINERS ]; then
echo "Invalid kernel root directory $kdir"
exit 1
fi
case $subarch in
i?86|x86_64) arch=x86;;
*) arch=$subarch;;
esac
tmpd=$(mktemp -q -d /tmp/dietkconf.XXXXXX)
cleanup () {
rm -rf $tmpd
exit 1
}
trap cleanup 0
curdir=$(pwd)
test -n "$kroot" && cd $kroot
# create a list of Makefile's
find arch/$arch block crypto drivers fs ipc kernel lib mm net security sound virt \
-name 'Makefile' | xargs cat >> $tmpd/makefiles
# find configs to create the given module
find_kconfig () {
module=$1
modregex=$(echo $1 | sed -e's/_/[_-]/g')
grep -E '^[[:space:]]*obj-\$\([A-Za-z0-9_]*\)[[:space:]]*[+:]=.*[[:space:]]'"$modregex"'\.o' $tmpd/makefiles | \
sed -e's/^.*://g' -e's/^[[:space:]]*obj-\$(\(.*\)).*$/\1/g'
}
# set config no
kconfig_no () {
sed -i -e's/^\('$1'\)=.*/# \1 is not set/' $tmpd/kconfig
}
# set config yes
kconfig_yes () {
sed -i -e's/# '$1' .*/'$1'=y/' $tmpd/kconfig
}
# only previously selected modules with XXX marks
kconfig_mod () {
sed -i -e's/# '$1' XXX/'$1'=m/' $tmpd/kconfig
}
get_old_config () {
case "$oldconfig" in
*.gz)
zcat $oldconfig
;;
*)
cat $oldconfig
esac
}
list_modules () {
if [ -n "$modulelist" ]; then
awk '{if ($1 != "Module") {print $1}}' < $modulelist
else
lsmod | awk '{if ($1 != "Module") {print $1}}'
fi
}
# copy the original kconfigs; reset all modules, but remember they were
# enabled by marking XXX
get_old_config | sed -e's/^\(CONFIG.*\)=m/# \1 XXX/g' > $tmpd/kconfig
# optimize some stuff (if given)
if [ "$optimize_smp" = "y" ]; then
cpus=$(cat /proc/cpuinfo | grep -q -c 'processor[[:space:]]*:')
if [ "$cpus" = 1 ]; then
kconfig_no CONFIG_SMP
else
kconfig_yes CONFIG_SMP
fi
fi
if [ "$subarch" = "i386" ]; then
if [ "$optimize_memory" = "y" ]; then
mem=$(free | grep 'Mem:' | awk '{print $2}')
if [ $mem -gt 4194304 ]; then
kconfig_yes CONFIG_HIGHMEM64G
kconfig_no CONFIG_HIGHMEM4G
kconfig_no CONFIG_NOHIGHMEM
kconfig_yes CONFIG_X86_PAE
elif [ $mem -gt 1048576 ]; then
kconfig_no CONFIG_HIGHMEM64G
kconfig_yes CONFIG_HIGHMEM4G
kconfig_no CONFIG_NOHIGHMEM
kconfig_no CONFIG_X86_PAE
else
kconfig_no CONFIG_HIGHMEM64G
kconfig_no CONFIG_HIGHMEM4G
kconfig_yes CONFIG_NOHIGHMEM
kconfig_no CONFIG_X86_PAE
fi
fi
fi
# rewrite the local version
if [ -n "$localversion" ]; then
sed -i -e's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION="'$localversion'"/' $tmpd/kconfig
fi
# find kconfig for each module
rm -f $noconfigs $okconfigs
list_modules | while read m; do
echo -n "Checking module $m..."
cfgs=$(find_kconfig $m)
if [ -z "$cfgs" ]; then
echo -n "N/A"
echo $m >> $tmpd/conf-no
else
echo -n "$m" >> $tmpd/conf-ok
for c in $cfgs; do
echo -n " $c"
echo -n " $c" >> $tmpd/conf-ok
kconfig_mod $c
done
echo >> $tmpd/conf-ok
fi
echo
done
# if the previously =m doesn't enable any modules, it's a virtual one, which
# we should keep =m
for c in $(grep '^#.*XXX$' $tmpd/kconfig | sed -e's/^#.*\(CONFIG.*\) XXX/\1/g'); do
grep -q 'obj-\$('$c').*=.*\.o' $tmpd/makefiles || kconfig_mod $c
done
# replace XXX to standard
sed -i -e's/^\(#.*\) XXX/\1 is not set/g' $tmpd/kconfig
# reconfigure
echo "Reconfiguring via make silentconfig"
cd $curdir
cp $tmpd/kconfig .config
if [ -n "$kroot" ]; then
make_args="-C $kroot O=$curdir"
else
make_args=
fi
make $make_args silentoldconfig ARCH=$arch
if [ -n "$outputfile" ]; then
echo "Copying the result to $outputfile"
cp .config $outputfile
fi
echo
echo "*** FINISHED ***"
echo
if [ -s $tmpd/conf-no ]; then
echo "Modules not configured:"
cat $tmpd/conf-no
fi
if [ -s $tmpd/conf-ok ]; then
while read m cfgs; do
found=
for c in $cfgs; do
if grep -q $c=m .config; then
found=y
break
fi
done
if [ -z "$found" ]; then
echo "Not enabled: module $m with config $cfgs"
fi
done < $tmpd/conf-ok
fi
exit 0
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-16 23:55 diet-kconfig: a script to trim unneeded kconfigs Takashi Iwai
@ 2008-09-18 14:01 ` Giacomo A. Catenazzi
2008-09-18 20:09 ` Takashi Iwai
2008-09-18 15:25 ` Mauro Carvalho Chehab
1 sibling, 1 reply; 23+ messages in thread
From: Giacomo A. Catenazzi @ 2008-09-18 14:01 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-kernel
Takashi Iwai wrote:
> Hi,
>
> a topic that just came up in kernel summit is a script to remove
> unneeded kernel configs automatically to reduce the compile time.
> Incidentally, I already wrote such a script during the last SUSE hack
> week a couple of weeks ago, so I'd like to share here, hopefully to
> give an idea for further improvements.
>
> The script checks the currently loaded modules and trims other
> CONFIG_XXX=m simply, and tries make oldconfig, and writes out the
> resultant .config in the current directory after some checks.
> You can specify the config file via option, as default, it reads from
> /proc/config.gz.
>
> The script is VERY hackish. I should have begun with perl or whatever
> better script language, but I chose bash and co. So, don't expect
> much code quality. I'm no script guy after all :)
Check my AutoKernConf (http://cateee.net/autokernconf/), it has
huge (and automatically generated) database about drivers, modules,
and configuration, and it gives a minimal kernel configuration for the
most of the hardware hardware.
It needs a real maintainer and tools for non-hardware drivers
(fs, net, ...) and special hardware (CPU capabilities,
architecture specific drivers, etc).
>
>
> Takashi
> ---
>
> #!/bin/sh
>
> # this magic makes grep and co a lot faster
> export LANG=C
>
> kroot=
> subarch=$(uname -i)
-i is wrong (gives "unkwnown" on Debian).
Check the main Makefile how to extract the architecture from uname.
> c)
> oldconfig="$OPTARG"
> if [ ! -f "$oldconfig" ]; then
> echo "Cannot find old config $oldconfig"
> exit 1
> fi
Check also the config-* in /boot
> find_kconfig () {
> module=$1
> modregex=$(echo $1 | sed -e's/_/[_-]/g')
>
> grep -E '^[[:space:]]*obj-\$\([A-Za-z0-9_]*\)[[:space:]]*[+:]=.*[[:space:]]'"$modregex"'\.o' $tmpd/makefiles | \
> sed -e's/^.*://g' -e's/^[[:space:]]*obj-\$(\(.*\)).*$/\1/g'
> }
My python code works better (handle "alias", etc.).
Anyway I should send some cleanup patches to correct and
improve some ugly kernel Makefile.
ciao
cate
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-16 23:55 diet-kconfig: a script to trim unneeded kconfigs Takashi Iwai
2008-09-18 14:01 ` Giacomo A. Catenazzi
@ 2008-09-18 15:25 ` Mauro Carvalho Chehab
2008-09-18 15:43 ` Giacomo A. Catenazzi
2008-09-18 20:17 ` Takashi Iwai
1 sibling, 2 replies; 23+ messages in thread
From: Mauro Carvalho Chehab @ 2008-09-18 15:25 UTC (permalink / raw)
To: Takashi Iwai; +Cc: linux-kernel
Hi Takashi,
On Wed, 17 Sep 2008 01:55:26 +0200
Takashi Iwai <tiwai@suse.de> wrote:
> Hi,
>
> a topic that just came up in kernel summit is a script to remove
> unneeded kernel configs automatically to reduce the compile time.
> Incidentally, I already wrote such a script during the last SUSE hack
> week a couple of weeks ago, so I'd like to share here, hopefully to
> give an idea for further improvements.
>
> The script checks the currently loaded modules and trims other
> CONFIG_XXX=m simply, and tries make oldconfig, and writes out the
> resultant .config in the current directory after some checks.
> You can specify the config file via option, as default, it reads from
> /proc/config.gz.
I agree with Giacomo: you should also check for /boot/config-`uname -r`
and /boot/config-`uname -r`.gz.
Also, if the idea is to make life easier for kernel newbies, I think the better
would be to have the script called at kernel Makefile (something like "make
diet"), and having a few other config's available somewhere at kernel tree,
since even a "minimal" kernel may need (or not) a few random modules, like
usb-storage. So, I think we should open a dialog that allows the selection of
using the previous kernel config or selecting between a few profiles like
"minimalist" (just the auto-detected things), "desktop" (adding things like
usb-storage), "notebook" (with a power-saving optimized config),
"server" (adding stuff like LVM, RAID5 and some advanced network configs).
It seems a good idea to check at /proc/cpuinfo and optimize for that
specific processor, enabling SMP only if needed, and only for the number of
existing cores.
> The script is VERY hackish. I should have begun with perl or whatever
> better script language, but I chose bash and co. So, don't expect
> much code quality. I'm no script guy after all :)
Using just a shellscript and binutils seems to be better than using other
tools, since it allows the usage on minimal configured systems where the user
might not have perl or other scripting languages.
Cheers,
Mauro.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 15:25 ` Mauro Carvalho Chehab
@ 2008-09-18 15:43 ` Giacomo A. Catenazzi
2008-09-18 16:27 ` Mauro Carvalho Chehab
2008-09-18 20:20 ` Takashi Iwai
2008-09-18 20:17 ` Takashi Iwai
1 sibling, 2 replies; 23+ messages in thread
From: Giacomo A. Catenazzi @ 2008-09-18 15:43 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: Takashi Iwai, linux-kernel
Mauro Carvalho Chehab wrote:
> Hi Takashi,
>
> On Wed, 17 Sep 2008 01:55:26 +0200
> Takashi Iwai <tiwai@suse.de> wrote:
>> The script is VERY hackish. I should have begun with perl or whatever
>> better script language, but I chose bash and co. So, don't expect
>> much code quality. I'm no script guy after all :)
>
> Using just a shellscript and binutils seems to be better than using other
> tools, since it allows the usage on minimal configured systems where the user
> might not have perl or other scripting languages.
But very slow, complex and not enough powerful:
The tools should have extensive knowledge about Kconfig,
and the CONFIG_ dependencies; it should handle a lot of
structures (text/binary; line/record oriented; etc.), which
it is not easy in shell (awk, od, sed with extended regexp are
not core utilities).
So my suggestion is: do it in a high level language, to find and
stabilize the design, and then integrate it in kconfig later (using
C).
ciao
cate
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 15:43 ` Giacomo A. Catenazzi
@ 2008-09-18 16:27 ` Mauro Carvalho Chehab
2008-09-19 9:12 ` Giacomo A. Catenazzi
2008-09-18 20:20 ` Takashi Iwai
1 sibling, 1 reply; 23+ messages in thread
From: Mauro Carvalho Chehab @ 2008-09-18 16:27 UTC (permalink / raw)
To: Giacomo A. Catenazzi; +Cc: Takashi Iwai, linux-kernel
On Thu, 18 Sep 2008, Giacomo A. Catenazzi wrote:
> Mauro Carvalho Chehab wrote:
>> Hi Takashi,
>>
>> On Wed, 17 Sep 2008 01:55:26 +0200
>> Takashi Iwai <tiwai@suse.de> wrote:
>
>>> The script is VERY hackish. I should have begun with perl or whatever
>>> better script language, but I chose bash and co. So, don't expect
>>> much code quality. I'm no script guy after all :)
>>
>> Using just a shellscript and binutils seems to be better than using other
>> tools, since it allows the usage on minimal configured systems where the
>> user
>> might not have perl or other scripting languages.
>
> But very slow,
I don't think that performance is a big issue here. I tested Takashi
scripts on this old 1.5 GHz centrino one core notebook, and it runned in a
few seconds. Kernel compilation with diet config took 30-40 mins. The
additional time for the script didn't significantly increased the total
time.
> complex and not enough powerful:
For sure a scripting language like perl is more appropriate.
> The tools should have extensive knowledge about Kconfig,
> and the CONFIG_ dependencies
Since CONFIG_ and their dependencies are constantly
changing/adding/removing at kernel, the better would be to have a good
Kconfig parsing, avoiding to have lots of "local knowledge" about symbols.
The better model seems to be the one where subsystem maintainers don't
need to take extra care for not breaking the tool when touching at
Kconfig/Makefiles.
Also, it occured me that some drivers have "implicit" Kconfig dependencies
inside that may limit its work. Looking on a random driver, just as an
example, you have things like:
$ grep ifdef cpufreq_stats.c
cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
So, I suspect that the script might also need to parse the selected files
to seek for additional rules.
I'm not sure what to do after discovering such things: Assume the option
that generates smaller code? Assume the option that generates the most
complete code? Maybe the better would be to use the selected config
profile as a hint for such symbols. If not found there, then ask user.
> it should handle a lot of
> structures (text/binary; line/record oriented; etc.), which
> it is not easy in shell (awk, od, sed with extended regexp are
> not core utilities).
True.
> So my suggestion is: do it in a high level language, to find and
> stabilize the design, and then integrate it in kconfig later (using
> C).
Seems a good approach to me.
--
Cheers,
Mauro
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 14:01 ` Giacomo A. Catenazzi
@ 2008-09-18 20:09 ` Takashi Iwai
0 siblings, 0 replies; 23+ messages in thread
From: Takashi Iwai @ 2008-09-18 20:09 UTC (permalink / raw)
To: Giacomo A. Catenazzi; +Cc: linux-kernel
At Thu, 18 Sep 2008 16:01:50 +0200,
Giacomo A. Catenazzi wrote:
>
> Takashi Iwai wrote:
> > Hi,
> >
> > a topic that just came up in kernel summit is a script to remove
> > unneeded kernel configs automatically to reduce the compile time.
> > Incidentally, I already wrote such a script during the last SUSE hack
> > week a couple of weeks ago, so I'd like to share here, hopefully to
> > give an idea for further improvements.
> >
> > The script checks the currently loaded modules and trims other
> > CONFIG_XXX=m simply, and tries make oldconfig, and writes out the
> > resultant .config in the current directory after some checks.
> > You can specify the config file via option, as default, it reads from
> > /proc/config.gz.
> >
> > The script is VERY hackish. I should have begun with perl or whatever
> > better script language, but I chose bash and co. So, don't expect
> > much code quality. I'm no script guy after all :)
>
> Check my AutoKernConf (http://cateee.net/autokernconf/), it has
> huge (and automatically generated) database about drivers, modules,
> and configuration, and it gives a minimal kernel configuration for the
> most of the hardware hardware.
>
> It needs a real maintainer and tools for non-hardware drivers
> (fs, net, ...) and special hardware (CPU capabilities,
> architecture specific drivers, etc).
Thanks, this looks good. Nice to see other people already working
on a similar issue.
> > subarch=$(uname -i)
>
> -i is wrong (gives "unkwnown" on Debian).
> Check the main Makefile how to extract the architecture from uname.
Oh yeah, another hackish thing...
> > c)
> > oldconfig="$OPTARG"
> > if [ ! -f "$oldconfig" ]; then
> > echo "Cannot find old config $oldconfig"
> > exit 1
> > fi
>
> Check also the config-* in /boot
OK, such distro specific things have to be handled better. I didn't
know of /boot/config-* at all.
OTOH, if /proc/config.gz exists, it's the right place to see because
of an obvious reason. So, checking other paths should be a kind of
fallback.
> > find_kconfig () {
> > module=$1
> > modregex=$(echo $1 | sed -e's/_/[_-]/g')
> >
> > grep -E '^[[:space:]]*obj-\$\([A-Za-z0-9_]*\)[[:space:]]*[+:]=.*[[:space:]]'"$modregex"'\.o' $tmpd/makefiles | \
> > sed -e's/^.*://g' -e's/^[[:space:]]*obj-\$(\(.*\)).*$/\1/g'
> > }
>
> My python code works better (handle "alias", etc.).
We don't need to handle alias because the whole module names
come from lsmod output. That's so simple.
OTOH, I don't think the parsing in my script is perfect at all,
though. It's a result of one or two hours hack.
Improving that function a bit more robust would be pretty helpful.
Regarding the kernel config database: it's nice, indeed.
But, I don't think the whole database is required for the task I tried
to achieve. It wasn't intended to create a kernel config from
scratch. It's not necessarily the absolute minimum. Instead, it just
trims the unnecessary module builds. For that purpose, the database
is not needed by assumption of the all required modules have been
loaded. This is rather a safer option than creating a minimum kconfig
from scratch.
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 15:25 ` Mauro Carvalho Chehab
2008-09-18 15:43 ` Giacomo A. Catenazzi
@ 2008-09-18 20:17 ` Takashi Iwai
2008-09-18 21:09 ` Valdis.Kletnieks
1 sibling, 1 reply; 23+ messages in thread
From: Takashi Iwai @ 2008-09-18 20:17 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: linux-kernel
At Thu, 18 Sep 2008 12:25:41 -0300,
Mauro Carvalho Chehab wrote:
>
> Hi Takashi,
>
> On Wed, 17 Sep 2008 01:55:26 +0200
> Takashi Iwai <tiwai@suse.de> wrote:
>
> > Hi,
> >
> > a topic that just came up in kernel summit is a script to remove
> > unneeded kernel configs automatically to reduce the compile time.
> > Incidentally, I already wrote such a script during the last SUSE hack
> > week a couple of weeks ago, so I'd like to share here, hopefully to
> > give an idea for further improvements.
> >
> > The script checks the currently loaded modules and trims other
> > CONFIG_XXX=m simply, and tries make oldconfig, and writes out the
> > resultant .config in the current directory after some checks.
> > You can specify the config file via option, as default, it reads from
> > /proc/config.gz.
>
> I agree with Giacomo: you should also check for /boot/config-`uname -r`
> and /boot/config-`uname -r`.gz.
OK, I'll add the check of these as fallback.
Any known paths for other distros?
> Also, if the idea is to make life easier for kernel newbies, I think the better
> would be to have the script called at kernel Makefile (something like "make
> diet"), and having a few other config's available somewhere at kernel tree,
> since even a "minimal" kernel may need (or not) a few random modules, like
> usb-storage. So, I think we should open a dialog that allows the selection of
> using the previous kernel config or selecting between a few profiles like
> "minimalist" (just the auto-detected things), "desktop" (adding things like
> usb-storage), "notebook" (with a power-saving optimized config),
> "server" (adding stuff like LVM, RAID5 and some advanced network configs).
There are different perspectives for this. My goal to reduce the
build time with the existing kernel config for a specific hardware.
That is, it makes eaiser to create another set of kernel with test
patches or bisect.
OTOH, it would be definitely useful if we can create a clean minimum
kernel config from scratch based on the hardware information. For that,
the use-case specific configuration (or preset) would be good.
> > The script is VERY hackish. I should have begun with perl or whatever
> > better script language, but I chose bash and co. So, don't expect
> > much code quality. I'm no script guy after all :)
>
> Using just a shellscript and binutils seems to be better than using other
> tools, since it allows the usage on minimal configured systems where the user
> might not have perl or other scripting languages.
Well, perl or python is most likely installed on every modern system,
so I think we don't stick with bash & co. But, I see your point, and
it's also the reason I started with bash, etc.
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 15:43 ` Giacomo A. Catenazzi
2008-09-18 16:27 ` Mauro Carvalho Chehab
@ 2008-09-18 20:20 ` Takashi Iwai
1 sibling, 0 replies; 23+ messages in thread
From: Takashi Iwai @ 2008-09-18 20:20 UTC (permalink / raw)
To: Giacomo A. Catenazzi; +Cc: Mauro Carvalho Chehab, linux-kernel
At Thu, 18 Sep 2008 17:43:48 +0200,
Giacomo A. Catenazzi wrote:
>
> Mauro Carvalho Chehab wrote:
> > Hi Takashi,
> >
> > On Wed, 17 Sep 2008 01:55:26 +0200
> > Takashi Iwai <tiwai@suse.de> wrote:
>
> >> The script is VERY hackish. I should have begun with perl or whatever
> >> better script language, but I chose bash and co. So, don't expect
> >> much code quality. I'm no script guy after all :)
> >
> > Using just a shellscript and binutils seems to be better than using other
> > tools, since it allows the usage on minimal configured systems where the user
> > might not have perl or other scripting languages.
>
> But very slow, complex and not enough powerful:
> The tools should have extensive knowledge about Kconfig,
> and the CONFIG_ dependencies; it should handle a lot of
> structures (text/binary; line/record oriented; etc.), which
> it is not easy in shell (awk, od, sed with extended regexp are
> not core utilities).
It's not that slow.
> So my suggestion is: do it in a high level language, to find and
> stabilize the design, and then integrate it in kconfig later (using
> C).
Maybe a good idea to add such functionality into kbuild itself.
It's THE parser after all.
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 20:17 ` Takashi Iwai
@ 2008-09-18 21:09 ` Valdis.Kletnieks
2008-09-18 22:14 ` Takashi Iwai
0 siblings, 1 reply; 23+ messages in thread
From: Valdis.Kletnieks @ 2008-09-18 21:09 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Mauro Carvalho Chehab, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 1308 bytes --]
On Thu, 18 Sep 2008 22:17:22 +0200, Takashi Iwai said:
> There are different perspectives for this. My goal to reduce the
> build time with the existing kernel config for a specific hardware.
> That is, it makes eaiser to create another set of kernel with test
> patches or bisect.
One has to be careful here - I've more than once hit kernel bugs that I ended
up bisecting, which were dependent on the exact .config used. The most recent
was a deadlock during early boot if CONFIG_HID_COMPAT=y, which would have
been turned off by any sane kconfig trimmer. On the flip side, running a
trimmer wouldn't minimize my .config very much, because I've already set most
stuff I *never* use to 'n'.
And more than once, I've had a bisect go horribly awry and need to be re-started
because the bisect crossed back and forth over a commit that added a config
option, so doing a 'make oldconfig' at each iteration would re-prompt, and
I wasn't consistent in the reply I gave. Usually doesn't matter, except when
the broken code is in the support for the feature...
I *do* keep around a *very* minimal "only what I need to get to single-user"
config if build time is an issue...
Might be different if you're starting off with a distro config that's basically
an 'allmodconfig' - lotta fat to trim off *that*....
[-- Attachment #2: Type: application/pgp-signature, Size: 226 bytes --]
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 21:09 ` Valdis.Kletnieks
@ 2008-09-18 22:14 ` Takashi Iwai
0 siblings, 0 replies; 23+ messages in thread
From: Takashi Iwai @ 2008-09-18 22:14 UTC (permalink / raw)
To: Valdis.Kletnieks; +Cc: Mauro Carvalho Chehab, linux-kernel
At Thu, 18 Sep 2008 17:09:27 -0400,
Valdis.Kletnieks@vt.edu wrote:
>
> On Thu, 18 Sep 2008 22:17:22 +0200, Takashi Iwai said:
>
> > There are different perspectives for this. My goal to reduce the
> > build time with the existing kernel config for a specific hardware.
> > That is, it makes eaiser to create another set of kernel with test
> > patches or bisect.
>
> One has to be careful here - I've more than once hit kernel bugs that I ended
> up bisecting, which were dependent on the exact .config used.
That's true. But, you should at least test the trimmed kernel once
before bisecting to reproduce the bug.
And, my script doesn't do anything so intrusive. It trims just unused
CONFIG_*=m. Since they are not loaded anyway, reducing them must be
harmless (in theory).
> The most recent
> was a deadlock during early boot if CONFIG_HID_COMPAT=y, which would have
> been turned off by any sane kconfig trimmer. On the flip side, running a
> trimmer wouldn't minimize my .config very much, because I've already set most
> stuff I *never* use to 'n'.
Heh, you are obviously not a "typical" user ;)
My scenario was for users of distro kernel who want to help debugging
with some given patches or bisecting.
> And more than once, I've had a bisect go horribly awry and need to be re-started
> because the bisect crossed back and forth over a commit that added a config
> option, so doing a 'make oldconfig' at each iteration would re-prompt, and
> I wasn't consistent in the reply I gave. Usually doesn't matter, except when
> the broken code is in the support for the feature...
Bisect isn't perfect, indeed. But, in many cases, it can catch
the harmful commit more easily, especially if it's in the area
where you are unfamiliar.
> I *do* keep around a *very* minimal "only what I need to get to single-user"
> config if build time is an issue...
>
> Might be different if you're starting off with a distro config that's basically
> an 'allmodconfig' - lotta fat to trim off *that*....
Exactly.
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-18 16:27 ` Mauro Carvalho Chehab
@ 2008-09-19 9:12 ` Giacomo A. Catenazzi
2008-09-19 16:01 ` Takashi Iwai
0 siblings, 1 reply; 23+ messages in thread
From: Giacomo A. Catenazzi @ 2008-09-19 9:12 UTC (permalink / raw)
To: Mauro Carvalho Chehab; +Cc: Takashi Iwai, linux-kernel
Instead of replying all other emails, it is simpler to explain my
approach.
The purpose of my program is to find all CONFIG_s, which are needed to
support all the hardware (and some more), and to show them in
menuconfig. This is the main difference with Takashi purpose:
he wants to build a bootable (without initramfs) kernel, starting
to an high modular kernel (usually found in distribution),
so no usable on an already optimized machine.
Anyway there are a lot of overlapping tasks, which we could
exchange.
My design (files and sample output are in
http://cateee.net/sources/autokernconf/autokernconf-2008-08-29/ ):
kdetect.sh: detects hardwares, in a redundant manner, in order
to have data if there are missing one ore more between: /proc,
/sys, lspci, ...
autokernconf.sh: a shell script which read the driver database
(lkddb.list) and kdetect output; it generates the desired CONFIG_s.
So far, so simple, and similar to Takashi method. I only split
the task in two programs (detection and configuration).
The big difference is in the additional program, which generated the
driver database: it reads all sources, it checks 25 subsystems
(see http://cateee.net/lkddb/statistics.html ), taking in account
to preprocessors (#ifdef CONFIG_...), #defines, static strings, masks,
all architectures, etc.
Additionally it parse Makefile and Kconfig to find the dependencies
of every source file.
It misses some generic detection (CPU, memory), which Takashi is
doing, and the kconfig integration.
So I think most part could be integrated with the Takashi proposal, and
doing optionally the parsing of full driver database.
ciao
cate
Mauro Carvalho Chehab wrote:
> On Thu, 18 Sep 2008, Giacomo A. Catenazzi wrote:
>
>> The tools should have extensive knowledge about Kconfig,
>> and the CONFIG_ dependencies
>
> Since CONFIG_ and their dependencies are constantly
> changing/adding/removing at kernel, the better would be to have a good
> Kconfig parsing, avoiding to have lots of "local knowledge" about
> symbols. The better model seems to be the one where subsystem
> maintainers don't need to take extra care for not breaking the tool when
> touching at Kconfig/Makefiles.
>
> Also, it occured me that some drivers have "implicit" Kconfig
> dependencies inside that may limit its work. Looking on a random driver,
> just as an example, you have things like:
>
> $ grep ifdef cpufreq_stats.c
> cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
> cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
> cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
> cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
> cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
> cpufreq_stats.c:#ifdef CONFIG_CPU_FREQ_STAT_DETAILS
>
> So, I suspect that the script might also need to parse the selected
> files to seek for additional rules.
>
> I'm not sure what to do after discovering such things: Assume the option
> that generates smaller code? Assume the option that generates the most
> complete code? Maybe the better would be to use the selected config
> profile as a hint for such symbols. If not found there, then ask user.
>
>> it should handle a lot of
>> structures (text/binary; line/record oriented; etc.), which
>> it is not easy in shell (awk, od, sed with extended regexp are
>> not core utilities).
>
> True.
>
>> So my suggestion is: do it in a high level language, to find and
>> stabilize the design, and then integrate it in kconfig later (using
>> C).
>
> Seems a good approach to me.
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-19 9:12 ` Giacomo A. Catenazzi
@ 2008-09-19 16:01 ` Takashi Iwai
2008-09-19 23:55 ` Chris Li
0 siblings, 1 reply; 23+ messages in thread
From: Takashi Iwai @ 2008-09-19 16:01 UTC (permalink / raw)
To: Giacomo A. Catenazzi; +Cc: Mauro Carvalho Chehab, Steven Rostedt, linux-kernel
At Fri, 19 Sep 2008 11:12:34 +0200,
Giacomo A. Catenazzi wrote:
>
> Instead of replying all other emails, it is simpler to explain my
> approach.
>
> The purpose of my program is to find all CONFIG_s, which are needed to
> support all the hardware (and some more), and to show them in
> menuconfig. This is the main difference with Takashi purpose:
> he wants to build a bootable (without initramfs) kernel, starting
> to an high modular kernel (usually found in distribution),
> so no usable on an already optimized machine.
Yes. Your stuff would be actually helpful for people who want
a really slim kernel config.
> Anyway there are a lot of overlapping tasks, which we could
> exchange.
Right, for example, kconfig parser can be shared.
Mine is pretty simplistic, and very likely incomplete.
> My design (files and sample output are in
> http://cateee.net/sources/autokernconf/autokernconf-2008-08-29/ ):
>
> kdetect.sh: detects hardwares, in a redundant manner, in order
> to have data if there are missing one ore more between: /proc,
> /sys, lspci, ...
>
> autokernconf.sh: a shell script which read the driver database
> (lkddb.list) and kdetect output; it generates the desired CONFIG_s.
>
> So far, so simple, and similar to Takashi method. I only split
> the task in two programs (detection and configuration).
>
> The big difference is in the additional program, which generated the
> driver database: it reads all sources, it checks 25 subsystems
> (see http://cateee.net/lkddb/statistics.html ), taking in account
> to preprocessors (#ifdef CONFIG_...), #defines, static strings, masks,
> all architectures, etc.
> Additionally it parse Makefile and Kconfig to find the dependencies
> of every source file.
>
> It misses some generic detection (CPU, memory), which Takashi is
> doing, and the kconfig integration.
>
> So I think most part could be integrated with the Takashi proposal, and
> doing optionally the parsing of full driver database.
Agreed.
I think a good start would be to integrate a simple version of parser
and trim-down mechanism into the upstream kbuild system, so that you
can call such as "make diet", as Mauro mentioned.
BTW, Steve Rostedt told in the last night that he uses also his own
stuff for the same diet kconfig.
Steve, can we share your script, too?
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-19 16:01 ` Takashi Iwai
@ 2008-09-19 23:55 ` Chris Li
2008-09-19 23:57 ` Chris Li
2008-09-22 10:01 ` Takashi Iwai
0 siblings, 2 replies; 23+ messages in thread
From: Chris Li @ 2008-09-19 23:55 UTC (permalink / raw)
To: Takashi Iwai
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
On Fri, Sep 19, 2008 at 9:01 AM, Takashi Iwai <tiwai@suse.de> wrote:
> Yes. Your stuff would be actually helpful for people who want
> a really slim kernel config.
Incidentally, I wrote such a script as well. In 64 lines of python code.
I attach the script in question in the mail. I use a approach very
similar to yours. But I work around some of the nasty part.
It needs to start with kernel config has most of the modules enabled.
Most of the kernel config from the linux distribution is like that.
Then it try to parse the Kbuild looking for what kernel config produce
what module. It is not a 1 to 1 mapping.
Once we have the mapping. It open /proc/modules to go over every
module. Remove the config which can produce those module from the
mapping.
Now we have a blacklist of config produce modules but not the one we want.
Then the last stage is just open a config file and filter out the config
option on the blacklist. Write the result to a new config file.
I avoid arch/ and firmware/ because it is nasty. I figure module in
arch/ is small enough I don't mind building it. And the firmware directory,
if I don't build the module loads it. Those firmware will automatically skipped
any way.
The little tricky part is some thing like this:
========================
ifeq ($(CONFIG_BLK_DEV_CMD640), m)
obj-m += cmd640.o
endif
========================
Internally it get convert it into:
"obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o"
For easier parsing.
It is pretty fast as well. Less then a second if the file cache is
hot.
$ time minmod.py .config
reading Kbuild Makefile 593 files
acpi_cpufreq : Uknown module, may be firmware?
dcdbas : Uknown module, may be firmware?
1560 module option disabled
Writing new config to: .config.min
real 0m0.470s
user 0m0.303s
sys 0m0.075s
$
Chris
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-19 23:55 ` Chris Li
@ 2008-09-19 23:57 ` Chris Li
2008-09-22 10:01 ` Takashi Iwai
1 sibling, 0 replies; 23+ messages in thread
From: Chris Li @ 2008-09-19 23:57 UTC (permalink / raw)
To: Takashi Iwai
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 331 bytes --]
On Fri, Sep 19, 2008 at 4:55 PM, Chris Li <lkml@chrisli.org> wrote:
> Incidentally, I wrote such a script as well. In 64 lines of python code.
> I attach the script in question in the mail. I use a approach very
> similar to yours. But I work around some of the nasty part.
Oops, I forget to attach the script. Here it is.
Chris
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: minmod.py --]
[-- Type: text/x-python-script; name=minmod.py, Size: 1739 bytes --]
#!/usr/bin/python
import re
import os
class Kbuild:
def __init__(self, root):
self.root = root
self.confs = {} # dict of lists
self.modules = {}
self.read_kbuild()
def all_kbuild(self):
cmd = 'find . '\
' -regex "%s/[a-z].*/\\(Makefile\\|Kbuild\\)"' \
' -not -regex ".*/\(' \
'arch\|Documents\|firmware\|scripts\|raid6test\)/.*"' \
% self.root
return os.popen(cmd).read().split()
def read_kbuild(self):
allfile = [open(f).read() for f in self.all_kbuild()]
data = "\n".join(allfile)
data = re.sub(r"(?m)^ifeq\s+\(\$\((CONFIG_\S+)\s*\),\s*m\).*",
r"obj-$(\1) \\", data)
data = re.sub(r"(?m)\\\n\s*|obj-m ", '', data)
all = re.findall( r"(?m)obj-\$\((CONFIG_\S+)\)\s*[:+]=(.*)", data)
self.data = data
for (conf, modules) in all:
mods = re.findall(r"(\S+)\.o", modules)
for m in mods:
m = re.sub("-","_",m)
#print conf, "->", m
self.confs.setdefault(conf, []).append(m)
self.modules.setdefault(m, []).append(conf)
def read_modules(self):
data = open("/proc/modules").read()
return re.findall(r"(?m)^\S+", data)
def test_module(self, m):
all, conf = m.group(0,1)
if conf in self.confs:
return "# %s is not set"%conf
return all
def filter(self, config):
#print self.data
for m in self.read_modules():
if not self.modules.has_key(m):
print m,": Uknown module, may be firemware?"
continue
for c in self.modules[m]:
if c in self.confs:
del self.confs[c]
data = open(config).read()
data = re.sub(r"(?m)^(CONFIG_\S+)=m", self.test_module, data)
out = config + ".min"
print "Writing new config to:", out
open(out, "w").write(data)
def main():
kbuild = Kbuild(".")
kbuild.filter(".config")
main()
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-19 23:55 ` Chris Li
2008-09-19 23:57 ` Chris Li
@ 2008-09-22 10:01 ` Takashi Iwai
2008-09-22 13:39 ` Giacomo A. Catenazzi
2008-09-22 19:25 ` Chris Li
1 sibling, 2 replies; 23+ messages in thread
From: Takashi Iwai @ 2008-09-22 10:01 UTC (permalink / raw)
To: Chris Li
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
At Fri, 19 Sep 2008 16:55:51 -0700,
Chris Li wrote:
>
> On Fri, Sep 19, 2008 at 9:01 AM, Takashi Iwai <tiwai@suse.de> wrote:
> > Yes. Your stuff would be actually helpful for people who want
> > a really slim kernel config.
>
> Incidentally, I wrote such a script as well. In 64 lines of python code.
> I attach the script in question in the mail. I use a approach very
> similar to yours. But I work around some of the nasty part.
Thanks, I'll check yours too soon.
> It needs to start with kernel config has most of the modules enabled.
> Most of the kernel config from the linux distribution is like that.
> Then it try to parse the Kbuild looking for what kernel config produce
> what module. It is not a 1 to 1 mapping.
>
> Once we have the mapping. It open /proc/modules to go over every
> module. Remove the config which can produce those module from the
> mapping.
>
> Now we have a blacklist of config produce modules but not the one we want.
>
> Then the last stage is just open a config file and filter out the config
> option on the blacklist. Write the result to a new config file.
I think a whitelist would be useful, too, e.g. for hotplug devices
like usb.
> I avoid arch/ and firmware/ because it is nasty. I figure module in
> arch/ is small enough I don't mind building it. And the firmware directory,
> if I don't build the module loads it. Those firmware will automatically skipped
> any way.
Agreed.
> The little tricky part is some thing like this:
> ========================
> ifeq ($(CONFIG_BLK_DEV_CMD640), m)
> obj-m += cmd640.o
> endif
> ========================
> Internally it get convert it into:
> "obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o"
This should be fixed in Makefile.
Care to submit a patch?
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-22 10:01 ` Takashi Iwai
@ 2008-09-22 13:39 ` Giacomo A. Catenazzi
2008-09-22 15:41 ` Steven Rostedt
2008-09-22 19:25 ` Chris Li
1 sibling, 1 reply; 23+ messages in thread
From: Giacomo A. Catenazzi @ 2008-09-22 13:39 UTC (permalink / raw)
To: Takashi Iwai
Cc: Chris Li, Mauro Carvalho Chehab, Steven Rostedt, linux-kernel
Takashi Iwai wrote:
> At Fri, 19 Sep 2008 16:55:51 -0700,
> Chris Li wrote:
>
>> I avoid arch/ and firmware/ because it is nasty. I figure module in
>> arch/ is small enough I don't mind building it. And the firmware directory,
>> if I don't build the module loads it. Those firmware will automatically skipped
>> any way.
>
> Agreed.
>
>> The little tricky part is some thing like this:
>> ========================
>> ifeq ($(CONFIG_BLK_DEV_CMD640), m)
>> obj-m += cmd640.o
>> endif
>> ========================
>> Internally it get convert it into:
>> "obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o"
Are you sure?
I.e. if you set CONFIG_BLK_DEV_CMD640=y, you see that
the two constructs gives different results.
If the makefile author did such complex construct, I
really think there is a reason ;-)
ciao
cate
>
> This should be fixed in Makefile.
> Care to submit a patch?
>
>
> Takashi
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-22 13:39 ` Giacomo A. Catenazzi
@ 2008-09-22 15:41 ` Steven Rostedt
2008-09-22 15:50 ` Takashi Iwai
0 siblings, 1 reply; 23+ messages in thread
From: Steven Rostedt @ 2008-09-22 15:41 UTC (permalink / raw)
To: Giacomo A. Catenazzi
Cc: Takashi Iwai, Chris Li, Mauro Carvalho Chehab, linux-kernel
On Mon, 22 Sep 2008, Giacomo A. Catenazzi wrote:
> Takashi Iwai wrote:
> > At Fri, 19 Sep 2008 16:55:51 -0700,
> > Chris Li wrote:
> >
> > > I avoid arch/ and firmware/ because it is nasty. I figure module in
> > > arch/ is small enough I don't mind building it. And the firmware
> > > directory,
> > > if I don't build the module loads it. Those firmware will automatically
> > > skipped
> > > any way.
> >
> > Agreed.
> >
> > > The little tricky part is some thing like this:
> > > ========================
> > > ifeq ($(CONFIG_BLK_DEV_CMD640), m)
> > > obj-m += cmd640.o
> > > endif
> > > ========================
> > > Internally it get convert it into:
> > > "obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o"
>
> Are you sure?
> I.e. if you set CONFIG_BLK_DEV_CMD640=y, you see that
> the two constructs gives different results.
>
> If the makefile author did such complex construct, I
> really think there is a reason ;-)
>
Yes indeed, we should find out what the author meant.
ifeq ($(CONFIG_BLK_DEV_CMD640), m)
obj-m += cmd640.o
endif
and
obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o
mean two different things.
The former means to compile the cmd640 only if it is set to a module.
The later means to compile the cmd640 if it is either a module or built
into the core kernel code.
The author needs to make this change or explain why it is like this.
-- Steve
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-22 15:41 ` Steven Rostedt
@ 2008-09-22 15:50 ` Takashi Iwai
0 siblings, 0 replies; 23+ messages in thread
From: Takashi Iwai @ 2008-09-22 15:50 UTC (permalink / raw)
To: Steven Rostedt
Cc: Giacomo A. Catenazzi, Chris Li, Mauro Carvalho Chehab,
linux-kernel
At Mon, 22 Sep 2008 11:41:36 -0400 (EDT),
Steven Rostedt wrote:
>
>
>
> On Mon, 22 Sep 2008, Giacomo A. Catenazzi wrote:
> > Takashi Iwai wrote:
> > > At Fri, 19 Sep 2008 16:55:51 -0700,
> > > Chris Li wrote:
> > >
> > > > I avoid arch/ and firmware/ because it is nasty. I figure module in
> > > > arch/ is small enough I don't mind building it. And the firmware
> > > > directory,
> > > > if I don't build the module loads it. Those firmware will automatically
> > > > skipped
> > > > any way.
> > >
> > > Agreed.
> > >
> > > > The little tricky part is some thing like this:
> > > > ========================
> > > > ifeq ($(CONFIG_BLK_DEV_CMD640), m)
> > > > obj-m += cmd640.o
> > > > endif
> > > > ========================
> > > > Internally it get convert it into:
> > > > "obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o"
> >
> > Are you sure?
> > I.e. if you set CONFIG_BLK_DEV_CMD640=y, you see that
> > the two constructs gives different results.
> >
> > If the makefile author did such complex construct, I
> > really think there is a reason ;-)
> >
>
> Yes indeed, we should find out what the author meant.
>
> ifeq ($(CONFIG_BLK_DEV_CMD640), m)
> obj-m += cmd640.o
> endif
>
> and
>
> obj-$(CONFIG_BLK_DEV_CMD640) += cmd640.o
>
> mean two different things.
>
> The former means to compile the cmd640 only if it is set to a module.
> The later means to compile the cmd640 if it is either a module or built
> into the core kernel code.
FYI, in this particular case, cmd640.o is linked in the upper Makefile
for CONFIG_BLK_DEV_CMD640=y.
> The author needs to make this change or explain why it is like this.
Right. My guess is the link order, but still there must be a better
way to fix.
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-22 10:01 ` Takashi Iwai
2008-09-22 13:39 ` Giacomo A. Catenazzi
@ 2008-09-22 19:25 ` Chris Li
2008-09-23 11:31 ` Takashi Iwai
1 sibling, 1 reply; 23+ messages in thread
From: Chris Li @ 2008-09-22 19:25 UTC (permalink / raw)
To: Takashi Iwai
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
On Mon, Sep 22, 2008 at 3:01 AM, Takashi Iwai <tiwai@suse.de> wrote:
> I think a whitelist would be useful, too, e.g. for hotplug devices
> like usb.
The white list is marginally useful. But it is very complicate to do.
In order to preform white list. You have to know the dependency
of the module. e.g. You need to know exactly which options to
turn on so the modules will show up. The current dependency
analyze is the other way around. It knows which device should
show up when some config option is enabled. Answering the
question of which option should enable in order that device
show up is a much harder problem.
Also, as long as the user can get a boot able kernel out of
the minimal config. It is easy enough to recompile the kernel
with white list modules and install them as needed.
The white list should be a secondary step to do because
its complexity. The first priority is to have some thing simple
and provide a good minimal kernel module option. Then we
can go from there, how to add extra white list from it. The white
list is a very different game any way. I found the minimal config
option is a sweet spot to have in terms of feature and simplicity.
> This should be fixed in Makefile.
> Care to submit a patch?
Some module does not want to be compile as build-in.
Chris
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-22 19:25 ` Chris Li
@ 2008-09-23 11:31 ` Takashi Iwai
2008-09-23 18:15 ` Chris Li
0 siblings, 1 reply; 23+ messages in thread
From: Takashi Iwai @ 2008-09-23 11:31 UTC (permalink / raw)
To: Chris Li
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
At Mon, 22 Sep 2008 12:25:21 -0700,
Chris Li wrote:
>
> On Mon, Sep 22, 2008 at 3:01 AM, Takashi Iwai <tiwai@suse.de> wrote:
>
> > I think a whitelist would be useful, too, e.g. for hotplug devices
> > like usb.
>
> The white list is marginally useful. But it is very complicate to do.
> In order to preform white list. You have to know the dependency
> of the module. e.g. You need to know exactly which options to
> turn on so the modules will show up. The current dependency
> analyze is the other way around. It knows which device should
> show up when some config option is enabled. Answering the
> question of which option should enable in order that device
> show up is a much harder problem.
That is true. Enabling arbitrary kernel config item is hard to
achieve right now. I think this feature should be implemented in
kbuild parser itself. The current reverse-select is way limited and
known to be problematic in many kernel configs.
Anyway, I think the white list isn't that hard for certain use-cases.
My assumption is that users base on the distro kernel that have
already all modules. Then, for likely scenarios such as USB-storage
hotplug, we can simply provide possible modules such as usb-storage
and nls_* as the additional modules. The script would just need to
add them to the existing module list. If necessary, the module
dependency can be solved easily from modules.dep, too.
> Also, as long as the user can get a boot able kernel out of
> the minimal config. It is easy enough to recompile the kernel
> with white list modules and install them as needed.
I don't think choosing necessary kernel config is "easy enough". If
it were easy enough, we don't need such scripts at all. The problem
is that you must know exactly which config should be used for what
purpose. This is often a high hurdle.
> The white list should be a secondary step to do because
> its complexity. The first priority is to have some thing simple
> and provide a good minimal kernel module option. Then we
> can go from there, how to add extra white list from it. The white
> list is a very different game any way. I found the minimal config
> option is a sweet spot to have in terms of feature and simplicity.
I feel you goal is much farther than mine :)
The white list can be just a list of modules. If it doesn't work,
that's fine -- at least, we get the exactly same system like currently
running.
> > This should be fixed in Makefile.
> > Care to submit a patch?
>
> Some module does not want to be compile as build-in.
But not about this case. It wants to be compiled-in, too.
thanks,
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-23 11:31 ` Takashi Iwai
@ 2008-09-23 18:15 ` Chris Li
2008-09-23 18:50 ` Takashi Iwai
0 siblings, 1 reply; 23+ messages in thread
From: Chris Li @ 2008-09-23 18:15 UTC (permalink / raw)
To: Takashi Iwai
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
On Tue, Sep 23, 2008 at 4:31 AM, Takashi Iwai <tiwai@suse.de> wrote:
> That is true. Enabling arbitrary kernel config item is hard to
> achieve right now. I think this feature should be implemented in
> kbuild parser itself. The current reverse-select is way limited and
> known to be problematic in many kernel configs.
I was looking at the kbuild system. BTW, I really like the Makefile
in kbuild. For the reverse select, here is what I have in mind.
The reverse select needs to maintain the define-user chain for
each kernel option. And each kernel option has a list of the kernel
option and value pare to enable an option. Once we produce such
an list for "all config". We can know exactly what kernel option
needs to set in order to get to so module. It is kind of doing
the data flow analyze on the config options.
It is not trivial, but it shouldn't be too hard either.
> Anyway, I think the white list isn't that hard for certain use-cases.
> My assumption is that users base on the distro kernel that have
> already all modules. Then, for likely scenarios such as USB-storage
> hotplug, we can simply provide possible modules such as usb-storage
> and nls_* as the additional modules. The script would just need to
> add them to the existing module list. If necessary, the module
> dependency can be solved easily from modules.dep, too.
If you just want a white list without resolving the dependency, that
should be very easy to do in my current minmod.py.
In terms of implement in C. The currently kconf symbol has most
of the bits ready already. We can add a symbol type "module".
It points to a list of config symbols. That should be good enough.
Then we can use 1 bit of flag in config symbol to mark it is blacklisted
or not.
We can use some thing like minmod.py to provide a prototype
for some kernel user to try it out. If it covers most of the feature
the we want. We can go ahead to the C version.
> But not about this case. It wants to be compiled-in, too.
I think my script can catch those already. Maybe I will beat it
up to generate a list of similar configs using "obj-m" directly.
We can example them one by one.
Chris
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-23 18:15 ` Chris Li
@ 2008-09-23 18:50 ` Takashi Iwai
2008-09-23 19:40 ` Chris Li
0 siblings, 1 reply; 23+ messages in thread
From: Takashi Iwai @ 2008-09-23 18:50 UTC (permalink / raw)
To: Chris Li
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
At Tue, 23 Sep 2008 11:15:19 -0700,
Chris Li wrote:
>
> On Tue, Sep 23, 2008 at 4:31 AM, Takashi Iwai <tiwai@suse.de> wrote:
> > That is true. Enabling arbitrary kernel config item is hard to
> > achieve right now. I think this feature should be implemented in
> > kbuild parser itself. The current reverse-select is way limited and
> > known to be problematic in many kernel configs.
>
> I was looking at the kbuild system. BTW, I really like the Makefile
> in kbuild. For the reverse select, here is what I have in mind.
>
> The reverse select needs to maintain the define-user chain for
> each kernel option. And each kernel option has a list of the kernel
> option and value pare to enable an option. Once we produce such
> an list for "all config". We can know exactly what kernel option
> needs to set in order to get to so module. It is kind of doing
> the data flow analyze on the config options.
>
> It is not trivial, but it shouldn't be too hard either.
Well, it is not so easy, too.
The good-working reverse selection with dependency checks is a
feature we've long for in Kconfig, but it hasn't been implemented
because it could easily introduce a messy dependency loop, or some
cases are not easily resolvable.
Anyway, the development of reverse-selection should involve with Sam
and other Kbuild maintainer/developers.
Takashi
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: diet-kconfig: a script to trim unneeded kconfigs
2008-09-23 18:50 ` Takashi Iwai
@ 2008-09-23 19:40 ` Chris Li
0 siblings, 0 replies; 23+ messages in thread
From: Chris Li @ 2008-09-23 19:40 UTC (permalink / raw)
To: Takashi Iwai
Cc: Giacomo A. Catenazzi, Mauro Carvalho Chehab, Steven Rostedt,
linux-kernel
On Tue, Sep 23, 2008 at 11:50 AM, Takashi Iwai <tiwai@suse.de> wrote:
> Well, it is not so easy, too.
> The good-working reverse selection with dependency checks is a
> feature we've long for in Kconfig, but it hasn't been implemented
> because it could easily introduce a messy dependency loop, or some
> cases are not easily resolvable.
What I describe is a simpler version of that. The key difference is that,
I only work out the dependency base on a distro config file. So there
is only one set of config value to generate a module instead of many
combo in the more general case. I think that will cover 80 percent of
what user want. If you have a known all config file, the reverse selection
is easy resolvable.
>
> Anyway, the development of reverse-selection should involve with Sam
> and other Kbuild maintainer/developers.
Care to CC them? I think most likely you need to touch the current
kconf for "make diet" any way.
Thanks
Chris
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2008-09-23 19:40 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-16 23:55 diet-kconfig: a script to trim unneeded kconfigs Takashi Iwai
2008-09-18 14:01 ` Giacomo A. Catenazzi
2008-09-18 20:09 ` Takashi Iwai
2008-09-18 15:25 ` Mauro Carvalho Chehab
2008-09-18 15:43 ` Giacomo A. Catenazzi
2008-09-18 16:27 ` Mauro Carvalho Chehab
2008-09-19 9:12 ` Giacomo A. Catenazzi
2008-09-19 16:01 ` Takashi Iwai
2008-09-19 23:55 ` Chris Li
2008-09-19 23:57 ` Chris Li
2008-09-22 10:01 ` Takashi Iwai
2008-09-22 13:39 ` Giacomo A. Catenazzi
2008-09-22 15:41 ` Steven Rostedt
2008-09-22 15:50 ` Takashi Iwai
2008-09-22 19:25 ` Chris Li
2008-09-23 11:31 ` Takashi Iwai
2008-09-23 18:15 ` Chris Li
2008-09-23 18:50 ` Takashi Iwai
2008-09-23 19:40 ` Chris Li
2008-09-18 20:20 ` Takashi Iwai
2008-09-18 20:17 ` Takashi Iwai
2008-09-18 21:09 ` Valdis.Kletnieks
2008-09-18 22:14 ` Takashi Iwai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox