From: Tejun Heo <tj@kernel.org>
To: Li Zefan <lizefan@huawei.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Glauber Costa <glommer@parallels.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Johannes Weiner <hannes@cmpxchg.org>,
LKML <linux-kernel@vger.kernel.org>,
Cgroups <cgroups@vger.kernel.org>,
linux-mm@kvack.org
Subject: Re: [PATCH 5/9] memcg: use css_get/put when charging/uncharging kmem
Date: Fri, 17 May 2013 11:08:22 -0700 [thread overview]
Message-ID: <20130517180822.GC12632@mtj.dyndns.org> (raw)
In-Reply-To: <5195D666.6030408@huawei.com>
Hey,
On Fri, May 17, 2013 at 03:04:06PM +0800, Li Zefan wrote:
> + /*
> + * Releases a reference taken in kmem_cgroup_css_offline in case
> + * this last uncharge is racing with the offlining code or it is
> + * outliving the memcg existence.
> + *
> + * The memory barrier imposed by test&clear is paired with the
> + * explicit one in kmem_cgroup_css_offline.
Paired with the wmb to achieve what?
> + */
> if (memcg_kmem_test_and_clear_dead(memcg))
> - mem_cgroup_put(memcg);
> + css_put(&memcg->css);
The other side is wmb, so there gotta be something which wants to read
which were written before wmb here but the only thing after the
barrier is css_put() which doesn't need such thing, so I'm lost on
what the barrier pair is achieving here.
In general, please be *very* explicit about what's going on whenever
something is depending on barrier pairs. It'll make it easier for
both the author and reviewers to actually understand what's going on
and why it's necessary.
...
> @@ -5858,23 +5856,39 @@ static int memcg_init_kmem(struct mem_cgroup *memcg, struct cgroup_subsys *ss)
> return mem_cgroup_sockets_init(memcg, ss);
> }
>
> -static void kmem_cgroup_destroy(struct mem_cgroup *memcg)
> +static void kmem_cgroup_css_offline(struct mem_cgroup *memcg)
> {
> - mem_cgroup_sockets_destroy(memcg);
> + if (!memcg_kmem_is_active(memcg))
> + return;
>
> + /*
> + * kmem charges can outlive the cgroup. In the case of slab
> + * pages, for instance, a page contain objects from various
> + * processes. As we prevent from taking a reference for every
> + * such allocation we have to be careful when doing uncharge
> + * (see memcg_uncharge_kmem) and here during offlining.
> + *
> + * The idea is that that only the _last_ uncharge which sees
> + * the dead memcg will drop the last reference. An additional
> + * reference is taken here before the group is marked dead
> + * which is then paired with css_put during uncharge resp. here.
> + *
> + * Although this might sound strange as this path is called when
> + * the reference has already dropped down to 0 and shouldn't be
> + * incremented anymore (css_tryget would fail) we do not have
Hmmm? offline is called on cgroup destruction regardless of css
refcnt. The above comment seems a bit misleading.
> + * other options because of the kmem allocations lifetime.
> + */
> + css_get(&memcg->css);
> +
> + /* see comment in memcg_uncharge_kmem() */
> + wmb();
> memcg_kmem_mark_dead(memcg);
Is the wmb() trying to prevent reordering between css_get() and
memcg_kmem_mark_dead()? If so, it isn't necessary - the compiler
isn't allowed to reorder two atomic ops (they're all asm volatiles)
and the visibility order is guaranteed by the nature of the two
operations going on here - both perform modify-and-test on one end of
the operations.
It could be argued that having memory barriers is better for
completeness of mark/test interface but then those barriers should
really moved into memcg_kmem_mark_dead() and its clearing counterpart.
While it's all clever and dandy, my recommendation would be just using
a lock for synchronization. It isn't a hot path. Why be clever?
Thanks.
--
tejun
--
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>
next prev parent reply other threads:[~2013-05-17 18:08 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-17 7:02 [PATCH 0/12][V3] memcg: make memcg's life cycle the same as cgroup Li Zefan
2013-05-17 7:03 ` [PATCH 1/9] Revert "memcg: avoid dangling reference count in creation failure." Li Zefan
2013-05-17 7:03 ` [PATCH 2/9] memcg, kmem: fix reference count handling on the error path Li Zefan
2013-05-17 7:03 ` [PATCH 3/9] memcg: use css_get() in sock_update_memcg() Li Zefan
2013-05-17 7:03 ` [PATCH 4/9] memcg: don't use mem_cgroup_get() when creating a kmemcg cache Li Zefan
2013-05-17 7:04 ` [PATCH 5/9] memcg: use css_get/put when charging/uncharging kmem Li Zefan
2013-05-17 18:08 ` Tejun Heo [this message]
2013-05-22 8:36 ` Li Zefan
2013-05-24 7:54 ` Michal Hocko
2013-05-30 5:48 ` Tejun Heo
2013-05-30 15:12 ` Michal Hocko
2013-05-17 7:04 ` [PATCH 6/9] memcg: use css_get/put for swap memcg Li Zefan
2013-05-17 7:04 ` [PATCH 7/9] memcg: don't need to get a reference to the parent Li Zefan
2013-05-17 7:05 ` [PATCH 8/9] memcg: kill memcg refcnt Li Zefan
2013-05-17 7:05 ` [PATCH 9/9] memcg: don't need to free memcg via RCU or workqueue Li Zefan
2013-05-17 7:06 ` [PATCH 0/12][V3] memcg: make memcg's life cycle the same as cgroup Li Zefan
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=20130517180822.GC12632@mtj.dyndns.org \
--to=tj@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=cgroups@vger.kernel.org \
--cc=glommer@parallels.com \
--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 \
/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).