On Mon, Mar 15, 2021 at 12:10:10PM +0100, Peter Zijlstra wrote:
> 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.

Ooooh, modules don't have this. They still have regular
.static_call_sites sections, and *those* are unaligned.

Section Headers:
[Nr] Name              Type            Address          Off    Size   ES Flg Lk 
Inf Al

[16] .static_call_sites PROGBITS        0000000000000000 008aa1 0006f0 00  WA  
0   0  1

And that goes *BOOM*.. Let me ses if I can figure out how to make
objtool align those sections.

Reply via email to