23,124
社区成员
发帖
与我相关
我的任务
分享
pt_prev = NULL;
...........
/*
list_for_each_entry_rcu 展开:
for (ptype = list_entry_rcu( (&ptype_all)->next, typeof(*ptype), list );
&ptype->list != (&ptype_all);
ptype = list_entry_rcu( ptype->list.next, typeof(*ptype), list) )
*/
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (pt_prev)
ret = deliver_skb(skb, pt_prev, orig_dev);
pt_prev = ptype;
}
没看懂啊,用 pt_prev = ptype; 循环结束时,pt_prev指向最后一个节点,但此时循环条件己经不满足:
&ptype->list != (&ptype_all)
因此不能再执行循环体里的deliver_skb,有没有大神讲解下为什么要这么写? 虽然下面还有list_for_each_entry_rcu会执行上一个 pt_prev。
但为什么不是这样写:
pt_prev = NULL;
...........
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (ptype)
ret = deliver_skb(skb, ptype, orig_dev);
}