aoe: improve retransmission heuristics
authorEd L. Cashin <ecashin@coraid.com>
Wed, 20 Sep 2006 18:36:49 +0000 (14:36 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 18 Oct 2006 19:53:50 +0000 (12:53 -0700)
Add a dynamic minimum timer for better retransmission behavior.

Signed-off-by: "Ed L. Cashin" <ecashin@coraid.com>
Acked-by: Alan Cox <alan@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/block/aoe/aoe.h
drivers/block/aoe/aoecmd.c

index 4d79f1eaf7081c1a1de9e237d6b013f2f3be6c73..7b1121748633d8bda42070c8f4df4c57d855b50f 100644 (file)
@@ -125,8 +125,10 @@ struct aoedev {
        ulong sysminor;
        ulong aoemajor;
        ulong aoeminor;
-       ulong nopen;            /* (bd_openers isn't available without sleeping) */
-       ulong rttavg;           /* round trip average of requests/responses */
+       u16 nopen;              /* (bd_openers isn't available without sleeping) */
+       u16 lasttag;            /* last tag sent */
+       u16 rttavg;             /* round trip average of requests/responses */
+       u16 mintimer;
        u16 fw_ver;             /* version of blade's firmware */
        u16 maxbcnt;
        struct work_struct work;/* disk create work struct */
@@ -142,7 +144,6 @@ struct aoedev {
        mempool_t *bufpool;     /* for deadlock-free Buf allocation */
        struct list_head bufq;  /* queue of bios to work on */
        struct buf *inprocess;  /* the one we're currently working on */
-       ulong lasttag;          /* last tag sent */
        ushort lostjumbo;
        ushort nframes;         /* number of frames below */
        struct frame *frames;
index 621fdbbc4cd489904ed5e0255cd890e3bbfbc474..c0bdc1fe21f052f0e89538cfe9f2a8d5955ac2ee 100644 (file)
@@ -461,8 +461,15 @@ calc_rttavg(struct aoedev *d, int rtt)
        register long n;
 
        n = rtt;
-       if (n < MINTIMER)
-               n = MINTIMER;
+       if (n < 0) {
+               n = -rtt;
+               if (n < MINTIMER)
+                       n = MINTIMER;
+               else if (n > MAXTIMER)
+                       n = MAXTIMER;
+               d->mintimer += (n - d->mintimer) >> 1;
+       } else if (n < d->mintimer)
+               n = d->mintimer;
        else if (n > MAXTIMER)
                n = MAXTIMER;
 
@@ -498,8 +505,10 @@ aoecmd_ata_rsp(struct sk_buff *skb)
 
        spin_lock_irqsave(&d->lock, flags);
 
-       f = getframe(d, be32_to_cpu(hin->tag));
+       n = be32_to_cpu(hin->tag);
+       f = getframe(d, n);
        if (f == NULL) {
+               calc_rttavg(d, -tsince(n));
                spin_unlock_irqrestore(&d->lock, flags);
                snprintf(ebuf, sizeof ebuf,
                        "%15s e%d.%d    tag=%08x@%08lx\n",
@@ -724,6 +733,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb)
                return;
        }
        d->flags |= DEVFL_PAUSE;        /* force pause */
+       d->mintimer = MINTIMER;
        d->fw_ver = be16_to_cpu(ch->fwver);
 
        /* check for already outstanding ataid */