Skip to content

Commit

Permalink
[PATCH] aoe 12/12: send outgoing packets in order
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ecashin@coraid.com authored and Greg KH committed Apr 19, 2005
1 parent 0c6f0e7 commit a4b3836
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
3 changes: 2 additions & 1 deletion drivers/block/aoe/aoe.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ struct aoedev {
struct timer_list timer;
spinlock_t lock;
struct net_device *ifp; /* interface ed is attached to */
struct sk_buff *skblist;/* packets needing to be sent */
struct sk_buff *sendq_hd; /* packets needing to be sent, list head */
struct sk_buff *sendq_tl;
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 */
Expand Down
4 changes: 2 additions & 2 deletions drivers/block/aoe/aoeblk.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,8 @@ aoeblk_make_request(request_queue_t *q, struct bio *bio)
list_add_tail(&buf->bufs, &d->bufq);
aoecmd_work(d);

sl = d->skblist;
d->skblist = NULL;
sl = d->sendq_hd;
d->sendq_hd = d->sendq_tl = NULL;

spin_unlock_irqrestore(&d->lock, flags);

Expand Down
26 changes: 17 additions & 9 deletions drivers/block/aoe/aoecmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,12 @@ aoecmd_ata_rw(struct aoedev *d, struct frame *f)

skb = skb_prepare(d, f);
if (skb) {
skb->next = d->skblist;
d->skblist = skb;
skb->next = NULL;
if (d->sendq_hd)
d->sendq_tl->next = skb;
else
d->sendq_hd = skb;
d->sendq_tl = skb;
}
}

Expand Down Expand Up @@ -227,8 +231,12 @@ rexmit(struct aoedev *d, struct frame *f)

skb = skb_prepare(d, f);
if (skb) {
skb->next = d->skblist;
d->skblist = skb;
skb->next = NULL;
if (d->sendq_hd)
d->sendq_tl->next = skb;
else
d->sendq_hd = skb;
d->sendq_tl = skb;
}
}

Expand Down Expand Up @@ -280,8 +288,8 @@ tdie: spin_unlock_irqrestore(&d->lock, flags);
}
}

sl = d->skblist;
d->skblist = NULL;
sl = d->sendq_hd;
d->sendq_hd = d->sendq_tl = NULL;
if (sl) {
n = d->rttavg <<= 1;
if (n > MAXTIMER)
Expand Down Expand Up @@ -481,8 +489,8 @@ aoecmd_ata_rsp(struct sk_buff *skb)

aoecmd_work(d);

sl = d->skblist;
d->skblist = NULL;
sl = d->sendq_hd;
d->sendq_hd = d->sendq_tl = NULL;

spin_unlock_irqrestore(&d->lock, flags);

Expand Down Expand Up @@ -531,7 +539,7 @@ aoecmd_cfg(ushort aoemajor, unsigned char aoeminor)

/*
* Since we only call this in one place (and it only prepares one frame)
* we just return the skb. Usually we'd chain it up to the d->skblist.
* we just return the skb. Usually we'd chain it up to the aoedev sendq.
*/
static struct sk_buff *
aoecmd_ata_id(struct aoedev *d)
Expand Down

0 comments on commit a4b3836

Please sign in to comment.