Skip to content
  • Xiao Guangrong's avatar
    generic-ipi: make struct call_function_data lockless · 54fdade1
    Xiao Guangrong authored
    
    
    This patch can remove spinlock from struct call_function_data, the
    reasons are below:
    
    1: add a new interface for cpumask named cpumask_test_and_clear_cpu(),
       it can atomically test and clear specific cpu, we can use it instead
       of cpumask_test_cpu() and cpumask_clear_cpu() and no need data->lock
       to protect those in generic_smp_call_function_interrupt().
    
    2: in smp_call_function_many(), after csd_lock() return, the current's
       cfd_data is deleted from call_function list, so it not have race
       between other cpus, then cfs_data is only used in
       smp_call_function_many() that must disable preemption and not from
       a hardware interrupthandler or from a bottom half handler to call,
       only the correspond cpu can use it, so it not have race in current
       cpu, no need cfs_data->lock to protect it.
    
    3: after 1 and 2, cfs_data->lock is only use to protect cfs_data->refs in
       generic_smp_call_function_interrupt(), so we can define cfs_data->refs
       to atomic_t, and no need cfs_data->lock any more.
    
    Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@cn.fujitsu.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Jens Axboe <jens.axboe@oracle.com>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Acked-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    [akpm@linux-foundation.org: use atomic_dec_return()]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    54fdade1