diff options
| -rw-r--r-- | drivers/block/aoe/aoe.h | 8 | ||||
| -rw-r--r-- | drivers/block/aoe/aoecmd.c | 65 | ||||
| -rw-r--r-- | drivers/block/aoe/aoedev.c | 30 |
3 files changed, 49 insertions, 54 deletions
diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h index d17b72763973..dab7258ddb26 100644 --- a/drivers/block/aoe/aoe.h +++ b/drivers/block/aoe/aoe.h | |||
| @@ -91,7 +91,7 @@ enum { | |||
| 91 | NTARGETS = 8, | 91 | NTARGETS = 8, |
| 92 | NAOEIFS = 8, | 92 | NAOEIFS = 8, |
| 93 | NSKBPOOLMAX = 256, | 93 | NSKBPOOLMAX = 256, |
| 94 | NFACTIVE = 17, | 94 | NFACTIVE = 61, |
| 95 | 95 | ||
| 96 | TIMERTICK = HZ / 10, | 96 | TIMERTICK = HZ / 10, |
| 97 | MINTIMER = HZ >> 2, | 97 | MINTIMER = HZ >> 2, |
| @@ -132,14 +132,11 @@ struct aoetgt { | |||
| 132 | unsigned char addr[6]; | 132 | unsigned char addr[6]; |
| 133 | ushort nframes; | 133 | ushort nframes; |
| 134 | struct aoedev *d; /* parent device I belong to */ | 134 | struct aoedev *d; /* parent device I belong to */ |
| 135 | struct list_head factive[NFACTIVE]; /* hash of active frames */ | ||
| 136 | struct list_head ffree; /* list of free frames */ | 135 | struct list_head ffree; /* list of free frames */ |
| 137 | struct aoeif ifs[NAOEIFS]; | 136 | struct aoeif ifs[NAOEIFS]; |
| 138 | struct aoeif *ifp; /* current aoeif in use */ | 137 | struct aoeif *ifp; /* current aoeif in use */ |
| 139 | ushort nout; | 138 | ushort nout; |
| 140 | ushort maxout; | 139 | ushort maxout; |
| 141 | u16 lasttag; /* last tag sent */ | ||
| 142 | u16 useme; | ||
| 143 | ulong falloc; | 140 | ulong falloc; |
| 144 | ulong lastwadj; /* last window adjustment */ | 141 | ulong lastwadj; /* last window adjustment */ |
| 145 | int minbcnt; | 142 | int minbcnt; |
| @@ -156,6 +153,8 @@ struct aoedev { | |||
| 156 | u16 rttavg; /* round trip average of requests/responses */ | 153 | u16 rttavg; /* round trip average of requests/responses */ |
| 157 | u16 mintimer; | 154 | u16 mintimer; |
| 158 | u16 fw_ver; /* version of blade's firmware */ | 155 | u16 fw_ver; /* version of blade's firmware */ |
| 156 | u16 lasttag; /* last tag sent */ | ||
| 157 | u16 useme; | ||
| 159 | ulong ref; | 158 | ulong ref; |
| 160 | struct work_struct work;/* disk create work struct */ | 159 | struct work_struct work;/* disk create work struct */ |
| 161 | struct gendisk *gd; | 160 | struct gendisk *gd; |
| @@ -172,6 +171,7 @@ struct aoedev { | |||
| 172 | struct request *rq; | 171 | struct request *rq; |
| 173 | } ip; | 172 | } ip; |
| 174 | ulong maxbcnt; | 173 | ulong maxbcnt; |
| 174 | struct list_head factive[NFACTIVE]; /* hash of active frames */ | ||
| 175 | struct aoetgt *targets[NTARGETS]; | 175 | struct aoetgt *targets[NTARGETS]; |
| 176 | struct aoetgt **tgt; /* target in use when working */ | 176 | struct aoetgt **tgt; /* target in use when working */ |
| 177 | struct aoetgt *htgt; /* target needing rexmit assistance */ | 177 | struct aoetgt *htgt; /* target needing rexmit assistance */ |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 2a6a4316db00..cc692fee7ce1 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -59,14 +59,14 @@ new_skb(ulong len) | |||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | static struct frame * | 61 | static struct frame * |
| 62 | getframe(struct aoetgt *t, u32 tag) | 62 | getframe(struct aoedev *d, u32 tag) |
| 63 | { | 63 | { |
| 64 | struct frame *f; | 64 | struct frame *f; |
| 65 | struct list_head *head, *pos, *nx; | 65 | struct list_head *head, *pos, *nx; |
| 66 | u32 n; | 66 | u32 n; |
| 67 | 67 | ||
| 68 | n = tag % NFACTIVE; | 68 | n = tag % NFACTIVE; |
| 69 | head = &t->factive[n]; | 69 | head = &d->factive[n]; |
| 70 | list_for_each_safe(pos, nx, head) { | 70 | list_for_each_safe(pos, nx, head) { |
| 71 | f = list_entry(pos, struct frame, head); | 71 | f = list_entry(pos, struct frame, head); |
| 72 | if (f->tag == tag) { | 72 | if (f->tag == tag) { |
| @@ -83,18 +83,18 @@ getframe(struct aoetgt *t, u32 tag) | |||
| 83 | * This driver reserves tag -1 to mean "unused frame." | 83 | * This driver reserves tag -1 to mean "unused frame." |
| 84 | */ | 84 | */ |
| 85 | static int | 85 | static int |
| 86 | newtag(struct aoetgt *t) | 86 | newtag(struct aoedev *d) |
| 87 | { | 87 | { |
| 88 | register ulong n; | 88 | register ulong n; |
| 89 | 89 | ||
| 90 | n = jiffies & 0xffff; | 90 | n = jiffies & 0xffff; |
| 91 | return n |= (++t->lasttag & 0x7fff) << 16; | 91 | return n |= (++d->lasttag & 0x7fff) << 16; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | static u32 | 94 | static u32 |
| 95 | aoehdr_atainit(struct aoedev *d, struct aoetgt *t, struct aoe_hdr *h) | 95 | aoehdr_atainit(struct aoedev *d, struct aoetgt *t, struct aoe_hdr *h) |
| 96 | { | 96 | { |
| 97 | u32 host_tag = newtag(t); | 97 | u32 host_tag = newtag(d); |
| 98 | 98 | ||
| 99 | memcpy(h->src, t->ifp->nd->dev_addr, sizeof h->src); | 99 | memcpy(h->src, t->ifp->nd->dev_addr, sizeof h->src); |
| 100 | memcpy(h->dst, t->addr, sizeof h->dst); | 100 | memcpy(h->dst, t->addr, sizeof h->dst); |
| @@ -270,11 +270,11 @@ loop: | |||
| 270 | static void | 270 | static void |
| 271 | fhash(struct frame *f) | 271 | fhash(struct frame *f) |
| 272 | { | 272 | { |
| 273 | struct aoetgt *t = f->t; | 273 | struct aoedev *d = f->t->d; |
| 274 | u32 n; | 274 | u32 n; |
| 275 | 275 | ||
| 276 | n = f->tag % NFACTIVE; | 276 | n = f->tag % NFACTIVE; |
| 277 | list_add_tail(&f->head, &t->factive[n]); | 277 | list_add_tail(&f->head, &d->factive[n]); |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | static int | 280 | static int |
| @@ -433,7 +433,7 @@ resend(struct aoedev *d, struct frame *f) | |||
| 433 | u32 n; | 433 | u32 n; |
| 434 | 434 | ||
| 435 | t = f->t; | 435 | t = f->t; |
| 436 | n = newtag(t); | 436 | n = newtag(d); |
| 437 | skb = f->skb; | 437 | skb = f->skb; |
| 438 | if (ifrotate(t) == NULL) { | 438 | if (ifrotate(t) == NULL) { |
| 439 | /* probably can't happen, but set it up to fail anyway */ | 439 | /* probably can't happen, but set it up to fail anyway */ |
| @@ -512,9 +512,12 @@ sthtith(struct aoedev *d) | |||
| 512 | int i; | 512 | int i; |
| 513 | 513 | ||
| 514 | for (i = 0; i < NFACTIVE; i++) { | 514 | for (i = 0; i < NFACTIVE; i++) { |
| 515 | head = &ht->factive[i]; | 515 | head = &d->factive[i]; |
| 516 | list_for_each_safe(pos, nx, head) { | 516 | list_for_each_safe(pos, nx, head) { |
| 517 | f = list_entry(pos, struct frame, head); | 517 | f = list_entry(pos, struct frame, head); |
| 518 | if (f->t != ht) | ||
| 519 | continue; | ||
| 520 | |||
| 518 | nf = newframe(d); | 521 | nf = newframe(d); |
| 519 | if (!nf) | 522 | if (!nf) |
| 520 | return 0; | 523 | return 0; |
| @@ -585,22 +588,20 @@ rexmit_timer(ulong vp) | |||
| 585 | } | 588 | } |
| 586 | 589 | ||
| 587 | /* collect all frames to rexmit into flist */ | 590 | /* collect all frames to rexmit into flist */ |
| 588 | tt = d->targets; | 591 | for (i = 0; i < NFACTIVE; i++) { |
| 589 | te = tt + NTARGETS; | 592 | head = &d->factive[i]; |
| 590 | for (; tt < te && *tt; tt++) { | 593 | list_for_each_safe(pos, nx, head) { |
| 591 | t = *tt; | 594 | f = list_entry(pos, struct frame, head); |
| 592 | for (i = 0; i < NFACTIVE; i++) { | 595 | if (tsince(f->tag) < timeout) |
| 593 | head = &t->factive[i]; | 596 | break; /* end of expired frames */ |
| 594 | list_for_each_safe(pos, nx, head) { | 597 | /* move to flist for later processing */ |
| 595 | f = list_entry(pos, struct frame, head); | 598 | list_move_tail(pos, &flist); |
| 596 | if (tsince(f->tag) < timeout) | ||
| 597 | continue; | ||
| 598 | /* move to flist for later processing */ | ||
| 599 | list_move_tail(pos, &flist); | ||
| 600 | } | ||
| 601 | } | 599 | } |
| 602 | 600 | } | |
| 603 | /* window check */ | 601 | /* window check */ |
| 602 | tt = d->targets; | ||
| 603 | te = tt + d->ntargets; | ||
| 604 | for (; tt < te && (t = *tt); tt++) { | ||
| 604 | if (t->nout == t->maxout | 605 | if (t->nout == t->maxout |
| 605 | && t->maxout < t->nframes | 606 | && t->maxout < t->nframes |
| 606 | && (jiffies - t->lastwadj)/HZ > 10) { | 607 | && (jiffies - t->lastwadj)/HZ > 10) { |
| @@ -626,7 +627,7 @@ rexmit_timer(ulong vp) | |||
| 626 | * Hang all frames on first hash bucket for downdev | 627 | * Hang all frames on first hash bucket for downdev |
| 627 | * to clean up. | 628 | * to clean up. |
| 628 | */ | 629 | */ |
| 629 | list_splice(&flist, &f->t->factive[0]); | 630 | list_splice(&flist, &d->factive[0]); |
| 630 | aoedev_downdev(d); | 631 | aoedev_downdev(d); |
| 631 | break; | 632 | break; |
| 632 | } | 633 | } |
| @@ -1162,15 +1163,7 @@ aoecmd_ata_rsp(struct sk_buff *skb) | |||
| 1162 | spin_lock_irqsave(&d->lock, flags); | 1163 | spin_lock_irqsave(&d->lock, flags); |
| 1163 | 1164 | ||
| 1164 | n = be32_to_cpu(get_unaligned(&h->tag)); | 1165 | n = be32_to_cpu(get_unaligned(&h->tag)); |
| 1165 | t = gettgt(d, h->src); | 1166 | f = getframe(d, n); |
| 1166 | if (t == NULL) { | ||
| 1167 | printk(KERN_INFO "aoe: can't find target e%ld.%d:%pm\n", | ||
| 1168 | d->aoemajor, d->aoeminor, h->src); | ||
| 1169 | spin_unlock_irqrestore(&d->lock, flags); | ||
| 1170 | aoedev_put(d); | ||
| 1171 | return skb; | ||
| 1172 | } | ||
| 1173 | f = getframe(t, n); | ||
| 1174 | if (f == NULL) { | 1167 | if (f == NULL) { |
| 1175 | calc_rttavg(d, -tsince(n)); | 1168 | calc_rttavg(d, -tsince(n)); |
| 1176 | spin_unlock_irqrestore(&d->lock, flags); | 1169 | spin_unlock_irqrestore(&d->lock, flags); |
| @@ -1185,6 +1178,7 @@ aoecmd_ata_rsp(struct sk_buff *skb) | |||
| 1185 | aoechr_error(ebuf); | 1178 | aoechr_error(ebuf); |
| 1186 | return skb; | 1179 | return skb; |
| 1187 | } | 1180 | } |
| 1181 | t = f->t; | ||
| 1188 | calc_rttavg(d, tsince(f->tag)); | 1182 | calc_rttavg(d, tsince(f->tag)); |
| 1189 | t->nout--; | 1183 | t->nout--; |
| 1190 | aoecmd_work(d); | 1184 | aoecmd_work(d); |
| @@ -1253,7 +1247,6 @@ static struct aoetgt * | |||
| 1253 | addtgt(struct aoedev *d, char *addr, ulong nframes) | 1247 | addtgt(struct aoedev *d, char *addr, ulong nframes) |
| 1254 | { | 1248 | { |
| 1255 | struct aoetgt *t, **tt, **te; | 1249 | struct aoetgt *t, **tt, **te; |
| 1256 | int i; | ||
| 1257 | 1250 | ||
| 1258 | tt = d->targets; | 1251 | tt = d->targets; |
| 1259 | te = tt + NTARGETS; | 1252 | te = tt + NTARGETS; |
| @@ -1278,8 +1271,6 @@ addtgt(struct aoedev *d, char *addr, ulong nframes) | |||
| 1278 | t->ifp = t->ifs; | 1271 | t->ifp = t->ifs; |
| 1279 | t->maxout = t->nframes; | 1272 | t->maxout = t->nframes; |
| 1280 | INIT_LIST_HEAD(&t->ffree); | 1273 | INIT_LIST_HEAD(&t->ffree); |
| 1281 | for (i = 0; i < NFACTIVE; ++i) | ||
| 1282 | INIT_LIST_HEAD(&t->factive[i]); | ||
| 1283 | return *tt = t; | 1274 | return *tt = t; |
| 1284 | } | 1275 | } |
| 1285 | 1276 | ||
diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index 635dc986cf77..3968fe6c0077 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c | |||
| @@ -103,22 +103,23 @@ aoedev_downdev(struct aoedev *d) | |||
| 103 | 103 | ||
| 104 | d->flags &= ~DEVFL_UP; | 104 | d->flags &= ~DEVFL_UP; |
| 105 | 105 | ||
| 106 | /* clean out active buffers on all targets */ | 106 | /* clean out active buffers */ |
| 107 | for (i = 0; i < NFACTIVE; i++) { | ||
| 108 | head = &d->factive[i]; | ||
| 109 | list_for_each_safe(pos, nx, head) { | ||
| 110 | f = list_entry(pos, struct frame, head); | ||
| 111 | list_del(pos); | ||
| 112 | if (f->buf) { | ||
| 113 | f->buf->nframesout--; | ||
| 114 | aoe_failbuf(d, f->buf); | ||
| 115 | } | ||
| 116 | aoe_freetframe(f); | ||
| 117 | } | ||
| 118 | } | ||
| 119 | /* reset window dressings */ | ||
| 107 | tt = d->targets; | 120 | tt = d->targets; |
| 108 | te = tt + NTARGETS; | 121 | te = tt + NTARGETS; |
| 109 | for (; tt < te && (t = *tt); tt++) { | 122 | for (; tt < te && (t = *tt); tt++) { |
| 110 | for (i = 0; i < NFACTIVE; i++) { | ||
| 111 | head = &t->factive[i]; | ||
| 112 | list_for_each_safe(pos, nx, head) { | ||
| 113 | list_del(pos); | ||
| 114 | f = list_entry(pos, struct frame, head); | ||
| 115 | if (f->buf) { | ||
| 116 | f->buf->nframesout--; | ||
| 117 | aoe_failbuf(d, f->buf); | ||
| 118 | } | ||
| 119 | aoe_freetframe(f); | ||
| 120 | } | ||
| 121 | } | ||
| 122 | t->maxout = t->nframes; | 123 | t->maxout = t->nframes; |
| 123 | t->nout = 0; | 124 | t->nout = 0; |
| 124 | } | 125 | } |
| @@ -250,6 +251,7 @@ struct aoedev * | |||
| 250 | aoedev_by_sysminor_m(ulong sysminor) | 251 | aoedev_by_sysminor_m(ulong sysminor) |
| 251 | { | 252 | { |
| 252 | struct aoedev *d; | 253 | struct aoedev *d; |
| 254 | int i; | ||
| 253 | ulong flags; | 255 | ulong flags; |
| 254 | 256 | ||
| 255 | spin_lock_irqsave(&devlist_lock, flags); | 257 | spin_lock_irqsave(&devlist_lock, flags); |
| @@ -275,6 +277,8 @@ aoedev_by_sysminor_m(ulong sysminor) | |||
| 275 | d->bufpool = NULL; /* defer to aoeblk_gdalloc */ | 277 | d->bufpool = NULL; /* defer to aoeblk_gdalloc */ |
| 276 | d->tgt = d->targets; | 278 | d->tgt = d->targets; |
| 277 | d->ref = 1; | 279 | d->ref = 1; |
| 280 | for (i = 0; i < NFACTIVE; i++) | ||
| 281 | INIT_LIST_HEAD(&d->factive[i]); | ||
| 278 | d->sysminor = sysminor; | 282 | d->sysminor = sysminor; |
| 279 | d->aoemajor = AOEMAJOR(sysminor); | 283 | d->aoemajor = AOEMAJOR(sysminor); |
| 280 | d->aoeminor = AOEMINOR(sysminor); | 284 | d->aoeminor = AOEMINOR(sysminor); |
