Commit b6211ae7 authored by David S. Miller's avatar David S. Miller

atm: Use SKB queue and list helpers instead of doing it by-hand.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 46c37672
...@@ -445,9 +445,10 @@ free_skb: ...@@ -445,9 +445,10 @@ free_skb:
*/ */
static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
{ {
struct sk_buff_head queue;
int err; int err;
struct br2684_vcc *brvcc; struct br2684_vcc *brvcc;
struct sk_buff *skb; struct sk_buff *skb, *tmp;
struct sk_buff_head *rq; struct sk_buff_head *rq;
struct br2684_dev *brdev; struct br2684_dev *brdev;
struct net_device *net_dev; struct net_device *net_dev;
...@@ -505,29 +506,20 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) ...@@ -505,29 +506,20 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
barrier(); barrier();
atmvcc->push = br2684_push; atmvcc->push = br2684_push;
__skb_queue_head_init(&queue);
rq = &sk_atm(atmvcc)->sk_receive_queue; rq = &sk_atm(atmvcc)->sk_receive_queue;
spin_lock_irqsave(&rq->lock, flags); spin_lock_irqsave(&rq->lock, flags);
if (skb_queue_empty(rq)) { skb_queue_splice_init(rq, &queue);
skb = NULL;
} else {
/* NULL terminate the list. */
rq->prev->next = NULL;
skb = rq->next;
}
rq->prev = rq->next = (struct sk_buff *)rq;
rq->qlen = 0;
spin_unlock_irqrestore(&rq->lock, flags); spin_unlock_irqrestore(&rq->lock, flags);
while (skb) { skb_queue_walk_safe(&queue, skb, tmp) {
struct sk_buff *next = skb->next; struct net_device *dev = skb->dev;
skb->next = skb->prev = NULL; dev->stats.rx_bytes -= skb->len;
br2684_push(atmvcc, skb); dev->stats.rx_packets--;
skb->dev->stats.rx_bytes -= skb->len;
skb->dev->stats.rx_packets--;
skb = next; br2684_push(atmvcc, skb);
} }
__module_get(THIS_MODULE); __module_get(THIS_MODULE);
return 0; return 0;
......
...@@ -445,9 +445,9 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -445,9 +445,9 @@ static int clip_start_xmit(struct sk_buff *skb, struct net_device *dev)
static int clip_mkip(struct atm_vcc *vcc, int timeout) static int clip_mkip(struct atm_vcc *vcc, int timeout)
{ {
struct sk_buff_head *rq, queue;
struct clip_vcc *clip_vcc; struct clip_vcc *clip_vcc;
struct sk_buff *skb; struct sk_buff *skb, *tmp;
struct sk_buff_head *rq;
unsigned long flags; unsigned long flags;
if (!vcc->push) if (!vcc->push)
...@@ -469,39 +469,28 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout) ...@@ -469,39 +469,28 @@ static int clip_mkip(struct atm_vcc *vcc, int timeout)
vcc->push = clip_push; vcc->push = clip_push;
vcc->pop = clip_pop; vcc->pop = clip_pop;
__skb_queue_head_init(&queue);
rq = &sk_atm(vcc)->sk_receive_queue; rq = &sk_atm(vcc)->sk_receive_queue;
spin_lock_irqsave(&rq->lock, flags); spin_lock_irqsave(&rq->lock, flags);
if (skb_queue_empty(rq)) { skb_queue_splice_init(rq, &queue);
skb = NULL;
} else {
/* NULL terminate the list. */
rq->prev->next = NULL;
skb = rq->next;
}
rq->prev = rq->next = (struct sk_buff *)rq;
rq->qlen = 0;
spin_unlock_irqrestore(&rq->lock, flags); spin_unlock_irqrestore(&rq->lock, flags);
/* re-process everything received between connection setup and MKIP */ /* re-process everything received between connection setup and MKIP */
while (skb) { skb_queue_walk_safe(&queue, skb, tmp) {
struct sk_buff *next = skb->next;
skb->next = skb->prev = NULL;
if (!clip_devs) { if (!clip_devs) {
atm_return(vcc, skb->truesize); atm_return(vcc, skb->truesize);
kfree_skb(skb); kfree_skb(skb);
} else { } else {
struct net_device *dev = skb->dev;
unsigned int len = skb->len; unsigned int len = skb->len;
skb_get(skb); skb_get(skb);
clip_push(vcc, skb); clip_push(vcc, skb);
skb->dev->stats.rx_packets--; dev->stats.rx_packets--;
skb->dev->stats.rx_bytes -= len; dev->stats.rx_bytes -= len;
kfree_skb(skb); kfree_skb(skb);
} }
skb = next;
} }
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment