Skip to content
  • Luis R. Rodriguez's avatar
    i2c: remove __init from i2c_register_board_info() · 5abe9b26
    Luis R. Rodriguez authored
    
    
    As of next-20160607 with allyesconfig we get this linker failure:
    
      MODPOST vmlinux.o
    WARNING: vmlinux.o(.text+0x21bc0d): Section mismatch in reference from
    the function intel_scu_devices_create() to the function
    .init.text:i2c_register_board_info()
    
    This is caused by the fact that intel_scu_devices_create() calls
    i2c_register_board_info() and intel_scu_devices_create() is not
    annotated with __init. This typically involves manual code
    inspection and if one is certain this is correct we would
    just peg intel_scu_devices_create() with a __ref annotation.
    
    In this case this would be wrong though as the
    intel_scu_devices_create() call is exported, and used in
    the ipc_probe() on drivers/platform/x86/intel_scu_ipc.c.
    The issue is that even though builtin_pci_driver(ipc_driver)
    is used this just exposes the probe routine, which can occur
    at any point in time if this bus supports hotplug. A race
    can happen between kernel_init_freeable() that calls the init
    calls (in this case registeres the intel_scu_ipc.c driver, and
    later free_initmem(), which would free the i2c_register_board_info().
    If a probe happens later in boot i2c_register_board_info() would
    not be present and we should get a page fault.
    
    Signed-off-by: default avatarLuis R. Rodriguez <mcgrof@kernel.org>
    [wsa: made function declaration a one-liner]
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    5abe9b26