|  | /* net/atm/ipcommon.c - Common items for all ways of doing IP over ATM */ | 
|  |  | 
|  | /* Written 1996-2000 by Werner Almesberger, EPFL LRC/ICA */ | 
|  |  | 
|  |  | 
|  | #include <linux/module.h> | 
|  | #include <linux/string.h> | 
|  | #include <linux/skbuff.h> | 
|  | #include <linux/netdevice.h> | 
|  | #include <linux/in.h> | 
|  | #include <linux/atmdev.h> | 
|  | #include <linux/atmclip.h> | 
|  |  | 
|  | #include "common.h" | 
|  | #include "ipcommon.h" | 
|  |  | 
|  |  | 
|  | #if 0 | 
|  | #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args) | 
|  | #else | 
|  | #define DPRINTK(format,args...) | 
|  | #endif | 
|  |  | 
|  |  | 
|  | /* | 
|  | * skb_migrate appends the list at "from" to "to", emptying "from" in the | 
|  | * process. skb_migrate is atomic with respect to all other skb operations on | 
|  | * "from" and "to". Note that it locks both lists at the same time, so to deal | 
|  | * with the lock ordering, the locks are taken in address order. | 
|  | * | 
|  | * This function should live in skbuff.c or skbuff.h. | 
|  | */ | 
|  |  | 
|  |  | 
|  | void skb_migrate(struct sk_buff_head *from, struct sk_buff_head *to) | 
|  | { | 
|  | unsigned long flags; | 
|  | struct sk_buff *skb_from = (struct sk_buff *) from; | 
|  | struct sk_buff *skb_to = (struct sk_buff *) to; | 
|  | struct sk_buff *prev; | 
|  |  | 
|  | if ((unsigned long) from < (unsigned long) to) { | 
|  | spin_lock_irqsave(&from->lock, flags); | 
|  | spin_lock_nested(&to->lock, SINGLE_DEPTH_NESTING); | 
|  | } else { | 
|  | spin_lock_irqsave(&to->lock, flags); | 
|  | spin_lock_nested(&from->lock, SINGLE_DEPTH_NESTING); | 
|  | } | 
|  | prev = from->prev; | 
|  | from->next->prev = to->prev; | 
|  | prev->next = skb_to; | 
|  | to->prev->next = from->next; | 
|  | to->prev = from->prev; | 
|  | to->qlen += from->qlen; | 
|  | spin_unlock(&to->lock); | 
|  | from->prev = skb_from; | 
|  | from->next = skb_from; | 
|  | from->qlen = 0; | 
|  | spin_unlock_irqrestore(&from->lock, flags); | 
|  | } | 
|  |  | 
|  |  | 
|  | EXPORT_SYMBOL(skb_migrate); |