All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mandeep Singh Baines <msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
To: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: Frederic Weisbecker
	<fweisbec-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Mandeep Singh Baines
	<msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>,
	LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Paul Menage <paul-inf54ven1CmVyaH7bEyXVA@public.gmane.org>,
	Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Cgroups <cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Andrew Morton
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	"Paul E. McKenney"
	<paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>,
	Containers
	<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: Re: Q: cgroup: Questions about possible issues in cgroup locking
Date: Fri, 13 Jan 2012 10:27:50 -0800	[thread overview]
Message-ID: <20120113182750.GD18166@google.com> (raw)
In-Reply-To: <20120113152010.GA19215-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

Oleg Nesterov (oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org) wrote:
> On 01/12, Mandeep Singh Baines wrote:
> >
> > Oleg Nesterov (oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org) wrote:
> > >
> > > Still can't understand... Lets look at this trivial example again.
> > >
> > > We start from the main thread M, it is ->group_leader. There is
> > > another thread T in this thread group. We are doing
> > >
> > > 	OLD = M;
> > >
> > > 	t = M;
> > > 	do {
> > > 		do_smth(t);
> > > 	}
> > > 	while (t->group_leader == OLD && ((t = next_thread(t)) != M);
> > >
> > > The first iteration does do_smth(M).
> > >
> > > T calls de_thread() and, in particular, it does M->group_leader = T
> > > (see "leader->group_leader = tsk" in de_thread).
> > >
> > > after that t->group_leader == OLD fails. t == M, its group_leader == T.
> > > do_smth(T) won't be called.
> > >
> > > No?
> > >
> >
> > I think we can handle this by removing the assignment. So in de_thread():
> >
> > -		leader->group_leader = tsk;
> 
> Ah, so that was you plan. I was confused by the 3rd argument, why
> it is needed?
> 

Good question. On second thought, I don't think its needed as shown
in you're solution below.

> Yes, I thought about this too. Suppose we remove this assignment,
> then we can simply do
> 
> 	#define while_each_thread(g, t) \
> 		while (t->group_leader == g->group_leader && (t = next_thread(t)) != g)
> 
> with the same effect. (to remind, currently I ignore the barriers/etc).
> 

Nice! I think this works.

> But this can _only_ help if we start at the group leader!

But I don't think this solution requires we start at the group leader.

My thinking:

Case 1: g is the exec thread

The only condition under which g->group_leader would change is if g is the
exec thread. If you are the exec the only requirement is that you visit the
exec thread. Visiting any other threads is optional. Since g is the exec
thread, you've already visited it and can safely stop once
g->group_leader is re-assigned to g.

Case 2: g is the group leader

If g is the group leader and a subthread execs, you'll terminate just
after visiting the exec thread.

Case 3: g is some other thread

In this case, g MUST be current so you don't really need to worry
about de_thread() since current can't be de_threaded.

> 
> May be we should enforce this rule (for the lockless case), I dunno...
> In that case I'd prefer to add the new while_each_thread_rcu() helper.
> But! in this case we do not need to change de_thread(), we can simply do
> 
> 	#define while_each_thread_rcu(t) \
> 		while (({ t = next_thread(t); !thread_group_leader(t); }))
> 

Won't this terminate just before visiting the exec thread?

> The definition above was one of the possibilities I considered, but
> I wasn't able to convince myself this is the best option.
> 
> See? Or do you think I missed something?
> 
> Just in case... note that while_each_thread_rcu() doesn't use 'g'
> at all. May be it makes sense to keep the old "t != g &&", but this
> is minor.
> 
> Oleg.
> 

Regards,
Mandeep

WARNING: multiple messages have this Message-ID (diff)
From: Mandeep Singh Baines <msb@chromium.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Mandeep Singh Baines <msb@chromium.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Li Zefan <lizf@cn.fujitsu.com>, Tejun Heo <tj@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	Containers <containers@lists.linux-foundation.org>,
	Cgroups <cgroups@vger.kernel.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Paul Menage <paul@paulmenage.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: Re: Q: cgroup: Questions about possible issues in cgroup locking
Date: Fri, 13 Jan 2012 10:27:50 -0800	[thread overview]
Message-ID: <20120113182750.GD18166@google.com> (raw)
In-Reply-To: <20120113152010.GA19215@redhat.com>

Oleg Nesterov (oleg@redhat.com) wrote:
> On 01/12, Mandeep Singh Baines wrote:
> >
> > Oleg Nesterov (oleg@redhat.com) wrote:
> > >
> > > Still can't understand... Lets look at this trivial example again.
> > >
> > > We start from the main thread M, it is ->group_leader. There is
> > > another thread T in this thread group. We are doing
> > >
> > > 	OLD = M;
> > >
> > > 	t = M;
> > > 	do {
> > > 		do_smth(t);
> > > 	}
> > > 	while (t->group_leader == OLD && ((t = next_thread(t)) != M);
> > >
> > > The first iteration does do_smth(M).
> > >
> > > T calls de_thread() and, in particular, it does M->group_leader = T
> > > (see "leader->group_leader = tsk" in de_thread).
> > >
> > > after that t->group_leader == OLD fails. t == M, its group_leader == T.
> > > do_smth(T) won't be called.
> > >
> > > No?
> > >
> >
> > I think we can handle this by removing the assignment. So in de_thread():
> >
> > -		leader->group_leader = tsk;
> 
> Ah, so that was you plan. I was confused by the 3rd argument, why
> it is needed?
> 

Good question. On second thought, I don't think its needed as shown
in you're solution below.

> Yes, I thought about this too. Suppose we remove this assignment,
> then we can simply do
> 
> 	#define while_each_thread(g, t) \
> 		while (t->group_leader == g->group_leader && (t = next_thread(t)) != g)
> 
> with the same effect. (to remind, currently I ignore the barriers/etc).
> 

Nice! I think this works.

> But this can _only_ help if we start at the group leader!

But I don't think this solution requires we start at the group leader.

My thinking:

Case 1: g is the exec thread

The only condition under which g->group_leader would change is if g is the
exec thread. If you are the exec the only requirement is that you visit the
exec thread. Visiting any other threads is optional. Since g is the exec
thread, you've already visited it and can safely stop once
g->group_leader is re-assigned to g.

Case 2: g is the group leader

If g is the group leader and a subthread execs, you'll terminate just
after visiting the exec thread.

Case 3: g is some other thread

In this case, g MUST be current so you don't really need to worry
about de_thread() since current can't be de_threaded.

> 
> May be we should enforce this rule (for the lockless case), I dunno...
> In that case I'd prefer to add the new while_each_thread_rcu() helper.
> But! in this case we do not need to change de_thread(), we can simply do
> 
> 	#define while_each_thread_rcu(t) \
> 		while (({ t = next_thread(t); !thread_group_leader(t); }))
> 

Won't this terminate just before visiting the exec thread?

> The definition above was one of the possibilities I considered, but
> I wasn't able to convince myself this is the best option.
> 
> See? Or do you think I missed something?
> 
> Just in case... note that while_each_thread_rcu() doesn't use 'g'
> at all. May be it makes sense to keep the old "t != g &&", but this
> is minor.
> 
> Oleg.
> 

Regards,
Mandeep

  parent reply	other threads:[~2012-01-13 18:27 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-21  3:43 Q: cgroup: Questions about possible issues in cgroup locking Frederic Weisbecker
2011-12-21  3:43 ` Frederic Weisbecker
2011-12-21 13:08 ` Oleg Nesterov
2011-12-21 13:08   ` Oleg Nesterov
2011-12-21 17:56   ` Frederic Weisbecker
2011-12-21 17:56     ` Frederic Weisbecker
2011-12-21 19:01     ` Mandeep Singh Baines
2011-12-21 19:01       ` Mandeep Singh Baines
     [not found]       ` <20111221190102.GE13529-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2011-12-21 19:08         ` Frederic Weisbecker
2011-12-21 19:08           ` Frederic Weisbecker
2011-12-21 19:24           ` Mandeep Singh Baines
2011-12-21 19:24             ` Mandeep Singh Baines
     [not found]             ` <20111221192413.GF13529-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2011-12-21 20:04               ` Frederic Weisbecker
2011-12-21 20:04             ` Frederic Weisbecker
2011-12-21 20:04               ` Frederic Weisbecker
2011-12-22 15:30               ` Oleg Nesterov
2011-12-22 15:30                 ` Oleg Nesterov
     [not found]                 ` <20111222153004.GA30522-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-04 19:36                   ` Mandeep Singh Baines
2012-01-04 19:36                 ` Mandeep Singh Baines
2012-01-04 19:36                   ` Mandeep Singh Baines
     [not found]                   ` <20120104193614.GF9511-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-06 15:23                     ` Oleg Nesterov
2012-01-06 15:23                       ` Oleg Nesterov
     [not found]                       ` <20120106152356.GA23995-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-06 18:25                         ` Mandeep Singh Baines
2012-01-06 18:25                       ` Mandeep Singh Baines
2012-01-06 18:25                         ` Mandeep Singh Baines
     [not found]                         ` <20120106182535.GJ9511-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-11 16:07                           ` Oleg Nesterov
2012-01-11 16:07                             ` Oleg Nesterov
     [not found]                             ` <20120111160730.GA24556-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-12  0:31                               ` Mandeep Singh Baines
2012-01-12  0:31                                 ` Mandeep Singh Baines
     [not found]                                 ` <20120112003102.GB9511-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-12 17:07                                   ` Oleg Nesterov
2012-01-12 17:07                                     ` Oleg Nesterov
2012-01-12 17:57                                     ` Mandeep Singh Baines
2012-01-12 17:57                                       ` Mandeep Singh Baines
     [not found]                                       ` <20120112175725.GD9511-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-13 15:20                                         ` Oleg Nesterov
2012-01-13 15:20                                           ` Oleg Nesterov
     [not found]                                           ` <20120113152010.GA19215-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-13 18:27                                             ` Mandeep Singh Baines [this message]
2012-01-13 18:27                                               ` Mandeep Singh Baines
     [not found]                                               ` <20120113182750.GD18166-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-14 17:36                                                 ` Oleg Nesterov
2012-01-14 17:36                                                   ` Oleg Nesterov
2012-01-18 23:17                                                   ` Mandeep Singh Baines
2012-01-18 23:17                                                     ` Mandeep Singh Baines
     [not found]                                                     ` <20120118231742.GS18166-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-19 15:45                                                       ` Oleg Nesterov
2012-01-19 15:45                                                     ` Oleg Nesterov
2012-01-19 18:18                                                       ` Mandeep Singh Baines
2012-01-19 18:18                                                         ` Mandeep Singh Baines
     [not found]                                                         ` <20120119181803.GU18166-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-01-20 15:06                                                           ` Oleg Nesterov
2012-01-20 15:06                                                             ` Oleg Nesterov
2012-03-20 19:34                                                       ` Oleg Nesterov
2012-03-20 19:34                                                         ` Oleg Nesterov
     [not found]                                                         ` <20120320193414.GA21277-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-03-21 18:59                                                           ` Mandeep Singh Baines
2012-03-21 18:59                                                             ` Mandeep Singh Baines
2012-03-23 17:51                                                             ` Oleg Nesterov
2012-03-23 17:51                                                               ` Oleg Nesterov
     [not found]                                                             ` <20120321185955.GK27051-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-03-23 17:51                                                               ` Oleg Nesterov
     [not found]                                                       ` <20120119154522.GA14058-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-19 18:18                                                         ` Mandeep Singh Baines
2012-03-20 19:34                                                         ` Oleg Nesterov
     [not found]                                                   ` <20120114173648.GA32543-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-18 23:17                                                     ` Mandeep Singh Baines
     [not found]                                     ` <20120112170728.GA25717-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-01-12 17:57                                       ` Mandeep Singh Baines
2011-12-22 15:30               ` Oleg Nesterov
2011-12-21 19:01     ` Mandeep Singh Baines
2012-02-01 16:28   ` Frederic Weisbecker
2012-02-01 16:28     ` Frederic Weisbecker
     [not found]   ` <20111221130848.GA19679-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-12-21 17:56     ` Frederic Weisbecker
2011-12-21 17:59     ` Frederic Weisbecker
2011-12-21 17:59       ` Frederic Weisbecker
2011-12-21 18:11       ` Oleg Nesterov
2011-12-21 18:11         ` Oleg Nesterov
     [not found]         ` <20111221181101.GA3092-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2011-12-21 18:23           ` Frederic Weisbecker
2011-12-21 18:23         ` Frederic Weisbecker
2011-12-21 18:23           ` Frederic Weisbecker
2012-02-01 16:28     ` Frederic Weisbecker
2011-12-21 13:08 ` Oleg Nesterov
  -- strict thread matches above, loose matches on Subject: below --
2011-12-21  3:43 Frederic Weisbecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120113182750.GD18166@google.com \
    --to=msb-f7+t8e8rja9g9huczpvpmw@public.gmane.org \
    --cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
    --cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=fweisbec-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
    --cc=paul-inf54ven1CmVyaH7bEyXVA@public.gmane.org \
    --cc=paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
    --cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.