kconfig: Add yes2modconfig and mod2yesconfig targets.
authorTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Tue, 17 Dec 2019 09:42:06 +0000 (18:42 +0900)
committerChristian Lamparter <chunkeey@gmail.com>
Fri, 5 Feb 2021 10:51:07 +0000 (11:51 +0100)
Since kernel configs provided by syzbot are close to "make allyesconfig",
it takes long time to rebuild. This is especially waste of time when we
need to rebuild for many times (e.g. doing manual printk() inspection,
bisect operations).

We can save time if we can exclude modules which are irrelevant to each
problem. But "make localmodconfig" cannot exclude modules which are built
into vmlinux because /sbin/lsmod output is used as the source of modules.

Therefore, this patch adds "make yes2modconfig" which converts from =y
to =m if possible. After confirming that the interested problem is still
reproducible, we can try "make localmodconfig" (and/or manually tune
based on "Modules linked in:" line) in order to exclude modules which are
irrelevant to the interested problem. While we are at it, this patch also
adds "make mod2yesconfig" which converts from =m to =y in case someone
wants to convert from =m to =y after "make localmodconfig".

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/conf.c
config/confdata.c
config/lkc.h

index 5f1758c73ccf1762114c542ce08bbd5340822550..a27f48ce4aac0da8e66e7afff64954eab3ea0839 100644 (file)
@@ -34,6 +34,8 @@ enum input_mode {
        listnewconfig,
        helpnewconfig,
        olddefconfig,
+       yes2modconfig,
+       mod2yesconfig,
 };
 static enum input_mode input_mode = oldaskconfig;
 
@@ -467,6 +469,8 @@ static struct option long_opts[] = {
        {"listnewconfig",   no_argument,       NULL, listnewconfig},
        {"helpnewconfig",   no_argument,       NULL, helpnewconfig},
        {"olddefconfig",    no_argument,       NULL, olddefconfig},
+       {"yes2modconfig",   no_argument,       NULL, yes2modconfig},
+       {"mod2yesconfig",   no_argument,       NULL, mod2yesconfig},
        {NULL, 0, NULL, 0}
 };
 
@@ -489,6 +493,8 @@ static void conf_usage(const char *progname)
        printf("  --allmodconfig          New config where all options are answered with mod\n");
        printf("  --alldefconfig          New config with all symbols set to default\n");
        printf("  --randconfig            New config with random answer to all options\n");
+       printf("  --yes2modconfig         Change answers from yes to mod if possible\n");
+       printf("  --mod2yesconfig         Change answers from mod to yes if possible\n");
 }
 
 int main(int ac, char **av)
@@ -553,6 +559,8 @@ int main(int ac, char **av)
                case listnewconfig:
                case helpnewconfig:
                case olddefconfig:
+               case yes2modconfig:
+               case mod2yesconfig:
                        break;
                case '?':
                        conf_usage(progname);
@@ -587,6 +595,8 @@ int main(int ac, char **av)
        case listnewconfig:
        case helpnewconfig:
        case olddefconfig:
+       case yes2modconfig:
+       case mod2yesconfig:
                conf_read(NULL);
                break;
        case allnoconfig:
@@ -660,6 +670,12 @@ int main(int ac, char **av)
                break;
        case savedefconfig:
                break;
+       case yes2modconfig:
+               conf_rewrite_mod_or_yes(def_y2m);
+               break;
+       case mod2yesconfig:
+               conf_rewrite_mod_or_yes(def_m2y);
+               break;
        case oldaskconfig:
                rootEntry = &rootmenu;
                conf(&rootmenu);
index cc18bc408397812ea125d1009da576a3cd897ec7..5d0ac58afa860f7e07d10b0734e272291239c5a6 100644 (file)
@@ -1389,3 +1389,19 @@ bool conf_set_all_new_symbols(enum conf_def_mode mode)
 
        return has_changed;
 }
+
+void conf_rewrite_mod_or_yes(enum conf_def_mode mode)
+{
+       struct symbol *sym;
+       int i;
+       tristate old_val = (mode == def_y2m) ? yes : mod;
+       tristate new_val = (mode == def_y2m) ? mod : yes;
+
+       for_all_symbols(i, sym) {
+               if (sym_get_type(sym) == S_TRISTATE &&
+                   sym->def[S_DEF_USER].tri == old_val) {
+                       sym->def[S_DEF_USER].tri = new_val;
+                       sym_add_change_count(1);
+               }
+       }
+}
index 73d3f01f17363ed7d41052f0a65bdc97e56067f9..d4ca8297364f95a5770bab01e1d70211e778fe99 100644 (file)
@@ -34,6 +34,8 @@ enum conf_def_mode {
        def_default,
        def_yes,
        def_mod,
+       def_y2m,
+       def_m2y,
        def_no,
        def_random
 };
@@ -52,6 +54,7 @@ const char *conf_get_configname(void);
 void sym_set_change_count(int count);
 void sym_add_change_count(int count);
 bool conf_set_all_new_symbols(enum conf_def_mode mode);
+void conf_rewrite_mod_or_yes(enum conf_def_mode mode);
 void set_all_choice_values(struct symbol *csym);
 
 /* confdata.c and expr.c */