diff options
| author | Kirill Tkhai <ktkhai@virtuozzo.com> | 2018-10-26 15:09:28 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-10-26 16:26:35 -0700 | 
| commit | 1c2d479a119b84feacbe4de782016f1bf1ad16dc (patch) | |
| tree | 75f2e6cd750a91ea76e336aab97fdb50b0cb62c4 /mm/memcontrol.c | |
| parent | 4a222127f3631e6cdde228e3bb6b599f52b96d14 (diff) | |
| download | linux-1c2d479a119b84feacbe4de782016f1bf1ad16dc.tar.bz2 | |
mm/memcontrol.c: convert mem_cgroup_id::ref to refcount_t type
This will allow to use generic refcount_t interfaces to check counters
overflow instead of currently existing VM_BUG_ON().  The only difference
after the patch is VM_BUG_ON() may cause BUG(), while refcount_t fires
with WARN().  But this seems not to be significant here, since such the
problems are usually caught by syzbot with panic-on-warn enabled.
Link: http://lkml.kernel.org/r/153910718919.7006.13400779039257185427.stgit@localhost.localdomain
Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Andrea Parri <andrea.parri@amarulasolutions.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
| -rw-r--r-- | mm/memcontrol.c | 10 | 
1 files changed, 4 insertions, 6 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 645ede7ad1b2..92d38c88250f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4299,14 +4299,12 @@ static void mem_cgroup_id_remove(struct mem_cgroup *memcg)  static void mem_cgroup_id_get_many(struct mem_cgroup *memcg, unsigned int n)  { -	VM_BUG_ON(atomic_read(&memcg->id.ref) <= 0); -	atomic_add(n, &memcg->id.ref); +	refcount_add(n, &memcg->id.ref);  }  static void mem_cgroup_id_put_many(struct mem_cgroup *memcg, unsigned int n)  { -	VM_BUG_ON(atomic_read(&memcg->id.ref) < n); -	if (atomic_sub_and_test(n, &memcg->id.ref)) { +	if (refcount_sub_and_test(n, &memcg->id.ref)) {  		mem_cgroup_id_remove(memcg);  		/* Memcg ID pins CSS */ @@ -4523,7 +4521,7 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css)  	}  	/* Online state pins memcg ID, memcg ID pins CSS */ -	atomic_set(&memcg->id.ref, 1); +	refcount_set(&memcg->id.ref, 1);  	css_get(css);  	return 0;  } @@ -6357,7 +6355,7 @@ subsys_initcall(mem_cgroup_init);  #ifdef CONFIG_MEMCG_SWAP  static struct mem_cgroup *mem_cgroup_id_get_online(struct mem_cgroup *memcg)  { -	while (!atomic_inc_not_zero(&memcg->id.ref)) { +	while (!refcount_inc_not_zero(&memcg->id.ref)) {  		/*  		 * The root cgroup cannot be destroyed, so it's refcount must  		 * always be >= 1.  |