• Mike Snitzer's avatar
    dm mpath: eliminate use of spinlock in IO fast-paths · 2da1610a
    Mike Snitzer authored
    The primary motivation of this commit is to improve the scalability of
    DM multipath on large NUMA systems where m->lock spinlock contention has
    been proven to be a serious bottleneck on really fast storage.
    
    The ability to atomically read a pointer, using lockless_dereference(),
    is leveraged in this commit.  But all pointer writes are still protected
    by the m->lock spinlock (which is fine since these all now occur in the
    slow-path).
    
    The following functions no longer require the m->lock spinlock in their
    fast-path: multipath_busy(), __multipath_map(), and do_end_io()
    
    And choose_pgpath() is modified to _not_ update m->current_pgpath unless
    it also switches the path-group.  This is done to avoid needing to take
    the m->lock everytime __multipath_map() calls choose_pgpath().
    But m->current_pgpath will be reset if it is failed via fail_path().
    Suggested-by: default avatarJeff Moyer <jmoyer@redhat.com>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Tested-by: default avatarHannes Reinecke <hare@suse.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    2da1610a
dm-mpath.c 43.3 KB