[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20131011160004.GA26416@redhat.com>
Date: Fri, 11 Oct 2013 18:00:04 +0200
From: Oleg Nesterov <oleg@...hat.com>
To: Li Zefan <lizefan@...wei.com>
Cc: Tejun Heo <tj@...nel.org>, anjana vk <anjanvk12@...il.com>,
cgroups@...r.kernel.org, linux-kernel@...r.kernel.org,
eunki_kim@...sung.com
Subject: Re: cgroup_attach_task && while_each_thread (Was: cgroup attach
task - slogging cpu)
On 10/11, Li Zefan wrote:
>
> On 2013/10/10 0:54, Oleg Nesterov wrote:
>
> > And I am starting to think that this change should also fix the
> > while_each_thread() problems in this particular case.
Please see below,
> > In generak the code like
> >
> > rcu_read_lock();
> > task = find_get_task(...);
> > rcu_read_unlock();
> >
> > rcu_read_lock();
> > t = task;
> > do {
> > ...
> > } while_each_thread (task, t);
> > rcu_read_unlock();
> >
> > is wrong even if while_each_thread() was correct (and we have a lot
> > of examples of this pattern). A GP can pass before the 2nd rcu-lock,
> > and we simply can't trust ->thread_group.next.
> >
> > But I didn't notice that cgroup_attach_task(tsk, threadgroup) can only
> > be called with threadgroup == T when a) tsk is ->group_leader and b)
> > we hold threadgroup_lock() which blocks de_thread(). IOW, in this case
> > "tsk" can't be removed from ->thread_group list before other threads.
> >
> > If next_thread() sees thread_group.next != leader, we know that the
> > that .next thread didn't do __unhash_process() yet, and since we
> > know that in this case "leader" didn't do this too we are safe.
> >
> > In short: __unhash_process(leader) (in this) case can never change
> > ->thread_group.next of another thread, because leader->thread_group
> > should be already list_empty().
> >
>
> If threadgroup == false, and if the tsk is existing or is already in
> the targeted cgroup, we won't break the loop due to the bug but do
> this:
>
> while_each_thread(task, t)
>
> If @task isn't the leader, we might got stuck in the loop?
Yes, yes, sure. We need to fix the wrong "continue" logic, hopefully
I tried to say (see above) that after we do this while_each_thread()
should be fine in this particular case.
Oleg.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists