On Mon, Mar 15, 2021 at 09:33:45AM +0100, Peter Zijlstra wrote:
> On Sun, Mar 14, 2021 at 01:15:25PM -0700, Linus Torvalds wrote:
> > On Sun, Mar 14, 2021 at 8:40 AM Thomas Gleixner <t...@linutronix.de> wrote:
> > >
> > >  - A fix for the static_call mechanism so it handles unaligned
> > >    addresses correctly.
> > 
> > I'm not disputing the fix in any way, but why weren't the relocation
> > info and function start addresses mutually aligned?
> > 
> > Are we perhaps missing some .align directive somewhere?
> > 
> > Or am I missing something?
> 
> So I considered looking into that, but since carrying the flag on the
> absolute address is always correct I figured it was the more robust fix.
> 
> I suppose I can try and figure out where alignment went wobbly.

include/asm-generic/vmlinux.lds.h:

#define STATIC_CALL_DATA                                                \
        . = ALIGN(8);                                                   \
        __start_static_call_sites = .;                                  \
        KEEP(*(.static_call_sites))                                     \
        __stop_static_call_sites = .;                                   \
        __start_static_call_tramp_key = .;                              \
        KEEP(*(.static_call_tramp_key))                                 \
        __stop_static_call_tramp_key = .;

#ifndef RO_AFTER_INIT_DATA
#define RO_AFTER_INIT_DATA                                              \
        . = ALIGN(8);                                                   \
        __start_ro_after_init = .;                                      \
        *(.data..ro_after_init)                                         \
        JUMP_TABLE_DATA                                                 \
        STATIC_CALL_DATA                                                \
        __end_ro_after_init = .;
#endif

        .rodata           : AT(ADDR(.rodata) - LOAD_OFFSET) {           \
                __start_rodata = .;                                     \
                *(.rodata) *(.rodata.*)                                 \
                SCHED_DATA                                              \
                RO_AFTER_INIT_DATA      /* Read only after init */      \
                . = ALIGN(8);                                           \
                __start___tracepoints_ptrs = .;                         \
                KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \
                __stop___tracepoints_ptrs = .;                          \
                *(__tracepoints_strings)/* Tracepoints: strings */      \
        }                                                               \


$ nm defconfig-build/vmlinux | grep static_call_sites
ffffffff82916dc0 D __start_static_call_sites
ffffffff8291aaf0 D __stop_static_call_sites


Which all reads to me like it *SHOULD* work. Howver when I was debugging
the crash as reported by Steve (using his .config), I definitely saw
non-aligned base offsets causing mayhem.

Reply via email to