Re: [PATCH v2] mm: memcontrol: fix possible memcg leak due to interrupted reclaim

From: Andrew Morton
Date: Fri Dec 18 2015 - 17:40:14 EST


On Fri, 18 Dec 2015 19:24:05 +0300 Vladimir Davydov <vdavydov@xxxxxxxxxxxxx> wrote:

>
> OK, got it, thanks. Here goes the incremental patch (it should also fix
> the warning regarding unused cmpxchg returned value):
> ---
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index fc25dc211eaf..908c075e04eb 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -864,7 +864,7 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> * might block it. So we clear iter->position right
> * away.
> */
> - cmpxchg(&iter->position, pos, NULL);
> + (void)cmpxchg(&iter->position, pos, NULL);

No, this doesn't actually squish the __must_check warning.


Can anyone think of anything smarter than this?

--- a/mm/memcontrol.c~mm-memcontrol-fix-possible-memcg-leak-due-to-interrupted-reclaim-fix-fix
+++ a/mm/memcontrol.c
@@ -851,6 +851,9 @@ static struct mem_cgroup *get_mem_cgroup
return memcg;
}

+/* Move this to compiler.h if it proves worthy */
+#define defeat_must_check(expr) do { if (expr) ; } while (0)
+
/**
* mem_cgroup_iter - iterate over memory cgroup hierarchy
* @root: hierarchy root
@@ -915,7 +918,7 @@ struct mem_cgroup *mem_cgroup_iter(struc
* might block it. So we clear iter->position right
* away.
*/
- (void)cmpxchg(&iter->position, pos, NULL);
+ defeat_must_check(cmpxchg(&iter->position, pos, NULL));
}
}

@@ -967,7 +970,7 @@ struct mem_cgroup *mem_cgroup_iter(struc
* thread, so check that the value hasn't changed since we read
* it to avoid reclaiming from the same cgroup twice.
*/
- (void)cmpxchg(&iter->position, pos, memcg);
+ defeat_must_check(cmpxchg(&iter->position, pos, memcg));

/*
* pairs with css_tryget when dereferencing iter->position
_

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/