skb数据包release的有关问题

skb数据包release的问题
有一段代码看不太明白.
void skb_release_data(struct sk_buff *skb)
{
if (!skb->cloned || !atomic_sub_return(skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1, &skb_shinfo(skb)->dataref)) {
if (skb_shinfo(skb)->nr_frags) { 
int i;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
put_page(skb_shinfo(skb)->frags[i].page);
}

if (skb_shinfo(skb)->frag_list)
skb_drop_fraglist(skb); //从链表删除该节点

kfree(skb->head);
}
}
这个是处理一个skb数据包后释放该数据包的代码. SKB数据包是以链表方式存放处理. 在以上的释放处理过程中. 只有当
if (skb_shinfo(skb)->frag_list)
skb_drop_fraglist(skb); //从链表删除该节点
其他情况都只是将该数据包销毁释放而并未将他从接收数据链表中删除. 也就是说只要该skbuff数据包的skb_shared_info中的frag_list是空的话就只释放该skb数据包而并未将自己从数据链表删除. 这样是否会导致下次读数据包还是会搜索该数据链找到这个已经被销毁的skb数据包呢?

------解决方案--------------------
探讨
搞明白了.原来是skb_dequeue取包时候已经顺便删除了该节点