关于task_struct flags的race condition
来源: 互联网 发布时间:2015-11-30
本文导语: 关于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 fir...
关于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有没有实质的影响。
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有没有实质的影响。
|
对于LZ的这种对技术的狂热追求精神,赞一个!!!
|
没仔细看过,你看看内核里包装do_exit的函数是不是已经加了锁
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。