linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Glauber Costa <glommer@parallels.com>
To: Michal Hocko <mhocko@suse.cz>
Cc: Li Zefan <lizefan@huawei.com>,
	linux-mm@kvack.org, LKML <linux-kernel@vger.kernel.org>,
	Cgroups <cgroups@vger.kernel.org>, Tejun Heo <tj@kernel.org>,
	KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
	Johannes Weiner <hannes@cmpxchg.org>
Subject: Re: [RFC][PATCH 1/7] memcg: use css_get in sock_update_memcg()
Date: Fri, 5 Apr 2013 12:08:40 +0400	[thread overview]
Message-ID: <515E8688.3000504@parallels.com> (raw)
In-Reply-To: <20130403152934.GL16471@dhcp22.suse.cz>

On 04/03/2013 07:29 PM, Michal Hocko wrote:
> On Wed 03-04-13 16:58:48, Glauber Costa wrote:
>> On 04/03/2013 01:11 PM, Li Zefan wrote:
>>> Use css_get/css_put instead of mem_cgroup_get/put.
>>>
>>> Note, if at the same time someone is moving @current to a different
>>> cgroup and removing the old cgroup, css_tryget() may return false,
>>> and sock->sk_cgrp won't be initialized.
>>>
>>> Signed-off-by: Li Zefan <lizefan@huawei.com>
>>> ---
>>>  mm/memcontrol.c | 8 ++++----
>>>  1 file changed, 4 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>>> index 23d0f6e..43ca91d 100644
>>> --- a/mm/memcontrol.c
>>> +++ b/mm/memcontrol.c
>>> @@ -536,15 +536,15 @@ void sock_update_memcg(struct sock *sk)
>>>  		 */
>>>  		if (sk->sk_cgrp) {
>>>  			BUG_ON(mem_cgroup_is_root(sk->sk_cgrp->memcg));
>>> -			mem_cgroup_get(sk->sk_cgrp->memcg);
>>> +			css_get(&sk->sk_cgrp->memcg->css);
> 
> I am not sure I understand this one. So we have a goup here (which means
> that somebody already took a reference on it, right?) and we are taking
> another reference. If this is released by sock_release_memcg then who
> releases the previous one? It is not directly related to the patch
> because this has been done previously already. Could you clarify
> Glauber, please?

This should be documented in the commit that introduced this, and it was
one of the first bugs I've handled with this code.

Bottom line, we can create sockets normally, and those will have process
context. But we also can create sockets by cloning existing sockets. To
the best of my knowledge, this is done by things like accept().

Because those sockets are a clone of their ancestors, they also belong
to a workload that should be limited. Also note that because they have
cgroup context, we will eventually try to put them. So we need to grab
an extra reference.

socket_update_cgroup is always called at socket creation, and the
original structures are filled with zeroes. Therefore cloning is the
*only* path that takes us here with sk->sk_cgroup filled.

My comment right above this excerpt states:

                /* Socket cloning can throw us here with sk_cgrp already
                 * filled. It won't however, necessarily happen from
                 * process context. So the test for root memcg given
                 * the current task's memcg won't help us in this case.
                 *
                 * Respecting the original socket's memcg is a better
                 * decision in this case.
                 */

> 
>>>  			return;
>>>  		}
>>>  
>>>  		rcu_read_lock();
>>>  		memcg = mem_cgroup_from_task(current);
>>>  		cg_proto = sk->sk_prot->proto_cgroup(memcg);
>>> -		if (!mem_cgroup_is_root(memcg) && memcg_proto_active(cg_proto)) {
>>> -			mem_cgroup_get(memcg);
>>> +		if (!mem_cgroup_is_root(memcg) &&
>>> +		    memcg_proto_active(cg_proto) && css_tryget(&memcg->css)) {
>>>  			sk->sk_cgrp = cg_proto;
>>>  		}
>>
>> What happens if this tryget fails ? Won't we leak a reference here? We
>> will put regardless when the socket is released, and this may go
>> negative. No?
>  
> AFAICS sock_release_memcg releases the reference only if sk->sk_cgrp and
> that one wouldn't be set if css_tryget fails.
> 

Yes, this is totally fine. I was actually thinking of the same socket
cloning I mentioned above. We cannot fail that path because we already
have an "implicit" reference, we just need to officially mark it.

Failing here is indeed fine. Future cloned sockets from this socket will
have NULL cgroup context as well.


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2013-04-05  8:08 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-03  9:11 [RFC][PATCH 0/7] memcg: make memcg's life cycle the same as cgroup Li Zefan
2013-04-03  9:11 ` [RFC][PATCH 1/7] memcg: use css_get in sock_update_memcg() Li Zefan
2013-04-03 12:58   ` Glauber Costa
2013-04-03 15:29     ` Michal Hocko
2013-04-05  8:08       ` Glauber Costa [this message]
2013-04-05 13:38         ` Michal Hocko
2013-04-05 13:42           ` Glauber Costa
2013-04-05  5:01   ` Kamezawa Hiroyuki
2013-04-05 13:39   ` Michal Hocko
2013-04-03  9:12 ` [RFC][PATCH 2/7] memcg: don't use mem_cgroup_get() when creating a kmemcg cache Li Zefan
2013-04-03 13:05   ` Glauber Costa
2013-04-03 15:31   ` Michal Hocko
2013-04-05 10:28     ` Glauber Costa
2013-04-05 13:45       ` Michal Hocko
2013-04-07  3:32         ` Li Zefan
2013-04-05  5:51   ` Kamezawa Hiroyuki
2013-04-05 13:46     ` Michal Hocko
2013-04-03  9:12 ` [RFC][PATCH 3/7] memcg: use css_get/put when charging/uncharging kmem Li Zefan
2013-04-04  9:43   ` Michal Hocko
2013-04-05 10:19     ` Glauber Costa
2013-04-05 13:48       ` Michal Hocko
2013-04-05 10:19   ` Glauber Costa
2013-04-03  9:12 ` [RFC][PATCH 4/7] memcg: use css_get/put for swap memcg Li Zefan
2013-04-04 11:25   ` Michal Hocko
2013-04-05  5:56   ` Kamezawa Hiroyuki
2013-04-03  9:13 ` [RFC][PATCH 5/7] cgroup: make sure parent won't be destroyed before its children Li Zefan
2013-04-04 11:37   ` Michal Hocko
2013-04-04 13:53     ` Tejun Heo
2013-04-04 15:20       ` Michal Hocko
2013-04-04 15:22         ` Tejun Heo
2013-04-04 15:30           ` Michal Hocko
2013-04-05  8:10           ` Glauber Costa
2013-04-04 15:31   ` Michal Hocko
2013-04-05  5:58   ` Kamezawa Hiroyuki
2013-04-03  9:13 ` [RFC][PATCH 6/7] memcg: don't need to get a reference to the parent Li Zefan
2013-04-04 15:34   ` Michal Hocko
2013-04-05  9:22   ` Kamezawa Hiroyuki
2013-04-03  9:14 ` [RFC][PATCH 7/7] memcg: kill memcg refcnt Li Zefan
2013-04-04 15:35   ` Michal Hocko
2013-04-05  9:24   ` Kamezawa Hiroyuki
2013-04-03  9:19 ` [RFC][PATCH 0/7] memcg: make memcg's life cycle the same as cgroup Glauber Costa
2013-04-03 21:43 ` Tejun Heo
2013-04-04 12:00 ` Michal Hocko
2013-04-07  6:00   ` Li Zefan
2013-04-07 20:21     ` Michal Hocko
2013-04-07  8:44 ` Li Zefan
2013-04-07 19:51   ` Michal Hocko
2013-04-08  7:18   ` Glauber Costa

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=515E8688.3000504@parallels.com \
    --to=glommer@parallels.com \
    --cc=cgroups@vger.kernel.org \
    --cc=hannes@cmpxchg.org \
    --cc=kamezawa.hiroyu@jp.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=lizefan@huawei.com \
    --cc=mhocko@suse.cz \
    --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).