aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2005-11-09 00:34:46 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-09 10:55:53 -0500
commit3f04e7ddf47a1c821dfaa886161d94774af583fa (patch)
treedbe112747d7096ae0b8cbe900e2d19529970001e
parentcecd1ca0cbd6fc5873e9bb110dacb8411be72928 (diff)
[PATCH] kconfig: Fix Kconfig performance bug
When doing its recursive dependency check, scripts/kconfig/conf uses the flag SYMBOL_CHECK_DONE to avoid rechecking a symbol it has already checked. However, that flag is only set at the top level, so if a symbol is first encountered as a dependency of another symbol it will be rechecked every time it is encountered until it's encountered at the top level. This patch adjusts the flag setting so that each symbol will only be checked once, regardless of whether it is first encountered at the top level, or while recursing down from another symbol. On complex configurations, this vastly speeds up scripts/kconfig/conf. The config in the powerpc merge tree is particularly bad: this patch reduces the time for 'scripts/kconfig/conf -o arch/powerpc/Kconfig' by a factor of 40 on a G5. That's even including the time to print the config, so the speedup in the actual checking is more likely 2 or 3 orders of magnitude. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Roman Zippel <zippel@linux-m68k.org> Cc: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--scripts/kconfig/expr.h1
-rw-r--r--scripts/kconfig/symbol.c11
-rw-r--r--scripts/kconfig/zconf.tab.c_shipped5
-rw-r--r--scripts/kconfig/zconf.y5
4 files changed, 10 insertions, 12 deletions
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index 7d39ff43e6e1..1b36ef18c48d 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -93,7 +93,6 @@ struct symbol {
93#define SYMBOL_NEW 0x0800 93#define SYMBOL_NEW 0x0800
94#define SYMBOL_AUTO 0x1000 94#define SYMBOL_AUTO 0x1000
95#define SYMBOL_CHECKED 0x2000 95#define SYMBOL_CHECKED 0x2000
96#define SYMBOL_CHECK_DONE 0x4000
97#define SYMBOL_WARNED 0x8000 96#define SYMBOL_WARNED 0x8000
98 97
99#define SYMBOL_MAXLENGTH 256 98#define SYMBOL_MAXLENGTH 256
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index affa52f5c651..10d96c4188dd 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -731,12 +731,12 @@ struct symbol *sym_check_deps(struct symbol *sym)
731 struct symbol *sym2; 731 struct symbol *sym2;
732 struct property *prop; 732 struct property *prop;
733 733
734 if (sym->flags & SYMBOL_CHECK_DONE)
735 return NULL;
736 if (sym->flags & SYMBOL_CHECK) { 734 if (sym->flags & SYMBOL_CHECK) {
737 printf("Warning! Found recursive dependency: %s", sym->name); 735 printf("Warning! Found recursive dependency: %s", sym->name);
738 return sym; 736 return sym;
739 } 737 }
738 if (sym->flags & SYMBOL_CHECKED)
739 return NULL;
740 740
741 sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); 741 sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
742 sym2 = sym_check_expr_deps(sym->rev_dep.expr); 742 sym2 = sym_check_expr_deps(sym->rev_dep.expr);
@@ -756,8 +756,13 @@ struct symbol *sym_check_deps(struct symbol *sym)
756 goto out; 756 goto out;
757 } 757 }
758out: 758out:
759 if (sym2) 759 if (sym2) {
760 printf(" %s", sym->name); 760 printf(" %s", sym->name);
761 if (sym2 == sym) {
762 printf("\n");
763 sym2 = NULL;
764 }
765 }
761 sym->flags &= ~SYMBOL_CHECK; 766 sym->flags &= ~SYMBOL_CHECK;
762 return sym2; 767 return sym2;
763} 768}
diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
index ff4fcc09720e..da12f7b33be3 100644
--- a/scripts/kconfig/zconf.tab.c_shipped
+++ b/scripts/kconfig/zconf.tab.c_shipped
@@ -1933,10 +1933,7 @@ void conf_parse(const char *name)
1933 exit(1); 1933 exit(1);
1934 menu_finalize(&rootmenu); 1934 menu_finalize(&rootmenu);
1935 for_all_symbols(i, sym) { 1935 for_all_symbols(i, sym) {
1936 if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) 1936 sym_check_deps(sym);
1937 printf("\n");
1938 else
1939 sym->flags |= SYMBOL_CHECK_DONE;
1940 } 1937 }
1941 1938
1942 sym_change_count = 1; 1939 sym_change_count = 1;
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index e1a0f455d4a8..1e214e9c1d31 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -495,10 +495,7 @@ void conf_parse(const char *name)
495 exit(1); 495 exit(1);
496 menu_finalize(&rootmenu); 496 menu_finalize(&rootmenu);
497 for_all_symbols(i, sym) { 497 for_all_symbols(i, sym) {
498 if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) 498 sym_check_deps(sym);
499 printf("\n");
500 else
501 sym->flags |= SYMBOL_CHECK_DONE;
502 } 499 }
503 500
504 sym_change_count = 1; 501 sym_change_count = 1;