• Nick Piggin's avatar
    generic IPI: simplify barriers and locking · 15d0d3b3
    Nick Piggin authored
    Simplify the barriers in generic remote function call interrupt
    code.
    
    Firstly, just unconditionally take the lock and check the list
    in the generic_call_function_single_interrupt IPI handler. As
    we've just taken an IPI here, the chances are fairly high that
    there will be work on the list for us, so do the locking
    unconditionally. This removes the tricky lockless list_empty
    check and dubious barriers. The change looks bigger than it is
    because it is just removing an outer loop.
    
    Secondly, clarify architecture specific IPI locking rules.
    Generic code has no tools to impose any sane ordering on IPIs if
    they go outside normal cache coherency, ergo the arch code must
    make them appear to obey cache coherency as a "memory operation"
    to initiate an IPI, and a "memory operation" to receive one.
    This way at least they can be reasoned about in generic code,
    and smp_mb used to provide ordering.
    
    The combination of these two changes means that explict barriers
    can be taken out of queue handling for the single case -- shared
    data is explicitly locked, and ipi ordering must conform to
    that, so no barriers needed. An extra barrier is needed in the
    many handler, so as to ensure we load the list element after the
    IPI is received.
    
    Does any architecture actually *need* these barriers? For the
    initiator I could see it, but for the handler I would be
    surprised. So the other thing we could do for simplicity is just
    to require that, rather than just matching with cache coherency,
    we just require a full barrier before generating an IPI, and
    after receiving an IPI. In which case, the smp_mb()s can go
    away. But just for now, we'll be on the safe side and use the
    barriers (they're in the slow case anyway).
    Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
    Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: linux-arch@vger.kernel.org
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Jens Axboe <jens.axboe@oracle.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Suresh Siddha <suresh.b.siddha@intel.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    15d0d3b3
smp.c 11.7 KB