• David Vrabel's avatar
    x86: xen: size struct xen_spinlock to always fit in arch_spinlock_t · 7a7546b3
    David Vrabel authored
    If NR_CPUS < 256 then arch_spinlock_t is only 16 bits wide but struct
    xen_spinlock is 32 bits.  When a spin lock is contended and
    xl->spinners is modified the two bytes immediately after the spin lock
    would be corrupted.
    
    This is a regression caused by 84eb950d
    (x86, ticketlock: Clean up types and accessors) which reduced the size
    of arch_spinlock_t.
    
    Fix this by making xl->spinners a u8 if NR_CPUS < 256.  A
    BUILD_BUG_ON() is also added to check the sizes of the two structures
    are compatible.
    
    In many cases this was not noticable as there would often be padding
    bytes after the lock (e.g., if any of CONFIG_GENERIC_LOCKBREAK,
    CONFIG_DEBUG_SPINLOCK, or CONFIG_DEBUG_LOCK_ALLOC were enabled).
    
    The bnx2 driver is affected. In struct bnx2, phy_lock and
    indirect_lock may have no padding after them.  Contention on phy_lock
    would corrupt indirect_lock making it appear locked and the driver
    would deadlock.
    Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
    Signed-off-by: default avatarJeremy Fitzhardinge <jeremy@goop.org>
    Acked-by: default avatarIan Campbell <ian.campbell@citrix.com>
    CC: stable@kernel.org #only 3.2
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    7a7546b3
spinlock.c 11 KB