[SCSI] scsi_dh_alua: backoff alua rtpg retry linearly vs. geometrically
authorRob Evers <revers@redhat.com>
Fri, 18 May 2012 18:08:56 +0000 (14:08 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 20 Jul 2012 07:58:33 +0000 (08:58 +0100)
Currently the backoff algorithm for when to retry alua rtpg
requests progresses geometrically as so:

2, 4, 8, 16, 32, 64... seconds.

This progression can lead to un-needed delay in retrying
alua rtpg requests when the rtpgs are delayed.  A less
aggressive backoff algorithm that is additive would not
lead to such large jumps when delays start getting long, but
would backoff linearly:

2, 4, 6, 8, 10... seconds.

Signed-off-by: Martin George <marting@netapp.com>
Signed-off-by: Rob Evers <revers@redhat.com>
Reviewed-by: Babu Moger <babu.moger@netapp.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/device_handler/scsi_dh_alua.c

index 5a34488569628e741c062754178b391fb05ffe4e..0d573822bf438dc83449d572b8863843000b807c 100644 (file)
@@ -527,7 +527,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)
        unsigned char *ucp;
        unsigned err;
        bool rtpg_ext_hdr_req = 1;
-       unsigned long expiry, interval = 1000;
+       unsigned long expiry, interval = 0;
        unsigned int tpg_desc_tbl_off;
        unsigned char orig_transition_tmo;
 
@@ -632,7 +632,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h)
        case TPGS_STATE_TRANSITIONING:
                if (time_before(jiffies, expiry)) {
                        /* State transition, retry */
-                       interval *= 2;
+                       interval += 2000;
                        msleep(interval);
                        goto retry;
                }