From: Vladimir Davydov <vdavydov-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>
To: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
Cc: linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org,
Michal Hocko <mhocko-AlSwsSmVLrQ@public.gmane.org>,
Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [patch v2] mm: memcontrol: convert reclaim iterator to simple css refcounting
Date: Mon, 22 Sep 2014 13:53:21 +0400 [thread overview]
Message-ID: <20140922095321.GA20398@esperanza> (raw)
In-Reply-To: <20140919212843.GA23861-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
On Fri, Sep 19, 2014 at 05:28:43PM -0400, Johannes Weiner wrote:
> The memcg reclaim iterators use a complicated weak reference scheme to
> prevent pinning cgroups indefinitely in the absence of memory pressure.
>
> However, during the ongoing cgroup core rework, css lifetime has been
> decoupled such that a pinned css no longer interferes with removal of
> the user-visible cgroup, and all this complexity is now unnecessary.
>
> Signed-off-by: Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
> ---
> mm/memcontrol.c | 201 ++++++++++----------------------------------------------
> 1 file changed, 34 insertions(+), 167 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
[...]
> -static void mem_cgroup_iter_invalidate(struct mem_cgroup *root)
> -{
> - /*
> - * When a group in the hierarchy below root is destroyed, the
> - * hierarchy iterator can no longer be trusted since it might
> - * have pointed to the destroyed group. Invalidate it.
> - */
> - atomic_inc(&root->dead_count);
After your patch is applied, mem_cgroup->dead_count is not used any
more. Please remove it.
[...]
> @@ -1300,8 +1183,11 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> struct mem_cgroup *prev,
> struct mem_cgroup_reclaim_cookie *reclaim)
> {
> + struct mem_cgroup_per_zone *uninitialized_var(mz);
> + struct cgroup_subsys_state *css = NULL;
> + int uninitialized_var(priority);
> struct mem_cgroup *memcg = NULL;
> - struct mem_cgroup *last_visited = NULL;
> + struct mem_cgroup *pos = NULL;
>
> if (mem_cgroup_disabled())
> return NULL;
> @@ -1310,50 +1196,51 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> root = root_mem_cgroup;
>
> if (prev && !reclaim)
> - last_visited = prev;
> + pos = prev;
>
> if (!root->use_hierarchy && root != root_mem_cgroup) {
> if (prev)
> - goto out_css_put;
> + goto out;
> return root;
> }
>
> rcu_read_lock();
> - while (!memcg) {
> - struct mem_cgroup_reclaim_iter *uninitialized_var(iter);
> - int uninitialized_var(seq);
>
> - if (reclaim) {
> - struct mem_cgroup_per_zone *mz;
> + if (reclaim) {
> + mz = mem_cgroup_zone_zoneinfo(root, reclaim->zone);
> + priority = reclaim->priority;
>
> - mz = mem_cgroup_zone_zoneinfo(root, reclaim->zone);
> - iter = &mz->reclaim_iter[reclaim->priority];
> - if (prev && reclaim->generation != iter->generation) {
Again, you are removing all generation checks, but leaving
mem_cgroup_reclaim_cookie->generation defined. Please remove it too.
BTW, don't we still need the generation check to eliminate the
possibility of a process iterating infinitely over a memory cgroup tree
in case of concurrent reclaim?
Thanks,
Vladimir
WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Davydov <vdavydov@parallels.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: linux-mm@kvack.org, Michal Hocko <mhocko@suse.cz>,
Tejun Heo <tj@kernel.org>,
cgroups@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [patch v2] mm: memcontrol: convert reclaim iterator to simple css refcounting
Date: Mon, 22 Sep 2014 13:53:21 +0400 [thread overview]
Message-ID: <20140922095321.GA20398@esperanza> (raw)
In-Reply-To: <20140919212843.GA23861@cmpxchg.org>
On Fri, Sep 19, 2014 at 05:28:43PM -0400, Johannes Weiner wrote:
> The memcg reclaim iterators use a complicated weak reference scheme to
> prevent pinning cgroups indefinitely in the absence of memory pressure.
>
> However, during the ongoing cgroup core rework, css lifetime has been
> decoupled such that a pinned css no longer interferes with removal of
> the user-visible cgroup, and all this complexity is now unnecessary.
>
> Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
> ---
> mm/memcontrol.c | 201 ++++++++++----------------------------------------------
> 1 file changed, 34 insertions(+), 167 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
[...]
> -static void mem_cgroup_iter_invalidate(struct mem_cgroup *root)
> -{
> - /*
> - * When a group in the hierarchy below root is destroyed, the
> - * hierarchy iterator can no longer be trusted since it might
> - * have pointed to the destroyed group. Invalidate it.
> - */
> - atomic_inc(&root->dead_count);
After your patch is applied, mem_cgroup->dead_count is not used any
more. Please remove it.
[...]
> @@ -1300,8 +1183,11 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> struct mem_cgroup *prev,
> struct mem_cgroup_reclaim_cookie *reclaim)
> {
> + struct mem_cgroup_per_zone *uninitialized_var(mz);
> + struct cgroup_subsys_state *css = NULL;
> + int uninitialized_var(priority);
> struct mem_cgroup *memcg = NULL;
> - struct mem_cgroup *last_visited = NULL;
> + struct mem_cgroup *pos = NULL;
>
> if (mem_cgroup_disabled())
> return NULL;
> @@ -1310,50 +1196,51 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> root = root_mem_cgroup;
>
> if (prev && !reclaim)
> - last_visited = prev;
> + pos = prev;
>
> if (!root->use_hierarchy && root != root_mem_cgroup) {
> if (prev)
> - goto out_css_put;
> + goto out;
> return root;
> }
>
> rcu_read_lock();
> - while (!memcg) {
> - struct mem_cgroup_reclaim_iter *uninitialized_var(iter);
> - int uninitialized_var(seq);
>
> - if (reclaim) {
> - struct mem_cgroup_per_zone *mz;
> + if (reclaim) {
> + mz = mem_cgroup_zone_zoneinfo(root, reclaim->zone);
> + priority = reclaim->priority;
>
> - mz = mem_cgroup_zone_zoneinfo(root, reclaim->zone);
> - iter = &mz->reclaim_iter[reclaim->priority];
> - if (prev && reclaim->generation != iter->generation) {
Again, you are removing all generation checks, but leaving
mem_cgroup_reclaim_cookie->generation defined. Please remove it too.
BTW, don't we still need the generation check to eliminate the
possibility of a process iterating infinitely over a memory cgroup tree
in case of concurrent reclaim?
Thanks,
Vladimir
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Vladimir Davydov <vdavydov@parallels.com>
To: Johannes Weiner <hannes@cmpxchg.org>
Cc: <linux-mm@kvack.org>, Michal Hocko <mhocko@suse.cz>,
Tejun Heo <tj@kernel.org>, <cgroups@vger.kernel.org>,
<linux-kernel@vger.kernel.org>
Subject: Re: [patch v2] mm: memcontrol: convert reclaim iterator to simple css refcounting
Date: Mon, 22 Sep 2014 13:53:21 +0400 [thread overview]
Message-ID: <20140922095321.GA20398@esperanza> (raw)
In-Reply-To: <20140919212843.GA23861@cmpxchg.org>
On Fri, Sep 19, 2014 at 05:28:43PM -0400, Johannes Weiner wrote:
> The memcg reclaim iterators use a complicated weak reference scheme to
> prevent pinning cgroups indefinitely in the absence of memory pressure.
>
> However, during the ongoing cgroup core rework, css lifetime has been
> decoupled such that a pinned css no longer interferes with removal of
> the user-visible cgroup, and all this complexity is now unnecessary.
>
> Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
> ---
> mm/memcontrol.c | 201 ++++++++++----------------------------------------------
> 1 file changed, 34 insertions(+), 167 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
[...]
> -static void mem_cgroup_iter_invalidate(struct mem_cgroup *root)
> -{
> - /*
> - * When a group in the hierarchy below root is destroyed, the
> - * hierarchy iterator can no longer be trusted since it might
> - * have pointed to the destroyed group. Invalidate it.
> - */
> - atomic_inc(&root->dead_count);
After your patch is applied, mem_cgroup->dead_count is not used any
more. Please remove it.
[...]
> @@ -1300,8 +1183,11 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> struct mem_cgroup *prev,
> struct mem_cgroup_reclaim_cookie *reclaim)
> {
> + struct mem_cgroup_per_zone *uninitialized_var(mz);
> + struct cgroup_subsys_state *css = NULL;
> + int uninitialized_var(priority);
> struct mem_cgroup *memcg = NULL;
> - struct mem_cgroup *last_visited = NULL;
> + struct mem_cgroup *pos = NULL;
>
> if (mem_cgroup_disabled())
> return NULL;
> @@ -1310,50 +1196,51 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> root = root_mem_cgroup;
>
> if (prev && !reclaim)
> - last_visited = prev;
> + pos = prev;
>
> if (!root->use_hierarchy && root != root_mem_cgroup) {
> if (prev)
> - goto out_css_put;
> + goto out;
> return root;
> }
>
> rcu_read_lock();
> - while (!memcg) {
> - struct mem_cgroup_reclaim_iter *uninitialized_var(iter);
> - int uninitialized_var(seq);
>
> - if (reclaim) {
> - struct mem_cgroup_per_zone *mz;
> + if (reclaim) {
> + mz = mem_cgroup_zone_zoneinfo(root, reclaim->zone);
> + priority = reclaim->priority;
>
> - mz = mem_cgroup_zone_zoneinfo(root, reclaim->zone);
> - iter = &mz->reclaim_iter[reclaim->priority];
> - if (prev && reclaim->generation != iter->generation) {
Again, you are removing all generation checks, but leaving
mem_cgroup_reclaim_cookie->generation defined. Please remove it too.
BTW, don't we still need the generation check to eliminate the
possibility of a process iterating infinitely over a memory cgroup tree
in case of concurrent reclaim?
Thanks,
Vladimir
next prev parent reply other threads:[~2014-09-22 9:53 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-19 21:10 [patch] mm: memcontrol: convert reclaim iterator to simple css refcounting Johannes Weiner
2014-09-19 21:10 ` Johannes Weiner
2014-09-19 21:28 ` [patch v2] " Johannes Weiner
2014-09-19 21:28 ` Johannes Weiner
[not found] ` <20140919212843.GA23861-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2014-09-22 9:53 ` Vladimir Davydov [this message]
2014-09-22 9:53 ` Vladimir Davydov
2014-09-22 9:53 ` Vladimir Davydov
2014-09-24 16:47 ` Michal Hocko
2014-09-24 16:47 ` Michal Hocko
2014-09-24 17:16 ` Johannes Weiner
2014-09-24 17:16 ` Johannes Weiner
2014-09-25 1:29 ` Tejun Heo
2014-09-25 1:29 ` Tejun Heo
2014-09-25 10:01 ` Michal Hocko
2014-09-25 10:01 ` Michal Hocko
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=20140922095321.GA20398@esperanza \
--to=vdavydov-bzqdu9zft3wakbo8gow8eq@public.gmane.org \
--cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org \
--cc=mhocko-AlSwsSmVLrQ@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.