关于task_struct flags的race condition

middle 2006-06-18 10:50:32
关于do_exit()中对task_struct进行访问不加锁的问题。我今天找到了一个具体的例子,希望高手指正。

fastcall NORET_TYPE void do_exit(long code)
{
... ...
tsk->flags |= PF_EXITING;

/*
* Make sure we don't try to process any timer firings
* while we are already exiting.
*/
tsk->it_virt_expires = cputime_zero;
tsk->it_prof_expires = cputime_zero;
tsk->it_sched_expires = 0;
... ...
}


static void process_timer_rebalance(struct task_struct *p,
unsigned int clock_idx,
union cpu_time_count expires,
union cpu_time_count val)
{
... ...
do {
if (likely(!(t->flags & PF_EXITING))) {
ticks = cputime_add(virt_ticks(t), left);
if (cputime_eq(t->it_virt_expires,
cputime_zero) ||
cputime_gt(t->it_virt_expires, ticks)) {
t->it_virt_expires = ticks;
}
}
t = next_thread(t);
} while (t != p);
break;
... ...
}

上面两个函数对it_virt_expires的访问存在race condition,其执行顺序可能为:

1. process_timer_rebalanc()检查
if (cputime_eq(t->it_virt_expires, cputime_zero) ||
cputime_gt(t->it_virt_expires, ticks))
2. do_exit()设置flags = PF_EXITING,it_virt_expirtes = 0。
3. process_timer_rebalanc()将it_virt_expires设置为ticks。

至此,it_virt_expires在进程处于PF_EXITING状态时仍然不为0。

请高手指正我对这个race conditon分析得对不对。这个问题对kernel有没有实质的影响。
...全文
311 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
middle 2006-06-20
  • 打赏
  • 举报
回复
问题解决。这是2.6.16.19以前的一个bug。2.17里做了修改。
tb01412 2006-06-20
  • 打赏
  • 举报
回复
对于LZ的这种对技术的狂热追求精神,赞一个!!!
middle 2006-06-19
  • 打赏
  • 举报
回复
以我的检查是没有。因为从sys_exit()->exit()这个路径下来,所执行的代码非常少。我仔细看过了。
  • 打赏
  • 举报
回复
没仔细看过,你看看内核里包装do_exit的函数是不是已经加了锁

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧