lkml.org 
[lkml]   [2012]   [Aug]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 55/74] lto, workaround: Add workaround for initcall reordering
    Date
    From: Andi Kleen <ak@linux.intel.com>

    Work around a LTO gcc problem: when there is no reference to a variable
    in a module it will be moved to the end of the program. This causes
    reordering of initcalls which the kernel does not like.
    Add a dummy reference function to avoid this. The function is
    deleted by the linker.

    This replaces a previous much slower workaround.

    Thanks to Honza Hubicka for suggesting this technique.

    Signed-off-by: Andi Kleen <ak@linux.intel.com>
    ---
    include/linux/init.h | 20 +++++++++++++++++++-
    1 files changed, 19 insertions(+), 1 deletions(-)

    diff --git a/include/linux/init.h b/include/linux/init.h
    index c2f06b3..e425800 100644
    --- a/include/linux/init.h
    +++ b/include/linux/init.h
    @@ -176,6 +176,23 @@ extern bool initcall_debug;

    #ifndef __ASSEMBLY__

    +#ifdef CONFIG_LTO
    +/* Work around a LTO gcc problem: when there is no reference to a variable
    + * in a module it will be moved to the end of the program. This causes
    + * reordering of initcalls which the kernel does not like.
    + * Add a dummy reference function to avoid this. The function is
    + * deleted by the linker.
    + */
    +#define LTO_REFERENCE_INITCALL(x) \
    + ; /* yes this is needed */ \
    + static __used __exit void *reference_##x(void) \
    + { \
    + return &x; \
    + }
    +#else
    +#define LTO_REFERENCE_INITCALL(x)
    +#endif
    +
    /* initcalls are now grouped by functionality into separate
    * subsections. Ordering inside the subsections is determined
    * by link order.
    @@ -188,7 +205,8 @@ extern bool initcall_debug;

    #define __define_initcall(level,fn,id) \
    static initcall_t __initcall_##fn##id __used \
    - __attribute__((__section__(".initcall" level ".init"))) = fn
    + __attribute__((__section__(".initcall" level ".init"))) = fn \
    + LTO_REFERENCE_INITCALL(__initcall_##fn##id)

    /*
    * Early initcalls run before initializing SMP.
    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-08-19 06:41    [W:0.023 / U:0.852 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site