Skip to content

Commit

Permalink
[PATCH] kconfig: Fix Kconfig performance bug
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Gibson authored and Linus Torvalds committed Nov 9, 2005
1 parent cecd1ca commit 3f04e7d
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 12 deletions.
1 change: 0 additions & 1 deletion scripts/kconfig/expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ struct symbol {
#define SYMBOL_NEW 0x0800
#define SYMBOL_AUTO 0x1000
#define SYMBOL_CHECKED 0x2000
#define SYMBOL_CHECK_DONE 0x4000
#define SYMBOL_WARNED 0x8000

#define SYMBOL_MAXLENGTH 256
Expand Down
11 changes: 8 additions & 3 deletions scripts/kconfig/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -731,12 +731,12 @@ struct symbol *sym_check_deps(struct symbol *sym)
struct symbol *sym2;
struct property *prop;

if (sym->flags & SYMBOL_CHECK_DONE)
return NULL;
if (sym->flags & SYMBOL_CHECK) {
printf("Warning! Found recursive dependency: %s", sym->name);
return sym;
}
if (sym->flags & SYMBOL_CHECKED)
return NULL;

sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
sym2 = sym_check_expr_deps(sym->rev_dep.expr);
Expand All @@ -756,8 +756,13 @@ struct symbol *sym_check_deps(struct symbol *sym)
goto out;
}
out:
if (sym2)
if (sym2) {
printf(" %s", sym->name);
if (sym2 == sym) {
printf("\n");
sym2 = NULL;
}
}
sym->flags &= ~SYMBOL_CHECK;
return sym2;
}
Expand Down
5 changes: 1 addition & 4 deletions scripts/kconfig/zconf.tab.c_shipped
Original file line number Diff line number Diff line change
Expand Up @@ -1933,10 +1933,7 @@ void conf_parse(const char *name)
exit(1);
menu_finalize(&rootmenu);
for_all_symbols(i, sym) {
if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
printf("\n");
else
sym->flags |= SYMBOL_CHECK_DONE;
sym_check_deps(sym);
}

sym_change_count = 1;
Expand Down
5 changes: 1 addition & 4 deletions scripts/kconfig/zconf.y
Original file line number Diff line number Diff line change
Expand Up @@ -495,10 +495,7 @@ void conf_parse(const char *name)
exit(1);
menu_finalize(&rootmenu);
for_all_symbols(i, sym) {
if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
printf("\n");
else
sym->flags |= SYMBOL_CHECK_DONE;
sym_check_deps(sym);
}

sym_change_count = 1;
Expand Down

0 comments on commit 3f04e7d

Please sign in to comment.