]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.1-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Jul 2019 11:20:10 +0000 (13:20 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Jul 2019 11:20:10 +0000 (13:20 +0200)
added patches:
kconfig-fix-missing-choice-values-in-auto.conf.patch

queue-5.1/kconfig-fix-missing-choice-values-in-auto.conf.patch [new file with mode: 0644]
queue-5.1/series

diff --git a/queue-5.1/kconfig-fix-missing-choice-values-in-auto.conf.patch b/queue-5.1/kconfig-fix-missing-choice-values-in-auto.conf.patch
new file mode 100644 (file)
index 0000000..e442be9
--- /dev/null
@@ -0,0 +1,140 @@
+From 8e2442a5f86e1f77b86401fce274a7f622740bc4 Mon Sep 17 00:00:00 2001
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+Date: Fri, 12 Jul 2019 15:07:09 +0900
+Subject: kconfig: fix missing choice values in auto.conf
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Masahiro Yamada <yamada.masahiro@socionext.com>
+
+commit 8e2442a5f86e1f77b86401fce274a7f622740bc4 upstream.
+
+Since commit 00c864f8903d ("kconfig: allow all config targets to write
+auto.conf if missing"), Kconfig creates include/config/auto.conf in the
+defconfig stage when it is missing.
+
+Joonas Kylmälä reported incorrect auto.conf generation under some
+circumstances.
+
+To reproduce it, apply the following diff:
+
+|  --- a/arch/arm/configs/imx_v6_v7_defconfig
+|  +++ b/arch/arm/configs/imx_v6_v7_defconfig
+|  @@ -345,14 +345,7 @@ CONFIG_USB_CONFIGFS_F_MIDI=y
+|   CONFIG_USB_CONFIGFS_F_HID=y
+|   CONFIG_USB_CONFIGFS_F_UVC=y
+|   CONFIG_USB_CONFIGFS_F_PRINTER=y
+|  -CONFIG_USB_ZERO=m
+|  -CONFIG_USB_AUDIO=m
+|  -CONFIG_USB_ETH=m
+|  -CONFIG_USB_G_NCM=m
+|  -CONFIG_USB_GADGETFS=m
+|  -CONFIG_USB_FUNCTIONFS=m
+|  -CONFIG_USB_MASS_STORAGE=m
+|  -CONFIG_USB_G_SERIAL=m
+|  +CONFIG_USB_FUNCTIONFS=y
+|   CONFIG_MMC=y
+|   CONFIG_MMC_SDHCI=y
+|   CONFIG_MMC_SDHCI_PLTFM=y
+
+And then, run:
+
+$ make ARCH=arm mrproper imx_v6_v7_defconfig
+
+You will see CONFIG_USB_FUNCTIONFS=y is correctly contained in the
+.config, but not in the auto.conf.
+
+Please note drivers/usb/gadget/legacy/Kconfig is included from a choice
+block in drivers/usb/gadget/Kconfig. So USB_FUNCTIONFS is a choice value.
+
+This is probably a similar situation described in commit beaaddb62540
+("kconfig: tests: test defconfig when two choices interact").
+
+When sym_calc_choice() is called, the choice symbol forgets the
+SYMBOL_DEF_USER unless all of its choice values are explicitly set by
+the user.
+
+The choice symbol is given just one chance to recall it because
+set_all_choice_values() is called if SYMBOL_NEED_SET_CHOICE_VALUES
+is set.
+
+When sym_calc_choice() is called again, the choice symbol forgets it
+forever, since SYMBOL_NEED_SET_CHOICE_VALUES is a one-time aid.
+Hence, we cannot call sym_clear_all_valid() again and again.
+
+It is crazy to repeat set and unset of internal flags. However, we
+cannot simply get rid of "sym->flags &= flags | ~SYMBOL_DEF_USER;"
+Doing so would re-introduce the problem solved by commit 5d09598d488f
+("kconfig: fix new choices being skipped upon config update").
+
+To work around the issue, conf_write_autoconf() stopped calling
+sym_clear_all_valid().
+
+conf_write() must be changed accordingly. Currently, it clears
+SYMBOL_WRITE after the symbol is written into the .config file. This
+is needed to prevent it from writing the same symbol multiple times in
+case the symbol is declared in two or more locations. I added the new
+flag SYMBOL_WRITTEN, to track the symbols that have been written.
+
+Anyway, this is a cheesy workaround in order to suppress the issue
+as far as defconfig is concerned.
+
+Handling of choices is totally broken. sym_clear_all_valid() is called
+every time a user touches a symbol from the GUI interface. To reproduce
+it, just add a new symbol drivers/usb/gadget/legacy/Kconfig, then touch
+around unrelated symbols from menuconfig. USB_FUNCTIONFS will disappear
+from the .config file.
+
+I added the Fixes tag since it is more fatal than before. But, this
+has been broken since long long time before, and still it is.
+We should take a closer look to fix this correctly somehow.
+
+Fixes: 00c864f8903d ("kconfig: allow all config targets to write auto.conf if missing")
+Cc: linux-stable <stable@vger.kernel.org> # 4.19+
+Reported-by: Joonas Kylmälä <joonas.kylmala@iki.fi>
+Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+Tested-by: Joonas Kylmälä <joonas.kylmala@iki.fi>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ scripts/kconfig/confdata.c |    7 +++----
+ scripts/kconfig/expr.h     |    1 +
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/scripts/kconfig/confdata.c
++++ b/scripts/kconfig/confdata.c
+@@ -871,11 +871,12 @@ int conf_write(const char *name)
+                                    "#\n"
+                                    "# %s\n"
+                                    "#\n", str);
+-              } else if (!(sym->flags & SYMBOL_CHOICE)) {
++              } else if (!(sym->flags & SYMBOL_CHOICE) &&
++                         !(sym->flags & SYMBOL_WRITTEN)) {
+                       sym_calc_value(sym);
+                       if (!(sym->flags & SYMBOL_WRITE))
+                               goto next;
+-                      sym->flags &= ~SYMBOL_WRITE;
++                      sym->flags |= SYMBOL_WRITTEN;
+                       conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
+               }
+@@ -1026,8 +1027,6 @@ int conf_write_autoconf(int overwrite)
+       if (!overwrite && is_present(autoconf_name))
+               return 0;
+-      sym_clear_all_valid();
+-
+       conf_write_dep("include/config/auto.conf.cmd");
+       if (conf_touch_deps())
+--- a/scripts/kconfig/expr.h
++++ b/scripts/kconfig/expr.h
+@@ -141,6 +141,7 @@ struct symbol {
+ #define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
+ #define SYMBOL_WRITE      0x0200  /* write symbol to file (KCONFIG_CONFIG) */
+ #define SYMBOL_CHANGED    0x0400  /* ? */
++#define SYMBOL_WRITTEN    0x0800  /* track info to avoid double-write to .config */
+ #define SYMBOL_NO_WRITE   0x1000  /* Symbol for internal use only; it will not be written */
+ #define SYMBOL_CHECKED    0x2000  /* used during dependency checking */
+ #define SYMBOL_WARNED     0x8000  /* warning has been issued */
index 2bc90b60098d701713971cf15e9a2f7ace74c9f4..c10cd986ec8e706e7b7f3637a9b0c9d369b29c32 100644 (file)
@@ -309,3 +309,4 @@ signal-usb-replace-kill_pid_info_as_cred-with-kill_pid_usb_asyncio.patch
 signal-correct-namespace-fixups-of-si_pid-and-si_uid.patch
 fs-proc-proc_sysctl.c-fix-the-default-values-of-i_uid-i_gid-on-proc-sys-inodes.patch
 i3c-fix-i2c-and-i3c-scl-rate-by-bus-mode.patch
+kconfig-fix-missing-choice-values-in-auto.conf.patch