From fe1484f3db0c7fe7fe8e6d5cc1e6e4d8f0b17052 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Wed, 6 Jun 2012 18:20:35 +0200 Subject: [PATCH] modules are now only handled with /sys/modules and modules.dep No more "find" and /proc/modules checking. We now rely entirely on depmod and modules.dep --- TODO | 3 +- dracut-functions.sh | 56 +++++++----------------------- dracut.sh | 5 +++ modules.d/50plymouth/module-setup.sh | 62 +++++++++++++++++++++++++--------- 4 files changed, 65 insertions(+), 61 deletions(-) diff --git a/TODO b/TODO index acbb0a2..095ec97 100644 --- a/TODO +++ b/TODO @@ -17,7 +17,8 @@ INITRAMFS TODO GENERATOR TODO -- remove /proc/modules use /sys/module +- add interpreter/plugin-scripts to be sourced at the beginning or end (can use dracut-functions) +- provide "installkernel" and "new-kernel-pkg" - add mechanism for module specific command line options - pkg-config integration, to make it easy for other packages to use us. - add recovery image creator (mkrecovery) diff --git a/dracut-functions.sh b/dracut-functions.sh index 8aba88d..6a72fce 100755 --- a/dracut-functions.sh +++ b/dracut-functions.sh @@ -1053,7 +1053,7 @@ install_kmod_with_fw() { fi done if [[ $_found != yes ]]; then - if ! grep -qe "\<${_modname//-/_}\>" /proc/modules; then + if ! [[ -d $(echo /sys/module/${_modname//-/_}|{ read a b; echo $a; }) ]]; then dinfo "Possible missing firmware \"${_fw}\" for kernel module" \ "\"${_modname}.ko\"" else @@ -1086,54 +1086,21 @@ for_each_kmod_dep() { ) } -# filter kernel modules to install certain modules that meet specific -# requirements. -# $1 = search only in subdirectory of /kernel/$1 -# $2 = function to call with module name to filter. -# This function will be passed the full path to the module to test. -# The behaviour of this function can vary depending on whether $hostonly is set. -# If it is, we will only look at modules that are already in memory. -# If it is not, we will look at all kernel modules -# This function returns the full filenames of modules that match $1 -filter_kernel_modules_by_path () ( - local _modname _filtercmd - if ! [[ $hostonly ]]; then - _filtercmd='find "$srcmods/kernel/$1" "$srcmods/extra"' - _filtercmd+=' "$srcmods/weak-updates" -name "*.ko" -o -name "*.ko.gz"' - _filtercmd+=' -o -name "*.ko.xz"' - _filtercmd+=' 2>/dev/null' - else - _filtercmd='cut -d " " -f 1 $initdir/$$.ko - $2 $initdir/$$.ko && echo "$_modname" - rm -f $initdir/$$.ko - ;; - *.ko.xz) xz -dc "$_modname" > $initdir/$$.ko - $2 $initdir/$$.ko && echo "$_modname" - rm -f $initdir/$$.ko - ;; - esac - done -) + find_kernel_modules_by_path () ( if ! [[ $hostonly ]]; then - find "$srcmods/kernel/$1" "$srcmods/extra" "$srcmods/weak-updates" \ - -name "*.ko" -o -name "*.ko.gz" -o -name "*.ko.xz" 2>/dev/null + while read a rest; do + if [[ "${a##kernel}" != "$a" ]]; then + [[ "${a##kernel/$1}" != "$a" ]] || continue + fi + echo $srcmods/${a%:} + done < $srcmods/modules.dep else - cut -d " " -f 1 /dev/null fi ) -filter_kernel_modules () { - filter_kernel_modules_by_path drivers "$1" -} - find_kernel_modules () { find_kernel_modules_by_path drivers } @@ -1180,8 +1147,9 @@ instmods() { fi # If we are building a host-specific initramfs and this # module is not already loaded, move on to the next one. - [[ $hostonly ]] && ! grep -qe "\<${_mod//-/_}\>" /proc/modules \ - && ! echo $add_drivers | grep -qe "\<${_mod}\>" \ + [[ $hostonly ]] \ + && ! [[ -d $(echo /sys/module/${_mod//-/_}|{ read a b; echo $a; }) ]] \ + && ! [[ "$add_drivers" =~ " ${_mod} " ]] \ && return # We use '-d' option in modprobe only if modules prefix path diff --git a/dracut.sh b/dracut.sh index 49ea503..78e7ac8 100755 --- a/dracut.sh +++ b/dracut.sh @@ -555,6 +555,11 @@ srcmods="/lib/modules/$kernel/" } export srcmods +[[ -f $srcmods/modules.dep ]] || { + dfatal "$srcmods/modules.dep is missing. Did you run depmod?" + exit 1 +} + if [[ -f $outfile && ! $force ]]; then dfatal "Will not override existing initramfs ($outfile) without --force" exit 1 diff --git a/modules.d/50plymouth/module-setup.sh b/modules.d/50plymouth/module-setup.sh index 8a675ec..69f1bc7 100755 --- a/modules.d/50plymouth/module-setup.sh +++ b/modules.d/50plymouth/module-setup.sh @@ -14,23 +14,53 @@ depends() { installkernel() { local _modname # Include KMS capable drm drivers - for _modname in $(find "$srcmods/kernel/drivers/gpu/drm" "$srcmods/extra" \( -name '*.ko' -o -name '*.ko.gz' -o -name '*.ko.xz' \) 2>/dev/null); do - case $_modname in - *.ko) grep -q drm_crtc_init $_modname ;; - *.ko.gz) zgrep -q drm_crtc_init $_modname ;; - *.ko.xz) xzgrep -q drm_crtc_init $_modname ;; - esac - if test $? -eq 0; then - # if the hardware is present, include module even if it is not currently loaded, - # as we could e.g. be in the installer; nokmsboot boot parameter will disable - # loading of the driver if needed - if [[ $hostonly ]] && modinfo -F alias $_modname | sed -e 's,\?,\.,g' -e 's,\*,\.\*,g' \ - | grep -qxf - /sys/bus/pci/devices/*/modalias; then - hostonly='' instmods $_modname - continue - fi - instmods $_modname + + drm_module_filter() { + local _drm_drivers='drm_crtc_init' + local _ret + # subfunctions inherit following FDs + local _merge=8 _side2=9 + function nmf1() { + local _fname _fcont + while read _fname; do + case "$_fname" in + *.ko) _fcont="$(< $_fname)" ;; + *.ko.gz) _fcont="$(gzip -dc $_fname)" ;; + *.ko.xz) _fcont="$(xz -dc $_fname)" ;; + esac + [[ $_fcont =~ $_drm_drivers + && ! $_fcont =~ iw_handler_get_spy ]] \ + && echo "$_fname" + done + } + function rotor() { + local _f1 _f2 + while read _f1; do + echo "$_f1" + if read _f2; then + echo "$_f2" 1>&${_side2} + fi + done | nmf1 1>&${_merge} + } + # Use two parallel streams to filter alternating modules. + set +x + eval "( ( rotor ) ${_side2}>&1 | nmf1 ) ${_merge}>&1" + _ret=$? + [[ $debug ]] && set -x + return $_ret + } + + for _modname in $(find_kernel_modules_by_path drivers/gpu/drm \ + | drm_module_filter) ; do + # if the hardware is present, include module even if it is not currently loaded, + # as we could e.g. be in the installer; nokmsboot boot parameter will disable + # loading of the driver if needed + if [[ $hostonly ]] && modinfo -F alias $_modname | sed -e 's,\?,\.,g' -e 's,\*,\.\*,g' \ + | grep -qxf - /sys/bus/pci/devices/*/modalias; then + hostonly='' instmods $_modname + continue fi + instmods $_modname done }