diff options
Diffstat (limited to 'kernel/modules.pl')
| -rw-r--r-- | kernel/modules.pl | 133 |
1 files changed, 85 insertions, 48 deletions
diff --git a/kernel/modules.pl b/kernel/modules.pl index b64c92fa2..a36d1fa1e 100644 --- a/kernel/modules.pl +++ b/kernel/modules.pl @@ -41,42 +41,33 @@ sub modules() { @nls_modules, map { category2modules($_) } split(' ', $images_cat); } -sub get_firmwares() { +sub list_needed_modules { my ($kern_ver) = @_; - foreach (all("all.kernels/$kern_ver/modules")) { - foreach(`/sbin/modinfo -Ffirmware "all.kernels/$kern_ver/modules/$_"`) { - mkdir_p(dirname("all.kernels/$kern_ver/firmware/$_")); - eval { cp_af("/lib/firmware/$_", "all.kernels/$kern_ver/firmware/$_"); }; - } - } -} - -sub remove_unneeded_modules { - my ($kern_ver) = @_; - - load_dependencies("all.kernels/$kern_ver/modules.dep"); + load_dependencies("/lib/modules/$kern_ver/modules.dep"); my @all = modules(); my @all_with_deps = map { dependencies_closure($_) } @all; - my %wanted_modules = map { (list_modules::modname2filename($_) . ".ko.xz" => 1) } @all_with_deps; - foreach (all("all.kernels/$kern_ver/modules")) { - $wanted_modules{$_} or unlink "all.kernels/$kern_ver/modules/$_"; + my %wanted_modules = map { (list_modules::modname2filename($_) => 1) } @all_with_deps; + foreach (`find /lib/modules/$kern_ver -name '*.ko.?z'`) { + my $modfile = basename($_); + $modfile =~ s/\.ko\.xz//; + $wanted_modules{$modfile} and print "$modfile\n"; } } -sub make_modules_per_image { +sub list_fake_modules { my ($kern_ver) = @_; - my $dir = "all.kernels/$kern_ver/modules"; - - system("cd $dir ; tar cf ../all_modules.tar *.ko.*") == 0 or die "tar failed\n"; -} + load_dependencies("/lib/modules/$kern_ver/modules.dep"); -sub get_main_modules() { - my $base = dirname($0); - my $main = chomp_(cat_("$base/RPMS/.main")); - chomp_(`tar tf $base/all.kernels/$main/all_modules.tar`); + my @all = map { category2modules($_) } split(' ', 'multimedia/*'); + my %wanted_modules = map { (list_modules::modname2filename($_) => 1) } @all; + foreach (`find /lib/modules/$kern_ver -name '*.ko.?z'`) { + my $modfile = basename($_); + $modfile =~ s/\.ko\.xz//; + $wanted_modules{$modfile} and print "$modfile\n"; + } } sub pci_modules4stage1 { @@ -85,7 +76,29 @@ sub pci_modules4stage1 { print "$_\n" foreach uniq(map { dependencies_closure($_) } @modules); } +sub get_kernel_modules { + my ($kern_ver) = @_; + + my @module_list; + foreach (sort(cat_("/lib/modules/$kern_ver/modules.dep"))) { + my ($module, $discard) = split(':', $_); + push @module_list, $module; + } + foreach (sort(cat_("/lib/modules/$kern_ver/modules.builtin"))) { + my ($module, $discard) = split(':', $_); + push @module_list, $module; + } + @module_list; +} + sub check() { + my ($kern_ver) = @_; + + if (!$kern_ver) { + $kern_ver = `uname -r`; + chomp($kern_ver); + } + my $error; my %listed; while (my ($t1, $l) = each %list_modules::l) { @@ -100,25 +113,21 @@ sub check() { my %module2category; my %deprecated_modules = %listed; my $not_listed = sub { - my ($msg, $verbose, @l) = @_; - my %not_listed; - foreach (@l) { - my ($mod) = m|([^/]*)\.k?o(\.gz)?$| or next; - delete $deprecated_modules{$mod}; - next if $listed{$mod}; - s|.*?mdk/||; - s|kernel/||; s|drivers/||; s|3rdparty/||; - $_ = dirname $_; - $_ = dirname $_ if $mod eq basename($_); - $module2category{$mod} = $_; - push @{$not_listed{$_}}, $mod; - } - if ($verbose) { - print "$msg $_: ", join(" ", @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; - } + my %not_listed; + foreach (@_) { + my $path = dirname($_); + my $name = basename($_); + $name =~ s/\.ko(\.xz)?$//; + delete $deprecated_modules{$name}; + next if $listed{$name}; + $module2category{list_modules::filename2modname($name)} = $path; + push @{$not_listed{$path}}, $name; + } + if ($verbose) { + print "NOT LISTED $_: ", join(" ", @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + } }; - $not_listed->('NOT LISTED', 1, get_main_modules()); - $not_listed->('not listed', $verbose, chomp_(`rpm -qpl RPMS/kernel-*2.6*`)); + $not_listed->(get_kernel_modules($kern_ver)); if (%deprecated_modules) { my %per_cat; push @{$per_cat{$listed{$_}}}, $_ foreach keys %deprecated_modules; @@ -132,24 +141,52 @@ sub check() { my $pcitable = read_pcitable("/usr/share/ldetect-lst/pcitable"); my $usbtable = read_pcitable("/usr/share/ldetect-lst/usbtable"); + my @l0 = map { list_modules::filename2modname($_) } keys %listed; + my @l1 = uniq grep { !/:/ && $_ ne 'unknown' } map { $_->[0] } values %$pcitable; - if (my @l = difference2(\@l1, [ keys %listed ])) { + if (my @l = difference2(\@l1, \@l0)) { my %not_listed; push @{$not_listed{$module2category{$_}}}, $_ foreach @l; if (my $l = delete $not_listed{''}) { print "bad/old pcitable modules : ", join(" ", @$l), "\n"; } - print STDERR "PCITABLE MODULES NOT LISTED $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; - #$error = 1; + print STDERR "pcitable modules not listed in $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + print STDERR "note: pcitable module names need to be mapped to file names when updating list_modules.pm\n" if %not_listed; + $error = 1; } my @l2 = uniq grep { !/:/ && $_ ne 'unknown' } map { $_->[0] } values %$usbtable; - if (my @l = difference2(\@l2, [ keys %listed ])) { + if (my @l = difference2(\@l2, \@l0)) { my %not_listed; push @{$not_listed{$module2category{$_}}}, $_ foreach @l; - print STDERR "usbtable modules not listed $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + if (my $l = delete $not_listed{''}) { + print "bad/old usbtable modules : ", join(" ", @$l), "\n"; + } + print STDERR "usbtable modules not listed in $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + print STDERR "note: usbtable module names need to be mapped to file names when updating list_modules.pm\n" if %not_listed; + $error = 1; } } exit $error; } + +sub list_additional_firmware { + my ($kern_ver) = @_; + + # The firmware reported by 'modinfo iwlwifi' is the latest supported version of each firmware + # type. Sometimes the latest supported version is not available, and the driver falls back to + # an older version. This means dracut doesn't automatically identify and include the necessary + # firmware files, so we need to list them here (mga#9541). + foreach (map { /^firmware:\s+(.*)/ ? $1 : () } split("\n", `modinfo -k $kern_ver iwlwifi`)) { + next if -f "/lib/firmware/$_"; + my ($basename, $version) = /(.*)-([0-9]+).ucode/; + while ($version-- > 0) { + my $filepath = "/lib/firmware/$basename-$version.ucode"; + if (-f $filepath) { + print "$filepath\n"; + last; + } + } + } +} |
