aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kconfig
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2012-06-18 22:22:33 -0400
committerSteven Rostedt <rostedt@goodmis.org>2012-06-19 15:03:06 -0400
commitd4bb58b5cb3b6fbf89d0012c199be3954cba9fb3 (patch)
tree8c2b79d36581920d30fdd112eff423ffaf957797 /scripts/kconfig
parent4f4c51c9405a509e9073ff242746e9049c723aae (diff)
localmodconfig: Check if configs are already set for selects
There are some cases that a required module does not have a prompt and needs to have another module enabled that selects it to be set. As localmodconfig is conservative and tries to make the minimum config without breaking the user's kernel, or keeping the user from using devices that were loaded when the lsmod was done, all modules that select this module will also be enabled. If you needed module A, but module A did not have a prompt but needed module B to be selected, localmodconfig would make sure B was still enabled. If not only B selected A, but C, D, E, F, and G also selected A, then all of those would also be included, as well as the modules they depend on. This ballooned the number of configs that localmodconfig would keep. The fix here is to process the depends first, and then record those configs that did not have a prompt and needed to be selected. After the depends are done, check what configs are needed to select the configs in the list, and if a config that selects it is already set, then we don't need to do anything else. If no config that selects the config is set, then just pick one and try again. This change brought down the number of selected modules from 290 to 67! Both before and after were run against a config that had 3095 modules enabled. Tested-by: John David Yost <johnyost@ptd.net> # AlleyTrotter Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'scripts/kconfig')
-rw-r--r--scripts/kconfig/streamline_config.pl115
1 files changed, 104 insertions, 11 deletions
diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl
index ab4985f7af79..fcfcb302b0d7 100644
--- a/scripts/kconfig/streamline_config.pl
+++ b/scripts/kconfig/streamline_config.pl
@@ -420,7 +420,7 @@ my $repeat = 1;
420# to keep on. If A was on in the original config, B would not have been 420# to keep on. If A was on in the original config, B would not have been
421# and B would not be turned on by this script. 421# and B would not be turned on by this script.
422# 422#
423sub parse_config_dep_select 423sub parse_config_depends
424{ 424{
425 my ($p) = @_; 425 my ($p) = @_;
426 426
@@ -448,26 +448,119 @@ sub parse_config_dep_select
448 } 448 }
449} 449}
450 450
451while ($repeat) { 451# Select is treated a bit differently than depends. We call this
452 $repeat = 0; 452# when a config has no prompt and requires another config to be
453# selected. We use to just select all configs that selected this
454# config, but found that that can balloon into enabling hundreds
455# of configs that we do not care about.
456#
457# The idea is we look at all the configs that select it. If one
458# is already in our list of configs to enable, then there's nothing
459# else to do. If there isn't, we pick the first config that was
460# enabled in the orignal config and use that.
461sub parse_config_selects
462{
463 my ($config, $p) = @_;
453 464
454 foreach my $config (keys %configs) { 465 my $next_config;
455 $config =~ s/^CONFIG_//; 466
467 while ($p =~ /[$valid]/) {
468
469 if ($p =~ /^[^$valid]*([$valid]+)/) {
470 my $conf = "CONFIG_" . $1;
471
472 $p =~ s/^[^$valid]*[$valid]+//;
456 473
457 if (defined($depends{$config})) { 474 # Make sure that this config exists in the current .config file
458 # This config has dependencies. Make sure they are also included 475 if (!defined($orig_configs{$conf})) {
459 parse_config_dep_select $depends{$config}; 476 next;
477 }
478
479 # Check if something other than a module selects this config
480 if (defined($orig_configs{$conf}) && $orig_configs{$conf} ne "m") {
481 # we are good with this
482 return;
483 }
484 if (defined($configs{$conf})) {
485 # A set config selects this config, we are good
486 return;
487 }
488 # Set this config to be selected
489 if (!defined($next_config)) {
490 $next_config = $conf;
491 }
492 } else {
493 die "this should never happen";
460 } 494 }
495 }
461 496
462 if (defined($prompts{$config}) || !defined($selects{$config})) { 497 # If no possible config selected this, then something happened.
463 next; 498 if (!defined($next_config)) {
499 print STDERR "WARNING: $config is required, but nothing in the\n";
500 print STDERR " current config selects it.\n";
501 return;
502 }
503
504 # If we are here, then we found no config that is set and
505 # selects this config. Repeat.
506 $repeat = 1;
507 # Make this config need to be selected
508 $configs{$next_config} = 1;
509}
510
511my %process_selects;
512
513# loop through all configs, select their dependencies.
514sub loop_depend {
515 $repeat = 1;
516
517 while ($repeat) {
518 $repeat = 0;
519
520 forloop:
521 foreach my $config (keys %configs) {
522
523 # If this config is not a module, we do not need to process it
524 if (defined($orig_configs{$config}) && $orig_configs{$config} ne "m") {
525 next forloop;
526 }
527
528 $config =~ s/^CONFIG_//;
529
530 if (defined($depends{$config})) {
531 # This config has dependencies. Make sure they are also included
532 parse_config_depends $depends{$config};
533 }
534
535 # If the config has no prompt, then we need to check if a config
536 # that is enabled selected it. Or if we need to enable one.
537 if (!defined($prompts{$config}) && defined($selects{$config})) {
538 $process_selects{$config} = 1;
539 }
464 } 540 }
541 }
542}
543
544sub loop_select {
545
546 foreach my $config (keys %process_selects) {
547 $config =~ s/^CONFIG_//;
465 548
466 # config has no prompt and must be selected. 549 # config has no prompt and must be selected.
467 parse_config_dep_select $selects{$config}; 550 parse_config_selects $config, $selects{$config};
468 } 551 }
469} 552}
470 553
554while ($repeat) {
555 # Get the first set of configs and their dependencies.
556 loop_depend;
557
558 $repeat = 0;
559
560 # Now we need to see if we have to check selects;
561 loop_select;
562}
563
471my %setconfigs; 564my %setconfigs;
472 565
473# Finally, read the .config file and turn off any module enabled that 566# Finally, read the .config file and turn off any module enabled that