diff mbox series

[1/2] kconfig: fix reverse dependency with tristate if-conditional

Message ID 1543216969-2227-1-git-send-email-yamada.masahiro@socionext.com
State New
Headers show
Series [1/2] kconfig: fix reverse dependency with tristate if-conditional | expand

Commit Message

Masahiro Yamada Nov. 26, 2018, 7:22 a.m. UTC
A Kconfig property can have an optional if-expression, which describes
its visibility. The property is visible when the if-expression part is
evaluated to 'y' or 'm'.

The 'select' and 'imply' properties are internally converted to reverse
dependencies, but they are wrongly converted if they have a tristate
if-expression.

Example:

  config A
          tristate "a"

  config B
          tristate "b"
          select A if C

  config C
          tristate "c"

Currently, the reverse dependency of 'A' results in 'B && C'.
It is incorrect because the combination of B=y and C=m allows
'A' to become 'm', while its lower limit must be 'y'.

The reverse dependency should be 'B && C != n'.

Randy Dunlap reported that people are trying to fix an individual
Kconfig file [1], and I also found another example in the past,
commit 9d9c98e89ee2 ("pcmcia: fix yenta dependency on PCCARD_NONSTATIC")
but I suspect this is a bug of Kconfig itself.

[1] https://www.spinics.net/lists/netfilter-devel/msg56985.html

Reported-by: Taehee Yoo <ap420073@gmail.com>
Reported-by: Randy Dunlap <rdunlap@infradead.org>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

---

 scripts/kconfig/menu.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

-- 
2.7.4

Comments

kernel test robot Nov. 26, 2018, 8:15 a.m. UTC | #1
Hi Masahiro,

I love your patch! Yet something to improve:

[auto build test ERROR on masahiroy/kconfig]
[also build test ERROR on v4.20-rc4]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Masahiro-Yamada/kconfig-fix-reverse-dependency-with-tristate-if-conditional/20181126-152716
base:   https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig
config: i386-randconfig-s1-201847 (attached as .config)
compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   drivers/input//mouse/synaptics.c: In function 'synaptics_create_intertouch':
>> drivers/input//mouse/synaptics.c:1754:9: error: implicit declaration of function 'psmouse_smbus_init' [-Werror=implicit-function-declaration]

     return psmouse_smbus_init(psmouse, &intertouch_board,
            ^~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/psmouse_smbus_init +1754 drivers/input//mouse/synaptics.c

e839ffab Benjamin Tissoires 2017-03-02  1728  
e839ffab Benjamin Tissoires 2017-03-02  1729  static int synaptics_create_intertouch(struct psmouse *psmouse,
e839ffab Benjamin Tissoires 2017-03-02  1730  				       struct synaptics_device_info *info,
e839ffab Benjamin Tissoires 2017-03-02  1731  				       bool leave_breadcrumbs)
e839ffab Benjamin Tissoires 2017-03-02  1732  {
e839ffab Benjamin Tissoires 2017-03-02  1733  	bool topbuttonpad =
e839ffab Benjamin Tissoires 2017-03-02  1734  		psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&
e839ffab Benjamin Tissoires 2017-03-02  1735  		!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10);
e839ffab Benjamin Tissoires 2017-03-02  1736  	const struct rmi_device_platform_data pdata = {
e839ffab Benjamin Tissoires 2017-03-02  1737  		.sensor_pdata = {
e839ffab Benjamin Tissoires 2017-03-02  1738  			.sensor_type = rmi_sensor_touchpad,
e839ffab Benjamin Tissoires 2017-03-02  1739  			.axis_align.flip_y = true,
2b30297d Andrew Duggan      2017-10-09  1740  			.kernel_tracking = false,
e839ffab Benjamin Tissoires 2017-03-02  1741  			.topbuttonpad = topbuttonpad,
e839ffab Benjamin Tissoires 2017-03-02  1742  		},
e839ffab Benjamin Tissoires 2017-03-02  1743  		.f30_data = {
e839ffab Benjamin Tissoires 2017-03-02  1744  			.buttonpad = SYN_CAP_CLICKPAD(info->ext_cap_0c),
e839ffab Benjamin Tissoires 2017-03-02  1745  			.trackstick_buttons =
e839ffab Benjamin Tissoires 2017-03-02  1746  				!!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10),
e839ffab Benjamin Tissoires 2017-03-02  1747  		},
e839ffab Benjamin Tissoires 2017-03-02  1748  	};
e839ffab Benjamin Tissoires 2017-03-02  1749  	const struct i2c_board_info intertouch_board = {
e839ffab Benjamin Tissoires 2017-03-02  1750  		I2C_BOARD_INFO("rmi4_smbus", 0x2c),
e839ffab Benjamin Tissoires 2017-03-02  1751  		.flags = I2C_CLIENT_HOST_NOTIFY,
e839ffab Benjamin Tissoires 2017-03-02  1752  	};
e839ffab Benjamin Tissoires 2017-03-02  1753  
e839ffab Benjamin Tissoires 2017-03-02 @1754  	return psmouse_smbus_init(psmouse, &intertouch_board,
bf232e46 Benjamin Tissoires 2018-05-22  1755  				  &pdata, sizeof(pdata), true,
e839ffab Benjamin Tissoires 2017-03-02  1756  				  leave_breadcrumbs);
e839ffab Benjamin Tissoires 2017-03-02  1757  }
e839ffab Benjamin Tissoires 2017-03-02  1758  

:::::: The code at line 1754 was first introduced by commit
:::::: e839ffab028981ac77f650faf8c84f16e1719738 Input: synaptics - add support for Intertouch devices

:::::: TO: Benjamin Tissoires <benjamin.tissoires@redhat.com>
:::::: CC: Dmitry Torokhov <dmitry.torokhov@gmail.com>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
kernel test robot Nov. 26, 2018, 8:37 a.m. UTC | #2
Hi Masahiro,

I love your patch! Yet something to improve:

[auto build test ERROR on masahiroy/kconfig]
[also build test ERROR on v4.20-rc4 next-20181123]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Masahiro-Yamada/kconfig-fix-reverse-dependency-with-tristate-if-conditional/20181126-152716
base:   https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig
config: i386-randconfig-s3-201847 (attached as .config)
compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   arch/x86/kernel/dumpstack.o: In function `touch_nmi_watchdog':
>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

   arch/x86/kernel/nmi.o: In function `touch_nmi_watchdog':
>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

   arch/x86/kernel/kvm.o: In function `kvm_guest_init':
>> arch/x86/kernel/kvm.c:664: undefined reference to `hardlockup_detector_disable'

   arch/x86/kernel/pvclock.o: In function `pvclock_touch_watchdogs':
>> arch/x86/kernel/pvclock.c:52: undefined reference to `touch_softlockup_watchdog_sync'

   kernel/panic.o: In function `touch_nmi_watchdog':
>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

   kernel/panic.o: In function `panic':
>> kernel/panic.c:300: undefined reference to `touch_softlockup_watchdog'

   kernel/workqueue.o: In function `touch_nmi_watchdog':
>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

   kernel/workqueue.o:include/linux/nmi.h:135: more undefined references to `touch_softlockup_watchdog' follow
   kernel/sched/core.o: In function `show_state_filter':
>> kernel/sched/core.c:5341: undefined reference to `touch_all_softlockup_watchdogs'

   kernel/power/hibernate.o: In function `resume_target_kernel':
>> kernel/power/hibernate.c:480: undefined reference to `touch_softlockup_watchdog'

   kernel/power/snapshot.o: In function `rtree_next_node':
>> kernel/power/snapshot.c:847: undefined reference to `touch_softlockup_watchdog'

   kernel/printk/printk.o: In function `touch_nmi_watchdog':
>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

   kernel/time/timekeeping.o: In function `timekeeping_resume':
>> kernel/time/timekeeping.c:1731: undefined reference to `touch_softlockup_watchdog'

   kernel/time/timer_list.o: In function `touch_nmi_watchdog':
>> include/linux/nmi.h:135: undefined reference to `touch_softlockup_watchdog'

   kernel/time/timer_list.o:include/linux/nmi.h:135: more undefined references to `touch_softlockup_watchdog' follow
   drivers/tty/serial/earlycon.o: In function `parse_options':
>> drivers/tty/serial/earlycon.c:94: undefined reference to `uart_parse_earlycon'

   drivers/tty/serial/8250/8250_core.o: In function `univ8250_console_match':
>> drivers/tty/serial/8250/8250_core.c:640: undefined reference to `uart_parse_earlycon'

   drivers/tty/serial/8250/8250_core.o: In function `serial8250_suspend':
>> drivers/tty/serial/8250/8250_core.c:865: undefined reference to `uart_suspend_port'

   drivers/tty/serial/8250/8250_core.o: In function `serial8250_find_match_or_unused':
>> drivers/tty/serial/8250/8250_core.c:916: undefined reference to `uart_match_port'

   drivers/tty/serial/8250/8250_core.o: In function `serial8250_register_8250_port':
>> drivers/tty/serial/8250/8250_core.c:971: undefined reference to `uart_remove_one_port'


vim +135 include/linux/nmi.h

6592ad2f Thomas Gleixner  2017-09-12  124  
^1da177e Linus Torvalds   2005-04-16  125  /**
^1da177e Linus Torvalds   2005-04-16  126   * touch_nmi_watchdog - restart NMI watchdog timeout.
^1da177e Linus Torvalds   2005-04-16  127   *
^1da177e Linus Torvalds   2005-04-16  128   * If the architecture supports the NMI watchdog, touch_nmi_watchdog()
^1da177e Linus Torvalds   2005-04-16  129   * may be used to reset the timeout - for code which intentionally
^1da177e Linus Torvalds   2005-04-16  130   * disables interrupts for a long time. This call is stateless.
^1da177e Linus Torvalds   2005-04-16  131   */
5d0e600d Ingo Molnar      2007-02-13  132  static inline void touch_nmi_watchdog(void)
5d0e600d Ingo Molnar      2007-02-13  133  {
f2e0cff8 Nicholas Piggin  2017-07-12  134  	arch_touch_nmi_watchdog();
5d0e600d Ingo Molnar      2007-02-13 @135  	touch_softlockup_watchdog();
5d0e600d Ingo Molnar      2007-02-13  136  }
6e7458a6 Ulrich Obergfell 2014-10-13  137  

:::::: The code at line 135 was first introduced by commit
:::::: 5d0e600d903caa09e790824cc5812f0d97113b23 [PATCH] x86: fix laptop bootup hang in init_acpi()

:::::: TO: Ingo Molnar <mingo@elte.hu>
:::::: CC: Andi Kleen <andi@basil.nowhere.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
Masahiro Yamada Nov. 26, 2018, 9:05 a.m. UTC | #3
On Mon, Nov 26, 2018 at 5:17 PM kbuild test robot <lkp@intel.com> wrote:
>

> Hi Masahiro,

>

> I love your patch! Yet something to improve:

>

> [auto build test ERROR on masahiroy/kconfig]

> [also build test ERROR on v4.20-rc4]

> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

>

> url:    https://github.com/0day-ci/linux/commits/Masahiro-Yamada/kconfig-fix-reverse-dependency-with-tristate-if-conditional/20181126-152716

> base:   https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig

> config: i386-randconfig-s1-201847 (attached as .config)

> compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026

> reproduce:

>         # save the attached .config to linux build tree

>         make ARCH=i386

>

> All errors (new ones prefixed by >>):



OK, this is not so easy to fix as I expected.


UML is not defined at all for i386,

'UML != n' is evaluated to 'y'.


I need to think about how to fix this.








>    drivers/input//mouse/synaptics.c: In function 'synaptics_create_intertouch':

> >> drivers/input//mouse/synaptics.c:1754:9: error: implicit declaration of function 'psmouse_smbus_init' [-Werror=implicit-function-declaration]

>      return psmouse_smbus_init(psmouse, &intertouch_board,

>             ^~~~~~~~~~~~~~~~~~

>    cc1: some warnings being treated as errors

>

> vim +/psmouse_smbus_init +1754 drivers/input//mouse/synaptics.c

>

> e839ffab Benjamin Tissoires 2017-03-02  1728

> e839ffab Benjamin Tissoires 2017-03-02  1729  static int synaptics_create_intertouch(struct psmouse *psmouse,

> e839ffab Benjamin Tissoires 2017-03-02  1730                                   struct synaptics_device_info *info,

> e839ffab Benjamin Tissoires 2017-03-02  1731                                   bool leave_breadcrumbs)

> e839ffab Benjamin Tissoires 2017-03-02  1732  {

> e839ffab Benjamin Tissoires 2017-03-02  1733    bool topbuttonpad =

> e839ffab Benjamin Tissoires 2017-03-02  1734            psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) &&

> e839ffab Benjamin Tissoires 2017-03-02  1735            !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10);

> e839ffab Benjamin Tissoires 2017-03-02  1736    const struct rmi_device_platform_data pdata = {

> e839ffab Benjamin Tissoires 2017-03-02  1737            .sensor_pdata = {

> e839ffab Benjamin Tissoires 2017-03-02  1738                    .sensor_type = rmi_sensor_touchpad,

> e839ffab Benjamin Tissoires 2017-03-02  1739                    .axis_align.flip_y = true,

> 2b30297d Andrew Duggan      2017-10-09  1740                    .kernel_tracking = false,

> e839ffab Benjamin Tissoires 2017-03-02  1741                    .topbuttonpad = topbuttonpad,

> e839ffab Benjamin Tissoires 2017-03-02  1742            },

> e839ffab Benjamin Tissoires 2017-03-02  1743            .f30_data = {

> e839ffab Benjamin Tissoires 2017-03-02  1744                    .buttonpad = SYN_CAP_CLICKPAD(info->ext_cap_0c),

> e839ffab Benjamin Tissoires 2017-03-02  1745                    .trackstick_buttons =

> e839ffab Benjamin Tissoires 2017-03-02  1746                            !!SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10),

> e839ffab Benjamin Tissoires 2017-03-02  1747            },

> e839ffab Benjamin Tissoires 2017-03-02  1748    };

> e839ffab Benjamin Tissoires 2017-03-02  1749    const struct i2c_board_info intertouch_board = {

> e839ffab Benjamin Tissoires 2017-03-02  1750            I2C_BOARD_INFO("rmi4_smbus", 0x2c),

> e839ffab Benjamin Tissoires 2017-03-02  1751            .flags = I2C_CLIENT_HOST_NOTIFY,

> e839ffab Benjamin Tissoires 2017-03-02  1752    };

> e839ffab Benjamin Tissoires 2017-03-02  1753

> e839ffab Benjamin Tissoires 2017-03-02 @1754    return psmouse_smbus_init(psmouse, &intertouch_board,

> bf232e46 Benjamin Tissoires 2018-05-22  1755                              &pdata, sizeof(pdata), true,

> e839ffab Benjamin Tissoires 2017-03-02  1756                              leave_breadcrumbs);

> e839ffab Benjamin Tissoires 2017-03-02  1757  }

> e839ffab Benjamin Tissoires 2017-03-02  1758

>

> :::::: The code at line 1754 was first introduced by commit

> :::::: e839ffab028981ac77f650faf8c84f16e1719738 Input: synaptics - add support for Intertouch devices

>

> :::::: TO: Benjamin Tissoires <benjamin.tissoires@redhat.com>

> :::::: CC: Dmitry Torokhov <dmitry.torokhov@gmail.com>

>

> ---

> 0-DAY kernel test infrastructure                Open Source Technology Center

> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation




-- 
Best Regards
Masahiro Yamada
diff mbox series

Patch

diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index 4cf15d4..2b18833 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -401,11 +401,13 @@  void menu_finalize(struct menu *parent)
 				if (prop->type == P_SELECT) {
 					struct symbol *es = prop_get_symbol(prop);
 					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
-							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+							expr_alloc_and(expr_alloc_symbol(menu->sym),
+									expr_trans_compare(dep, E_UNEQUAL, &symbol_no)));
 				} else if (prop->type == P_IMPLY) {
 					struct symbol *es = prop_get_symbol(prop);
 					es->implied.expr = expr_alloc_or(es->implied.expr,
-							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+							expr_alloc_and(expr_alloc_symbol(menu->sym),
+									expr_trans_compare(dep, E_UNEQUAL, &symbol_no)));
 				}
 			}
 		}