Skip to content
  • Linus Torvalds's avatar
    spinlocks and preemption points need to be at least compiler barriers · 386afc91
    Linus Torvalds authored
    In UP and non-preempt respectively, the spinlocks and preemption
    disable/enable points are stubbed out entirely, because there is no
    regular code that can ever hit the kind of concurrency they are meant to
    protect against.
    
    However, while there is no regular code that can cause scheduling, we
    _do_ end up having some exceptional (literally!) code that can do so,
    and that we need to make sure does not ever get moved into the critical
    region by the compiler.
    
    In particular, get_user() and put_user() is generally implemented as
    inline asm statements (even if the inline asm may then make a call
    instruction to call out-of-line), and can obviously cause a page fault
    and IO as a result.  If that inline asm has been scheduled into the
    middle of a preemption-safe (or spinlock-protected) code region, we
    obviously lose.
    
    Now, admittedly this is *very* unlikely to actually ever happen, and
    we've not seen examples of actual bugs related to this.  But partly
    exactly because it's so hard to trigger and the resulting bug is so
    subtle, we should be extra careful to get this right.
    
    So make sure that even when preemption is disabled, and we don't have to
    generate any actual *code* to explicitly tell the system that we are in
    a preemption-disabled region, we need to at least tell the compiler not
    to move things around the critical region.
    
    This patch grew out of the same discussion that caused commits
    79e5f05e ("ARC: Add implicit compiler barrier to raw_local_irq*
    functions") and 3e2e0d2c
    
     ("tile: comment assumption about
    __insn_mtspr for <asm/irqflags.h>") to come about.
    
    Note for stable: use discretion when/if applying this.  As mentioned,
    this bug may never have actually bitten anybody, and gcc may never have
    done the required code motion for it to possibly ever trigger in
    practice.
    
    Cc: stable@vger.kernel.org
    Cc: Steven Rostedt <srostedt@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    386afc91