@@ -3670,7 +3670,8 @@ static int memcg_online_kmem(struct mem_cgroup *memcg)
3670
3670
if (cgroup_memory_nokmem )
3671
3671
return 0 ;
3672
3672
3673
- BUG_ON (memcg -> kmemcg_id >= 0 );
3673
+ if (unlikely (mem_cgroup_is_root (memcg )))
3674
+ return 0 ;
3674
3675
3675
3676
memcg_id = memcg_alloc_cache_id ();
3676
3677
if (memcg_id < 0 )
@@ -3696,7 +3697,10 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
3696
3697
struct mem_cgroup * parent ;
3697
3698
int kmemcg_id ;
3698
3699
3699
- if (memcg -> kmemcg_id == -1 )
3700
+ if (cgroup_memory_nokmem )
3701
+ return ;
3702
+
3703
+ if (unlikely (mem_cgroup_is_root (memcg )))
3700
3704
return ;
3701
3705
3702
3706
parent = parent_mem_cgroup (memcg );
@@ -3706,7 +3710,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
3706
3710
memcg_reparent_objcgs (memcg , parent );
3707
3711
3708
3712
kmemcg_id = memcg -> kmemcg_id ;
3709
- BUG_ON (kmemcg_id < 0 );
3710
3713
3711
3714
/*
3712
3715
* After we have finished memcg_reparent_objcgs(), all list_lrus
@@ -3717,7 +3720,6 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
3717
3720
memcg_drain_all_list_lrus (kmemcg_id , parent );
3718
3721
3719
3722
memcg_free_cache_id (kmemcg_id );
3720
- memcg -> kmemcg_id = -1 ;
3721
3723
}
3722
3724
#else
3723
3725
static int memcg_online_kmem (struct mem_cgroup * memcg )
@@ -5237,7 +5239,6 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
5237
5239
{
5238
5240
struct mem_cgroup * parent = mem_cgroup_from_css (parent_css );
5239
5241
struct mem_cgroup * memcg , * old_memcg ;
5240
- long error = - ENOMEM ;
5241
5242
5242
5243
old_memcg = set_active_memcg (parent );
5243
5244
memcg = mem_cgroup_alloc ();
@@ -5266,34 +5267,26 @@ mem_cgroup_css_alloc(struct cgroup_subsys_state *parent_css)
5266
5267
return & memcg -> css ;
5267
5268
}
5268
5269
5269
- /* The following stuff does not apply to the root */
5270
- error = memcg_online_kmem (memcg );
5271
- if (error )
5272
- goto fail ;
5273
-
5274
5270
if (cgroup_subsys_on_dfl (memory_cgrp_subsys ) && !cgroup_memory_nosocket )
5275
5271
static_branch_inc (& memcg_sockets_enabled_key );
5276
5272
5277
5273
return & memcg -> css ;
5278
- fail :
5279
- mem_cgroup_id_remove (memcg );
5280
- mem_cgroup_free (memcg );
5281
- return ERR_PTR (error );
5282
5274
}
5283
5275
5284
5276
static int mem_cgroup_css_online (struct cgroup_subsys_state * css )
5285
5277
{
5286
5278
struct mem_cgroup * memcg = mem_cgroup_from_css (css );
5287
5279
5280
+ if (memcg_online_kmem (memcg ))
5281
+ goto remove_id ;
5282
+
5288
5283
/*
5289
5284
* A memcg must be visible for expand_shrinker_info()
5290
5285
* by the time the maps are allocated. So, we allocate maps
5291
5286
* here, when for_each_mem_cgroup() can't skip it.
5292
5287
*/
5293
- if (alloc_shrinker_info (memcg )) {
5294
- mem_cgroup_id_remove (memcg );
5295
- return - ENOMEM ;
5296
- }
5288
+ if (alloc_shrinker_info (memcg ))
5289
+ goto offline_kmem ;
5297
5290
5298
5291
/* Online state pins memcg ID, memcg ID pins CSS */
5299
5292
refcount_set (& memcg -> id .ref , 1 );
@@ -5303,6 +5296,11 @@ static int mem_cgroup_css_online(struct cgroup_subsys_state *css)
5303
5296
queue_delayed_work (system_unbound_wq , & stats_flush_dwork ,
5304
5297
2UL * HZ );
5305
5298
return 0 ;
5299
+ offline_kmem :
5300
+ memcg_offline_kmem (memcg );
5301
+ remove_id :
5302
+ mem_cgroup_id_remove (memcg );
5303
+ return - ENOMEM ;
5306
5304
}
5307
5305
5308
5306
static void mem_cgroup_css_offline (struct cgroup_subsys_state * css )
@@ -5360,9 +5358,6 @@ static void mem_cgroup_css_free(struct cgroup_subsys_state *css)
5360
5358
cancel_work_sync (& memcg -> high_work );
5361
5359
mem_cgroup_remove_from_trees (memcg );
5362
5360
free_shrinker_info (memcg );
5363
-
5364
- /* Need to offline kmem if online_css() fails */
5365
- memcg_offline_kmem (memcg );
5366
5361
mem_cgroup_free (memcg );
5367
5362
}
5368
5363
0 commit comments