使用dev_get_by_name的注意事項

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;
}

發佈了0 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章