diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2005-11-09 00:34:46 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-09 10:55:53 -0500 |
commit | 3f04e7ddf47a1c821dfaa886161d94774af583fa (patch) | |
tree | dbe112747d7096ae0b8cbe900e2d19529970001e /scripts/kconfig/symbol.c | |
parent | cecd1ca0cbd6fc5873e9bb110dacb8411be72928 (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>
Diffstat (limited to 'scripts/kconfig/symbol.c')
-rw-r--r-- | scripts/kconfig/symbol.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index affa52f5c65..10d96c4188d 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 | } |
758 | out: | 758 | out: |
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 | } |