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

Signed-off-by: David S. Miller <davem@davemloft.net>
Цей коміт міститься в:
David S. Miller
2009-05-28 16:36:47 -07:00
джерело 46c37672d7
коміт b6211ae7f2
2 змінених файлів з 17 додано та 36 видалено

Переглянути файл

@@ -445,9 +445,10 @@ free_skb:
*/
static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
{
struct sk_buff_head queue;
int err;
struct br2684_vcc *brvcc;
struct sk_buff *skb;
struct sk_buff *skb, *tmp;
struct sk_buff_head *rq;
struct br2684_dev *brdev;
struct net_device *net_dev;
@@ -505,29 +506,20 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg)
barrier();
atmvcc->push = br2684_push;
__skb_queue_head_init(&queue);
rq = &sk_atm(atmvcc)->sk_receive_queue;
spin_lock_irqsave(&rq->lock, flags);
if (skb_queue_empty(rq)) {
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;
skb_queue_splice_init(rq, &queue);
spin_unlock_irqrestore(&rq->lock, flags);
while (skb) {
struct sk_buff *next = skb->next;
skb_queue_walk_safe(&queue, skb, tmp) {
struct net_device *dev = skb->dev;
dev->stats.rx_bytes -= skb->len;
dev->stats.rx_packets--;
skb->next = skb->prev = NULL;
br2684_push(atmvcc, skb);
skb->dev->stats.rx_bytes -= skb->len;
skb->dev->stats.rx_packets--;
skb = next;
}
__module_get(THIS_MODULE);
return 0;