diff options
author | Mike Snitzer | 2016-03-17 23:38:17 +0100 |
---|---|---|
committer | Mike Snitzer | 2016-05-05 21:25:52 +0200 |
commit | 2da1610ae20e995e53658c3b10166d2ad74e30bd (patch) | |
tree | 4bee08cc145727a6366b2d516e41d2f703e3090c /drivers/md/dm-stripe.c | |
parent | dm mpath: move trigger_event member to the end of 'struct multipath' (diff) | |
download | kernel-qcow2-linux-2da1610ae20e995e53658c3b10166d2ad74e30bd.tar.gz kernel-qcow2-linux-2da1610ae20e995e53658c3b10166d2ad74e30bd.tar.xz kernel-qcow2-linux-2da1610ae20e995e53658c3b10166d2ad74e30bd.zip |
dm mpath: eliminate use of spinlock in IO fast-paths
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: Jeff Moyer <jmoyer@redhat.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Tested-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-stripe.c')
0 files changed, 0 insertions, 0 deletions