From: Nikanth Karthikesan <knikanth@suse.de>
To: Alasdair G Kergon <agk@redhat.com>
Cc: device-mapper development <dm-devel@redhat.com>
Subject: [PATCH] dm mpath: delay retry activate_path on SCSI_DH_RETRY
Date: Tue, 17 Feb 2009 19:17:37 +0530 [thread overview]
Message-ID: <200902171917.38252.knikanth@suse.de> (raw)
Delay retry to activate_path if it returns SCSI_DH_RETRY.
Signed-off-by: Nikanth Karthikesan <knikanth@suse.de>
---
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
index 095f77b..af54632 100644
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@ -65,12 +65,14 @@ struct multipath {
spinlock_t lock;
const char *hw_handler_name;
- struct work_struct activate_path;
+ struct delayed_work activate_path;
struct pgpath *pgpath_to_activate;
unsigned nr_priority_groups;
struct list_head priority_groups;
unsigned pg_init_required; /* pg_init needs calling? */
unsigned pg_init_in_progress; /* Only one pg_init allowed at once */
+ unsigned long pg_init_jiffy; /* To delay retry if SCSI_DH_RETRY */
+#define SCSI_DH_RETRY_DELAY ((HZ * 2))
unsigned nr_valid_paths; /* Total number of usable paths */
struct pgpath *current_pgpath;
@@ -203,7 +205,7 @@ static struct multipath *alloc_multipath(struct dm_target *ti)
m->queue_io = 1;
INIT_WORK(&m->process_queued_ios, process_queued_ios);
INIT_WORK(&m->trigger_event, trigger_event);
- INIT_WORK(&m->activate_path, activate_path);
+ INIT_DELAYED_WORK(&m->activate_path, activate_path);
m->mpio_pool = mempool_create_slab_pool(MIN_IOS, _mpio_cache);
if (!m->mpio_pool) {
kfree(m);
@@ -431,6 +433,8 @@ static void process_queued_ios(struct work_struct *work)
struct pgpath *pgpath = NULL;
unsigned init_required = 0, must_queue = 1;
unsigned long flags;
+ unsigned long delay = 0;
+ unsigned long now;
spin_lock_irqsave(&m->lock, flags);
@@ -452,13 +456,20 @@ static void process_queued_ios(struct work_struct *work)
m->pg_init_required = 0;
m->pg_init_in_progress = 1;
init_required = 1;
+ /* Delay retry due to SCSI_DH_RETRY */
+ if (m->pg_init_jiffy) {
+ now = jiffies;
+ if (time_after(now, m->pg_init_jiffy))
+ delay = now - m->pg_init_jiffy;
+ m->pg_init_jiffy = 0;
+ }
}
out:
spin_unlock_irqrestore(&m->lock, flags);
if (init_required)
- queue_work(kmpath_handlerd, &m->activate_path);
+ queue_delayed_work(kmpath_handlerd, &m->activate_path, delay);
if (!must_queue)
dispatch_queued_ios(m);
@@ -1060,6 +1071,7 @@ static void pg_init_done(struct dm_path *path, int errors)
struct priority_group *pg = pgpath->pg;
struct multipath *m = pg->m;
unsigned long flags;
+ bool delay = false;
/* device or driver problems */
switch (errors) {
@@ -1084,8 +1096,11 @@ static void pg_init_done(struct dm_path *path, int errors)
*/
bypass_pg(m, pg, 1);
break;
- /* TODO: For SCSI_DH_RETRY we should wait a couple seconds */
+ /*
+ * For SCSI_DH_RETRY we wait for a couple seconds.
+ */
case SCSI_DH_RETRY:
+ delay = true;
case SCSI_DH_IMM_RETRY:
case SCSI_DH_RES_TEMP_UNAVAIL:
if (pg_init_limit_reached(m, pgpath))
@@ -1112,6 +1127,10 @@ static void pg_init_done(struct dm_path *path, int errors)
}
m->pg_init_in_progress = 0;
+ if (delay)
+ m->pg_init_jiffy = jiffies + SCSI_DH_RETRY_DELAY;
+ else
+ m->pg_init_jiffy = 0;
queue_work(kmultipathd, &m->process_queued_ios);
spin_unlock_irqrestore(&m->lock, flags);
}
@@ -1120,7 +1139,7 @@ static void activate_path(struct work_struct *work)
{
int ret;
struct multipath *m =
- container_of(work, struct multipath, activate_path);
+ container_of(work, struct multipath, activate_path.work);
struct dm_path *path;
unsigned long flags;
next reply other threads:[~2009-02-17 13:47 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-17 13:47 Nikanth Karthikesan [this message]
2009-02-19 1:55 ` [PATCH] dm mpath: delay retry activate_path on SCSI_DH_RETRY Chandra Seetharaman
2009-02-19 2:11 ` Alasdair G Kergon
2009-02-19 7:10 ` Nikanth Karthikesan
2009-02-20 0:45 ` Chandra Seetharaman
2009-02-20 5:03 ` Nikanth Karthikesan
2009-02-20 15:08 ` Konrad Rzeszutek
2009-02-20 21:11 ` Chandra Seetharaman
2009-03-02 10:48 ` Nikanth Karthikesan
-- strict thread matches above, loose matches on Subject: below --
2009-04-28 6:15 Nikanth Karthikesan
2009-04-28 19:35 ` Chandra Seetharaman
2009-04-28 22:34 ` Alasdair G Kergon
2009-05-05 3:18 Chandra Seetharaman
2009-05-15 3:10 ` Chandra Seetharaman
2009-05-15 13:38 ` Mike Christie
2009-06-09 20:54 ` Chandra Seetharaman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200902171917.38252.knikanth@suse.de \
--to=knikanth@suse.de \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.