dev_hold()和dev_put()用於設備的引用計數器加1和設備的引用計數器減1,內核中會經常用到。
linux可以使用dev_get_by_name函數取得設備指針,但是使用是需要注意,使用過dev_get_by_name函數後一定要使用dev_put(pDev)函數取消設備引用,不然可能導致GET的設備無法正常卸載。
一般在將設備指針賦值給SKB->dev後就可以dev_put(pDev)
QUOTE: |
pDev = dev_get_by_name("sap1"); struct sk_buff *pIGMP_Query_skb_clone = NULL; pIGMP_Query_skb_clone=skb_clone(pIGMP_Query_skb, GFP_ATOMIC); pIGMP_Query_skb_clone->dev=pDev; dev_put(pIGMP_Query_skb_clone->dev); dev_queue_xmit(pIGMP_Query_skb_clone); |
但使用__dev_get_by_name就不需要調用dev_put(pDev)
附dev_get_by_name函數原型:
struct net_device *dev_get_by_name(const char *name)
{
struct net_device *dev;
read_lock(&dev_base_lock);
dev = __dev_get_by_name(name);
if (dev)
dev_hold(dev);
read_unlock(&dev_base_lock);
return dev;
}