Messages in this thread | | | Date | Wed, 18 Mar 2009 09:40:44 +0800 | From | Li Zefan <> | Subject | Re: [PATCH -tip] cpuacct: Make cpuacct hierarchy walk in cpuacct_charge() safe when rcupreempt is used. |
| |
Balbir Singh wrote: > * Li Zefan <lizf@cn.fujitsu.com> [2009-03-17 14:28:11]: > >> Bharata B Rao wrote: >>> cpuacct: Make cpuacct hierarchy walk in cpuacct_charge() safe when >>> rcupreempt is used. >>> >>> cpuacct_charge() obtains task's ca and does a hierarchy walk upwards. >>> This can race with the task's movement between cgroups. This race >>> can cause an access to freed ca pointer in cpuacct_charge(). This will not >> Actually it can also end up access invalid tsk->cgroups. ;) >> >> get tsk->cgroups (cg) >> (move tsk to another cgroup) or (tsk exiting) >> -> kfree(tsk->cgroups) >> get cg->subsys[..] >> > > That problem should only occur if we dereference tsk->cgroups > separately and then use that to dereference cg->subsys. Since we use
Do you mean tsk->cgroups->subsys is safe and cg = tsk->cgroups;...; cg->subsys is unsafe ? This is wrong.
> task_subsys_state() and that is RCU safe, we should be OK. >
Yes, it's RCU safe, which means it's unsafe without rcu_read_lock/unlock.
| |