• Alexey Brodkin's avatar
    ARC: define ARCH_SLAB_MINALIGN = 8 · 283c27e3
    Alexey Brodkin authored
    commit b6835ea7 upstream.
    
    The default value of ARCH_SLAB_MINALIGN in "include/linux/slab.h" is
    "__alignof__(unsigned long long)" which for ARC unexpectedly turns out
    to be 4. This is not a compiler bug, but as defined by ARC ABI [1]
    
    Thus slab allocator would allocate a struct which is 32-bit aligned,
    which is generally OK even if struct has long long members.
    There was however potetial problem when it had any atomic64_t which
    use LLOCKD/SCONDD instructions which are required by ISA to take
    64-bit addresses. This is the problem we ran into
    
    [    4.015732] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
    [    4.167881] Misaligned Access
    [    4.172356] Path: /bin/busybox.nosuid
    [    4.176004] CPU: 2 PID: 171 Comm: rm Not tainted 4.19.14-yocto-standard #1
    [    4.182851]
    [    4.182851] [ECR   ]: 0x000d0000 => Check Programmer's Manual
    [    4.190061] [EFA   ]: 0xbeaec3fc
    [    4.190061] [BLINK ]: ext4_delete_entry+0x210/0x234
    [    4.190061] [ERET  ]: ext4_delete_entry+0x13e/0x234
    [    4.202985] [STAT32]: 0x80080002 : IE K
    [    4.207236] BTA: 0x9009329c   SP: 0xbe5b1ec4  FP: 0x00000000
    [    4.212790] LPS: 0x9074b118  LPE: 0x9074b120 LPC: 0x00000000
    [    4.218348] r00: 0x00000040  r01: 0x00000021 r02: 0x00000001
    ...
    ...
    [    4.270510] Stack Trace:
    [    4.274510]   ext4_delete_entry+0x13e/0x234
    [    4.278695]   ext4_rmdir+0xe0/0x238
    [    4.282187]   vfs_rmdir+0x50/0xf0
    [    4.285492]   do_rmdir+0x9e/0x154
    [    4.288802]   EV_Trap+0x110/0x114
    
    The fix is to make sure slab allocations are 64-bit aligned.
    
    Do note that atomic64_t is __attribute__((aligned(8)) which means gcc
    does generate 64-bit aligned references, relative to beginning of
    container struct. However the issue is if the container itself is not
    64-bit aligned, atomic64_t ends up unaligned which is what this patch
    ensures.
    
    [1] https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/wiki/files/ARCv2_ABI.pdfSigned-off-by: 's avatarAlexey Brodkin <abrodkin@synopsys.com>
    Cc: <stable@vger.kernel.org> # 4.8+
    Signed-off-by: 's avatarVineet Gupta <vgupta@synopsys.com>
    [vgupta: reworked changelog, added dependency on LL64+LLSC]
    Signed-off-by: 's avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    283c27e3
Name
Last commit
Last update
Documentation Loading commit data...
LICENSES Loading commit data...
arch Loading commit data...
block Loading commit data...
certs Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt Loading commit data...
.clang-format Loading commit data...
.cocciconfig Loading commit data...
.get_maintainer.ignore Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...