| From dbaf971c9cdf10843071a60dcafc1aaab3162354 Mon Sep 17 00:00:00 2001 |
| From: Mike Snitzer <snitzer@redhat.com> |
| Date: Tue, 26 Nov 2019 10:08:29 -0500 |
| Subject: dm mpath: remove harmful bio-based optimization |
| |
| From: Mike Snitzer <snitzer@redhat.com> |
| |
| commit dbaf971c9cdf10843071a60dcafc1aaab3162354 upstream. |
| |
| Removes the branching for edge-case where no SCSI device handler |
| exists. The __map_bio_fast() method was far too limited, by only |
| selecting a new pathgroup or path IFF there was a path failure, fix this |
| be eliminating it in favor of __map_bio(). __map_bio()'s extra SCSI |
| device handler specific MPATHF_PG_INIT_REQUIRED test is not in the fast |
| path anyway. |
| |
| This change restores full path selector functionality for bio-based |
| configurations that don't haave a SCSI device handler. But it should be |
| noted that the path selectors do have an impact on performance for |
| certain networks that are extremely fast (and don't require frequent |
| switching). |
| |
| Fixes: 8d47e65948dd ("dm mpath: remove unnecessary NVMe branching in favor of scsi_dh checks") |
| Cc: stable@vger.kernel.org |
| Reported-by: Drew Hastings <dhastings@crucialwebhost.com> |
| Suggested-by: Martin Wilck <mwilck@suse.de> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm-mpath.c | 37 +------------------------------------ |
| 1 file changed, 1 insertion(+), 36 deletions(-) |
| |
| --- a/drivers/md/dm-mpath.c |
| +++ b/drivers/md/dm-mpath.c |
| @@ -599,45 +599,10 @@ static struct pgpath *__map_bio(struct m |
| return pgpath; |
| } |
| |
| -static struct pgpath *__map_bio_fast(struct multipath *m, struct bio *bio) |
| -{ |
| - struct pgpath *pgpath; |
| - unsigned long flags; |
| - |
| - /* Do we need to select a new pgpath? */ |
| - /* |
| - * FIXME: currently only switching path if no path (due to failure, etc) |
| - * - which negates the point of using a path selector |
| - */ |
| - pgpath = READ_ONCE(m->current_pgpath); |
| - if (!pgpath) |
| - pgpath = choose_pgpath(m, bio->bi_iter.bi_size); |
| - |
| - if (!pgpath) { |
| - if (test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags)) { |
| - /* Queue for the daemon to resubmit */ |
| - spin_lock_irqsave(&m->lock, flags); |
| - bio_list_add(&m->queued_bios, bio); |
| - spin_unlock_irqrestore(&m->lock, flags); |
| - queue_work(kmultipathd, &m->process_queued_bios); |
| - |
| - return ERR_PTR(-EAGAIN); |
| - } |
| - return NULL; |
| - } |
| - |
| - return pgpath; |
| -} |
| - |
| static int __multipath_map_bio(struct multipath *m, struct bio *bio, |
| struct dm_mpath_io *mpio) |
| { |
| - struct pgpath *pgpath; |
| - |
| - if (!m->hw_handler_name) |
| - pgpath = __map_bio_fast(m, bio); |
| - else |
| - pgpath = __map_bio(m, bio); |
| + struct pgpath *pgpath = __map_bio(m, bio); |
| |
| if (IS_ERR(pgpath)) |
| return DM_MAPIO_SUBMITTED; |