From: Roman Gushchin <guro@fb.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Roman Gushchin <guroan@gmail.com>, Tejun Heo <tj@kernel.org>,
"Dan Carpenter" <dan.carpenter@oracle.com>,
Mike Rapoport <rppt@linux.vnet.ibm.com>,
"cgroups@vger.kernel.org" <cgroups@vger.kernel.org>,
"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Kernel Team <Kernel-team@fb.com>
Subject: Re: [PATCH v5 4/7] cgroup: cgroup v2 freezer
Date: Thu, 20 Dec 2018 21:43:47 +0000 [thread overview]
Message-ID: <20181220214338.GA16795@tower.DHCP.thefacebook.com> (raw)
In-Reply-To: <20181220161649.GA31865@redhat.com>
On Thu, Dec 20, 2018 at 05:16:50PM +0100, Oleg Nesterov wrote:
> On 12/18, Roman Gushchin wrote:
> >
> > > > > > --- a/kernel/freezer.c
> > > > > > +++ b/kernel/freezer.c
> > > > > > @@ -134,7 +134,7 @@ bool freeze_task(struct task_struct *p)
> > > > > > return false;
> > > > > >
> > > > > > spin_lock_irqsave(&freezer_lock, flags);
> > > > > > - if (!freezing(p) || frozen(p)) {
> > > > > > + if (!freezing(p) || frozen(p) || cgroup_task_frozen()) {
> > > > > > spin_unlock_irqrestore(&freezer_lock, flags);
> > > > > > return false;
> > > > > > }
> > > > > >
> > > > > > --
> > > > > >
> > > > > > If the task is already frozen by the cgroup freezer, we don't have to do
> > > > > > anything additionally.
> > > > >
> > > > > I don't think so. A cgroup_task_frozen() task can be killed after
> > > > > try_to_freeze_tasks() succeeds, and the exiting task can close files,
> > > > > do IO, etc. Or it can be thawed by cgroup_freeze_task(false).
> > > > >
> > > > > In short, if try_to_freeze_tasks() succeeds, the caller has all rights
> > > > > to assume that nobody can escape from __refrigerator().
> > > >
> > > > But this is what we do with stopped and ptraced tasks, isn't it?
> > >
> > > No,
> > >
> > > > We do use freezable_schedule() and the system freezer just ignores such tasks.
> > >
> > > static inline void freezable_schedule(void)
> > > {
> > > freezer_do_not_count();
> > > schedule();
> > > freezer_count();
> > > }
> > >
> > > and note that freezer_count() calls try_to_freeze().
> > >
> > > IOW, the task sleeping in freezable_schedule() doesn't really differ from the
> > > task sleeping in __refrigerator(). It is not that "the system freezer just
> > > ignores such tasks", it ignores them because it can safely count them as frozen.
> >
> > Right, so the task is sleeping peacefully, and we know, that it won't get
> > anywhere, because we'll catch it in freezer_count(). We allow it to sleep
> > there, we don't force it to __refrigerator(), and we treat it as frozen.
> >
> > How's that different to cgroup v2 freezer? If the task is frozen by cgroup v2
> > freezer, let it sleep there, and catch if it tries to escape. Exactly as it
> > works for SIGSTOP.
> >
> > Am I missing something?
>
> Roman, perhaps we misunderstood each other...
>
> I still think that the cgroup_task_frozen() check in freeze_task() you proposed
> a) is not right, and b) it is not what we do with the STOPPED/TRACED tasks which
> call freezable_schedule(). This is what I tried to say.
>
> If you meant that freezer v2 can too use freezable_schedule() - I agree.
Sorry for the confusion. Yeah, what I'm saying, is that freezable_schedule()
will work for v2 as well.
>
> > So, you think that v2 freezer should follow the same approach, and allow tasks
> > sleeping on SIGSTOP, for instance, to be treated as frozen?
> > Hm, maybe. I have to think more here.
>
> I think this would be nice. Otherwise, say, CGRP_FREEZE can be never reported
> if I read this code correctly. And this looks "symmetrical" with the fact that
> a ->frozen task reacts to SIGSTOP and it is still treated as frozen after that.
Yeah, looks so. I'll try to implement this in v6.
Thanks!
next prev parent reply other threads:[~2018-12-20 21:44 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-07 20:15 [PATCH v5 0/7] freezer for cgroup v2 Roman Gushchin
2018-12-07 20:15 ` [PATCH v5 1/7] cgroup: rename freezer.c into legacy_freezer.c Roman Gushchin
2018-12-07 20:15 ` [PATCH v5 2/7] cgroup: implement __cgroup_task_count() helper Roman Gushchin
2018-12-07 20:15 ` [PATCH v5 3/7] cgroup: protect cgroup->nr_(dying_)descendants by css_set_lock Roman Gushchin
2018-12-07 20:15 ` [PATCH v5 4/7] cgroup: cgroup v2 freezer Roman Gushchin
2018-12-11 16:26 ` Oleg Nesterov
2018-12-11 18:40 ` Roman Gushchin
2018-12-12 17:49 ` Oleg Nesterov
2018-12-18 1:28 ` Roman Gushchin
2018-12-18 17:12 ` Oleg Nesterov
2018-12-18 20:27 ` Roman Gushchin
2018-12-20 16:16 ` Oleg Nesterov
2018-12-20 21:43 ` Roman Gushchin [this message]
2018-12-07 20:15 ` [PATCH v5 5/7] kselftests: cgroup: don't fail on cg_kill_all() error in cg_destroy() Roman Gushchin
2018-12-07 20:15 ` [PATCH v5 6/7] kselftests: cgroup: add freezer controller self-tests Roman Gushchin
2018-12-07 20:15 ` [PATCH v5 7/7] cgroup: document cgroup v2 freezer interface Roman Gushchin
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=20181220214338.GA16795@tower.DHCP.thefacebook.com \
--to=guro@fb.com \
--cc=Kernel-team@fb.com \
--cc=cgroups@vger.kernel.org \
--cc=dan.carpenter@oracle.com \
--cc=guroan@gmail.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=rppt@linux.vnet.ibm.com \
--cc=tj@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).