aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorecashin@coraid.com <ecashin@coraid.com>2005-04-19 01:00:22 -0400
committerGreg KH <greg@press.kroah.org>2005-04-19 01:00:22 -0400
commita4b38364093bf2094ff858ad45f490521bb87984 (patch)
tree474c8d5acc153eb1736c9a76be0973a32e5995f8 /drivers/block
parent0c6f0e7920f39b28bdbe5f134f3e592542332d87 (diff)
[PATCH] aoe 12/12: send outgoing packets in order
I can't use list.h, since sk_buff doesn't have a list_head but instead has two struct sk_buff pointers, and I want to avoid any extra memory allocation. send outgoing packets in order Signed-off-by: Ed L. Cashin <ecashin@coraid.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/aoe/aoe.h3
-rw-r--r--drivers/block/aoe/aoeblk.c4
-rw-r--r--drivers/block/aoe/aoecmd.c26
3 files changed, 21 insertions, 12 deletions
diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h
index 2e92cfb4997c..aa8b547ffafa 100644
--- a/drivers/block/aoe/aoe.h
+++ b/drivers/block/aoe/aoe.h
@@ -131,7 +131,8 @@ struct aoedev {
131 struct timer_list timer; 131 struct timer_list timer;
132 spinlock_t lock; 132 spinlock_t lock;
133 struct net_device *ifp; /* interface ed is attached to */ 133 struct net_device *ifp; /* interface ed is attached to */
134 struct sk_buff *skblist;/* packets needing to be sent */ 134 struct sk_buff *sendq_hd; /* packets needing to be sent, list head */
135 struct sk_buff *sendq_tl;
135 mempool_t *bufpool; /* for deadlock-free Buf allocation */ 136 mempool_t *bufpool; /* for deadlock-free Buf allocation */
136 struct list_head bufq; /* queue of bios to work on */ 137 struct list_head bufq; /* queue of bios to work on */
137 struct buf *inprocess; /* the one we're currently working on */ 138 struct buf *inprocess; /* the one we're currently working on */
diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c
index a2735d975846..4780f7926d42 100644
--- a/drivers/block/aoe/aoeblk.c
+++ b/drivers/block/aoe/aoeblk.c
@@ -147,8 +147,8 @@ aoeblk_make_request(request_queue_t *q, struct bio *bio)
147 list_add_tail(&buf->bufs, &d->bufq); 147 list_add_tail(&buf->bufs, &d->bufq);
148 aoecmd_work(d); 148 aoecmd_work(d);
149 149
150 sl = d->skblist; 150 sl = d->sendq_hd;
151 d->skblist = NULL; 151 d->sendq_hd = d->sendq_tl = NULL;
152 152
153 spin_unlock_irqrestore(&d->lock, flags); 153 spin_unlock_irqrestore(&d->lock, flags);
154 154
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index 60beb8db4612..b5be4b7d7b5b 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -178,8 +178,12 @@ aoecmd_ata_rw(struct aoedev *d, struct frame *f)
178 178
179 skb = skb_prepare(d, f); 179 skb = skb_prepare(d, f);
180 if (skb) { 180 if (skb) {
181 skb->next = d->skblist; 181 skb->next = NULL;
182 d->skblist = skb; 182 if (d->sendq_hd)
183 d->sendq_tl->next = skb;
184 else
185 d->sendq_hd = skb;
186 d->sendq_tl = skb;
183 } 187 }
184} 188}
185 189
@@ -227,8 +231,12 @@ rexmit(struct aoedev *d, struct frame *f)
227 231
228 skb = skb_prepare(d, f); 232 skb = skb_prepare(d, f);
229 if (skb) { 233 if (skb) {
230 skb->next = d->skblist; 234 skb->next = NULL;
231 d->skblist = skb; 235 if (d->sendq_hd)
236 d->sendq_tl->next = skb;
237 else
238 d->sendq_hd = skb;
239 d->sendq_tl = skb;
232 } 240 }
233} 241}
234 242
@@ -280,8 +288,8 @@ tdie: spin_unlock_irqrestore(&d->lock, flags);
280 } 288 }
281 } 289 }
282 290
283 sl = d->skblist; 291 sl = d->sendq_hd;
284 d->skblist = NULL; 292 d->sendq_hd = d->sendq_tl = NULL;
285 if (sl) { 293 if (sl) {
286 n = d->rttavg <<= 1; 294 n = d->rttavg <<= 1;
287 if (n > MAXTIMER) 295 if (n > MAXTIMER)
@@ -481,8 +489,8 @@ aoecmd_ata_rsp(struct sk_buff *skb)
481 489
482 aoecmd_work(d); 490 aoecmd_work(d);
483 491
484 sl = d->skblist; 492 sl = d->sendq_hd;
485 d->skblist = NULL; 493 d->sendq_hd = d->sendq_tl = NULL;
486 494
487 spin_unlock_irqrestore(&d->lock, flags); 495 spin_unlock_irqrestore(&d->lock, flags);
488 496
@@ -531,7 +539,7 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)
531 539
532/* 540/*
533 * Since we only call this in one place (and it only prepares one frame) 541 * Since we only call this in one place (and it only prepares one frame)
534 * we just return the skb. Usually we'd chain it up to the d->skblist. 542 * we just return the skb. Usually we'd chain it up to the aoedev sendq.
535 */ 543 */
536static struct sk_buff * 544static struct sk_buff *
537aoecmd_ata_id(struct aoedev *d) 545aoecmd_ata_id(struct aoedev *d)