From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
rjw-KKrjLPT3xs0@public.gmane.org,
cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH 2/7] freezer: add missing mb's to freezer_count() and freezer_should_skip()
Date: Mon, 22 Oct 2012 17:13:17 -0400 [thread overview]
Message-ID: <20121022211317.GD5951@atj.dyndns.org> (raw)
In-Reply-To: <20121022174404.GA21553-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Hello, Oleg.
On Mon, Oct 22, 2012 at 07:44:04PM +0200, Oleg Nesterov wrote:
> > static inline void freezer_count(void)
> > {
> > current->flags &= ~PF_FREEZER_SKIP;
> > + /*
> > + * If freezing is in progress, the following paired with smp_mb()
> > + * in freezer_should_skip() ensures that either we see %true
> > + * freezing() or freezer_should_skip() sees !PF_FREEZER_SKIP.
> > + */
> > + smp_mb();
> > try_to_freeze();
>
> I agree, this looks like a bug fix.
Yeah, and this isn't dangerous at all. I'll ping -stable.
> > -static inline int freezer_should_skip(struct task_struct *p)
> > +static inline bool freezer_should_skip(struct task_struct *p)
> > {
> > - return !!(p->flags & PF_FREEZER_SKIP);
> > + /*
> > + * The following smp_mb() paired with the one in freezer_count()
> > + * ensures that either freezer_count() sees %true freezing() or we
> > + * see cleared %PF_FREEZER_SKIP and return %false. This makes it
> > + * impossible for a task to slip frozen state testing after
> > + * clearing %PF_FREEZER_SKIP.
> > + */
> > + smp_mb();
> > + return p->flags & PF_FREEZER_SKIP;
> > }
>
> I am not sure we really need smp_mb() here. Speaking of cgroup_freezer,
> it seems that a single mb() after "->state = CGROUP_FREEZING" should be
> enough.
Hmmm... I agree pairing there would work too.
> But even if I am right, I agree that it looks better in freezer_should_skip()
> and this is more robust.
But, yeah, performance implications at this level are almost
completely irrelavent here and I think pairing freezer_should_skip()
is easier to read.
> So I think the patch is fine and fixes the bug.
Awesome.
> We probably have another similar race. If ptrace_stop()->may_ptrace_stop()
> returns false, the task does
>
> __set_current_state(TASK_RUNNING);
> // no mb in between
> try_to_freeze();
>
> And this can race with task_is_stopped_or_traced() check in the same way.
> (of course this is only theoretical).
>
> do_signal_stop() is probably fine, we can rely on ->siglock.
Hmm.... Guess we should drop __ from set_current_state. I wonder
whether we should just add mb to freezing()? What do you think?
Thanks.
--
tejun
WARNING: multiple messages have this Message-ID (diff)
From: Tejun Heo <tj@kernel.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: rjw@sisk.pl, linux-kernel@vger.kernel.org, lizefan@huawei.com,
containers@lists.linux-foundation.org, cgroups@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH 2/7] freezer: add missing mb's to freezer_count() and freezer_should_skip()
Date: Mon, 22 Oct 2012 17:13:17 -0400 [thread overview]
Message-ID: <20121022211317.GD5951@atj.dyndns.org> (raw)
In-Reply-To: <20121022174404.GA21553@redhat.com>
Hello, Oleg.
On Mon, Oct 22, 2012 at 07:44:04PM +0200, Oleg Nesterov wrote:
> > static inline void freezer_count(void)
> > {
> > current->flags &= ~PF_FREEZER_SKIP;
> > + /*
> > + * If freezing is in progress, the following paired with smp_mb()
> > + * in freezer_should_skip() ensures that either we see %true
> > + * freezing() or freezer_should_skip() sees !PF_FREEZER_SKIP.
> > + */
> > + smp_mb();
> > try_to_freeze();
>
> I agree, this looks like a bug fix.
Yeah, and this isn't dangerous at all. I'll ping -stable.
> > -static inline int freezer_should_skip(struct task_struct *p)
> > +static inline bool freezer_should_skip(struct task_struct *p)
> > {
> > - return !!(p->flags & PF_FREEZER_SKIP);
> > + /*
> > + * The following smp_mb() paired with the one in freezer_count()
> > + * ensures that either freezer_count() sees %true freezing() or we
> > + * see cleared %PF_FREEZER_SKIP and return %false. This makes it
> > + * impossible for a task to slip frozen state testing after
> > + * clearing %PF_FREEZER_SKIP.
> > + */
> > + smp_mb();
> > + return p->flags & PF_FREEZER_SKIP;
> > }
>
> I am not sure we really need smp_mb() here. Speaking of cgroup_freezer,
> it seems that a single mb() after "->state = CGROUP_FREEZING" should be
> enough.
Hmmm... I agree pairing there would work too.
> But even if I am right, I agree that it looks better in freezer_should_skip()
> and this is more robust.
But, yeah, performance implications at this level are almost
completely irrelavent here and I think pairing freezer_should_skip()
is easier to read.
> So I think the patch is fine and fixes the bug.
Awesome.
> We probably have another similar race. If ptrace_stop()->may_ptrace_stop()
> returns false, the task does
>
> __set_current_state(TASK_RUNNING);
> // no mb in between
> try_to_freeze();
>
> And this can race with task_is_stopped_or_traced() check in the same way.
> (of course this is only theoretical).
>
> do_signal_stop() is probably fine, we can rely on ->siglock.
Hmm.... Guess we should drop __ from set_current_state. I wonder
whether we should just add mb to freezing()? What do you think?
Thanks.
--
tejun
next prev parent reply other threads:[~2012-10-22 21:13 UTC|newest]
Thread overview: 148+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-16 22:28 [PATCHSET cgroup/for-3.8] cgroup_freezer: allow migration regardless of freezer state and update locking Tejun Heo
2012-10-16 22:28 ` Tejun Heo
[not found] ` <1350426526-14254-1-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-10-16 22:28 ` [PATCH 1/7] cgroup: cgroup_subsys->fork() should be called after the task is added to css_set Tejun Heo
2012-10-16 22:28 ` Tejun Heo
[not found] ` <1350426526-14254-2-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-10-17 8:28 ` Li Zefan
2012-10-17 8:28 ` Li Zefan
[not found] ` <507E6C4B.6000704-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2012-10-18 1:25 ` Li Zefan
2012-10-18 1:25 ` Li Zefan
2012-10-18 1:25 ` Li Zefan
2012-10-21 19:11 ` Oleg Nesterov
2012-10-21 19:11 ` Oleg Nesterov
[not found] ` <20121021191141.GA26218-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-21 19:22 ` Tejun Heo
2012-10-21 19:22 ` Tejun Heo
[not found] ` <20121021192222.GB5951-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-22 18:04 ` Oleg Nesterov
2012-10-22 18:04 ` Oleg Nesterov
[not found] ` <20121022180445.GB21553-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-22 21:16 ` Tejun Heo
2012-10-22 21:16 ` Tejun Heo
[not found] ` <20121022211631.GE5951-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-23 15:51 ` Oleg Nesterov
2012-10-23 15:51 ` Oleg Nesterov
[not found] ` <20121023155128.GB16201-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-24 19:04 ` Tejun Heo
2012-10-24 19:04 ` Tejun Heo
[not found] ` <20121024190458.GB12182-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-25 17:42 ` Oleg Nesterov
2012-10-25 17:42 ` Oleg Nesterov
2012-10-21 19:22 ` Tejun Heo
2012-12-20 5:25 ` Herton Ronaldo Krzesinski
2012-12-20 5:25 ` Herton Ronaldo Krzesinski
2012-12-28 21:22 ` [PATCH] cgroup: remove unused dummy cgroup_fork_callbacks() Tejun Heo
2012-12-28 21:22 ` Tejun Heo
2012-10-16 22:28 ` [PATCH 2/7] freezer: add missing mb's to freezer_count() and freezer_should_skip() Tejun Heo
2012-10-16 22:28 ` Tejun Heo
[not found] ` <1350426526-14254-3-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-10-22 17:44 ` Oleg Nesterov
2012-10-22 17:44 ` Oleg Nesterov
[not found] ` <20121022174404.GA21553-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-22 21:13 ` Tejun Heo [this message]
2012-10-22 21:13 ` Tejun Heo
[not found] ` <20121022211317.GD5951-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-23 15:39 ` Oleg Nesterov
2012-10-23 15:39 ` Oleg Nesterov
[not found] ` <20121023153919.GA16201-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-24 18:57 ` Tejun Heo
2012-10-24 18:57 ` Tejun Heo
2012-10-24 18:57 ` Tejun Heo
[not found] ` <20121024185710.GA12182-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-25 16:39 ` [PATCH 0/1] (Was: freezer: add missing mb's to freezer_count() and freezer_should_skip()) Oleg Nesterov
2012-10-25 16:39 ` Oleg Nesterov
[not found] ` <20121025163941.GA3801-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-25 16:39 ` [PATCH 1/1] freezer: change ptrace_stop/do_signal_stop to use freezable_schedule() Oleg Nesterov
2012-10-25 16:39 ` Oleg Nesterov
[not found] ` <20121025163959.GB3801-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-25 17:18 ` Tejun Heo
2012-10-25 17:18 ` Tejun Heo
[not found] ` <20121025171812.GE11442-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-10-25 17:34 ` Oleg Nesterov
2012-10-25 17:34 ` Oleg Nesterov
2012-10-25 17:34 ` Oleg Nesterov
[not found] ` <20121025173433.GA7650-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-25 17:36 ` Tejun Heo
2012-10-25 17:36 ` Tejun Heo
[not found] ` <20121025173632.GI11442-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-10-26 17:45 ` [PATCH v2 0/1] " Oleg Nesterov
2012-10-26 17:45 ` Oleg Nesterov
[not found] ` <20121026174545.GA21639-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-26 17:46 ` [PATCH v2 1/1] " Oleg Nesterov
2012-10-26 17:46 ` Oleg Nesterov
[not found] ` <20121026174606.GB21639-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-26 17:52 ` Tejun Heo
2012-10-26 17:52 ` Tejun Heo
[not found] ` <20121026175258.GV11442-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-10-26 18:01 ` Oleg Nesterov
2012-10-26 18:01 ` Oleg Nesterov
2012-10-26 18:01 ` Oleg Nesterov
[not found] ` <20121026180149.GA22421-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-26 21:14 ` Rafael J. Wysocki
2012-10-26 21:14 ` Rafael J. Wysocki
2012-10-26 21:14 ` Rafael J. Wysocki
[not found] ` <2566006.UzAQbpOjNQ-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2012-10-26 21:29 ` Rafael J. Wysocki
2012-10-26 21:29 ` Rafael J. Wysocki
[not found] ` <2718983.vORnrfWdbE-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2012-10-26 21:29 ` Tejun Heo
2012-10-26 21:29 ` Tejun Heo
2012-10-26 21:29 ` Tejun Heo
[not found] ` <20121026212909.GW11442-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-10-28 0:16 ` Rafael J. Wysocki
2012-10-28 0:16 ` Rafael J. Wysocki
2012-10-28 0:16 ` Rafael J. Wysocki
2012-10-27 22:22 ` Ben Hutchings
2012-10-27 22:22 ` Ben Hutchings
2012-10-27 22:22 ` Ben Hutchings
[not found] ` <1351376558.21585.1.camel-nDn/Rdv9kqW9Jme8/bJn5UCKIB8iOfG2tUK59QYPAWc@public.gmane.org>
2012-10-28 13:45 ` Oleg Nesterov
2012-10-28 13:45 ` Oleg Nesterov
2012-10-25 17:18 ` [PATCH " Tejun Heo
2012-10-16 22:28 ` [PATCH 3/7] cgroup_freezer: make it official that writes to freezer.state don't fail Tejun Heo
2012-10-16 22:28 ` Tejun Heo
2012-10-16 22:28 ` [PATCH 4/7] cgroup_freezer: don't stall transition to FROZEN for PF_NOFREEZE or PF_FREEZER_SKIP tasks Tejun Heo
2012-10-16 22:28 ` Tejun Heo
[not found] ` <1350426526-14254-5-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-10-22 18:34 ` Oleg Nesterov
2012-10-22 18:34 ` Oleg Nesterov
2012-10-22 18:34 ` Oleg Nesterov
[not found] ` <20121022183453.GA24687-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-22 21:18 ` Tejun Heo
2012-10-22 21:18 ` Tejun Heo
[not found] ` <20121022211822.GF5951-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-23 15:55 ` Oleg Nesterov
2012-10-23 15:55 ` Oleg Nesterov
[not found] ` <20121023155533.GC16201-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-24 19:06 ` Tejun Heo
2012-10-24 19:06 ` Tejun Heo
[not found] ` <20121024190651.GC12182-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-25 17:12 ` [PATCH 0/1] (Was: cgroup_freezer: don't stall transition to FROZEN for PF_NOFREEZE or PF_FREEZER_SKIP tasks) Oleg Nesterov
2012-10-25 17:12 ` Oleg Nesterov
[not found] ` <20121025171236.GA6776-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-25 17:12 ` [PATCH 1/1] freezer: exec should clear PF_NOFREEZE along with PF_KTHREAD Oleg Nesterov
2012-10-25 17:12 ` Oleg Nesterov
[not found] ` <20121025171256.GB6776-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-25 17:20 ` Tejun Heo
2012-10-25 17:20 ` Tejun Heo
2012-10-25 17:20 ` Tejun Heo
[not found] ` <20121025172016.GF11442-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-10-25 17:37 ` Oleg Nesterov
2012-10-25 17:37 ` Oleg Nesterov
[not found] ` <20121025173756.GB7650-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-25 17:37 ` Tejun Heo
2012-10-25 17:37 ` Tejun Heo
[not found] ` <CAOS58YPAVVr=itauGD9eTpfRLSBLuM8Bpyuq9AP73MDr8dPmiQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-10-25 20:13 ` Rafael J. Wysocki
2012-10-25 20:13 ` Rafael J. Wysocki
2012-10-23 15:55 ` [PATCH 4/7] cgroup_freezer: don't stall transition to FROZEN for PF_NOFREEZE or PF_FREEZER_SKIP tasks Oleg Nesterov
2012-10-16 22:28 ` [PATCH 5/7] cgroup_freezer: allow moving tasks in and out of a frozen cgroup Tejun Heo
2012-10-16 22:28 ` [PATCH 6/7] cgroup_freezer: prepare update_if_frozen() for locking change Tejun Heo
2012-10-16 22:28 ` Tejun Heo
2012-10-16 22:28 ` [PATCH 7/7] cgroup_freezer: don't use cgroup_lock_live_group() Tejun Heo
2012-10-16 22:28 ` Tejun Heo
2012-10-17 19:16 ` [PATCHSET cgroup/for-3.8] cgroup_freezer: allow migration regardless of freezer state and update locking Matt Helsley
2012-10-17 19:16 ` Matt Helsley
[not found] ` <20121017191606.GA6223-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2012-10-18 21:14 ` Tejun Heo
2012-10-18 21:14 ` Tejun Heo
[not found] ` <20121018211434.GI13370-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-18 22:21 ` Matt Helsley
2012-10-18 22:21 ` Matt Helsley
[not found] ` <20121018222155.GB6223-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2012-10-18 22:35 ` Tejun Heo
2012-10-18 22:35 ` Tejun Heo
[not found] ` <20121018223517.GQ13370-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-18 23:47 ` Matt Helsley
2012-10-18 23:47 ` Matt Helsley
[not found] ` <20121018234726.GC6223-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2012-10-19 0:01 ` Tejun Heo
2012-10-19 0:01 ` Tejun Heo
2012-10-19 0:01 ` Tejun Heo
[not found] ` <20121019000153.GZ13370-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-19 1:29 ` Matt Helsley
2012-10-19 1:29 ` Matt Helsley
2012-10-19 1:29 ` Matt Helsley
[not found] ` <20121019012945.GD6223-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2012-10-19 20:02 ` Tejun Heo
2012-10-19 20:02 ` Tejun Heo
2012-10-19 20:02 ` Tejun Heo
2012-10-18 21:14 ` Tejun Heo
2012-10-19 16:54 ` Rafael J. Wysocki
2012-10-19 16:54 ` Rafael J. Wysocki
[not found] ` <2424755.Pg0O5tTD3k-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2012-10-19 20:04 ` Tejun Heo
2012-10-19 20:04 ` Tejun Heo
2012-10-19 20:04 ` Tejun Heo
[not found] ` <20121019200421.GO13370-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-10-21 19:18 ` Oleg Nesterov
2012-10-21 19:18 ` Oleg Nesterov
[not found] ` <20121021191853.GB26218-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-21 19:24 ` Tejun Heo
2012-10-21 19:24 ` Tejun Heo
2012-10-19 16:54 ` Rafael J. Wysocki
2012-10-16 22:28 ` [PATCH 5/7] cgroup_freezer: allow moving tasks in and out of a frozen cgroup Tejun Heo
[not found] ` <1350426526-14254-6-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-10-22 19:25 ` Oleg Nesterov
2012-10-22 19:25 ` Oleg Nesterov
[not found] ` <20121022192506.GA27163-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-10-22 21:25 ` Tejun Heo
2012-10-22 21:25 ` Tejun Heo
[not found] ` <20121022212505.GG5951-OlzNCW9NnSVy/B6EtB590w@public.gmane.org>
2012-10-23 16:14 ` Oleg Nesterov
2012-10-23 16:14 ` Oleg Nesterov
2012-10-23 16:14 ` Oleg Nesterov
2012-10-22 21:25 ` Tejun Heo
2012-10-22 19:25 ` Oleg Nesterov
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=20121022211317.GD5951@atj.dyndns.org \
--to=tj-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=rjw-KKrjLPT3xs0@public.gmane.org \
--cc=stable-u79uwXL29TY76Z2rM5mHXA@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.