一个客户的发现我们的设备上出现了arpFlush处挂起的现象,看了一下代码,发现arpFlush中存在竞争条件,即代码中获取arp_llinfo链表信息时,没有处于spnet之下,所以会导致原本有效的链表节点,在进入spnet保护的临界区之后,实际上可能被其它任务释放,从而导致任务挂起。代码如下,出问题的就是第一行代码。
- void arpFlush (void)
-
{
-
struct llinfo_arp * la = arp_llinfo.lh_first;
-
struct llinfo_arp * ola;
-
struct rtentry *rt;
-
int s;
-
-
s = splnet ();
-
-
while ((ola = la) != 0)
-
{
-
rt = la->la_rt;
-
la = la->la_le.le_next;
-
-
/* if entry permanent */
-
if ((rt->rt_rmx.rmx_expire == 0) || (rt->rt_flags == 0))
-
continue;
-
-
arptfree(ola); /* timer has expired; clear */
-
}
-
-
splx (s);
-
}
阅读(621) | 评论(0) | 转发(0) |