aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorYang Shi <yang.shi@linux.alibaba.com>2019-09-23 18:38:12 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-09-24 18:54:11 -0400
commit0a432dcbeb32edcd211a5d8f7847d0da7642a8b4 (patch)
tree1848177fb8ebc6ee5f98623ef4672c89cc52f8b8 /include
parent7ae88534cdd96235cd775c03b32a75009355740b (diff)
mm: shrinker: make shrinker not depend on memcg kmem
Currently shrinker is just allocated and can work when memcg kmem is enabled. But, THP deferred split shrinker is not slab shrinker, it doesn't make too much sense to have such shrinker depend on memcg kmem. It should be able to reclaim THP even though memcg kmem is disabled. Introduce a new shrinker flag, SHRINKER_NONSLAB, for non-slab shrinker. When memcg kmem is disabled, just such shrinkers can be called in shrinking memcg slab. [yang.shi@linux.alibaba.com: add comment] Link: http://lkml.kernel.org/r/1566496227-84952-4-git-send-email-yang.shi@linux.alibaba.com Link: http://lkml.kernel.org/r/1565144277-36240-4-git-send-email-yang.shi@linux.alibaba.com Signed-off-by: Yang Shi <yang.shi@linux.alibaba.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Reviewed-by: Kirill Tkhai <ktkhai@virtuozzo.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.com> Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com> Cc: Hugh Dickins <hughd@google.com> Cc: Shakeel Butt <shakeelb@google.com> Cc: David Rientjes <rientjes@google.com> Cc: Qian Cai <cai@lca.pw> Cc: Vladimir Davydov <vdavydov.dev@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/memcontrol.h19
-rw-r--r--include/linux/shrinker.h7
2 files changed, 17 insertions, 9 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index ad8f1a397ae4..a3c0a639c824 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -128,9 +128,8 @@ struct mem_cgroup_per_node {
128 128
129 struct mem_cgroup_reclaim_iter iter[DEF_PRIORITY + 1]; 129 struct mem_cgroup_reclaim_iter iter[DEF_PRIORITY + 1];
130 130
131#ifdef CONFIG_MEMCG_KMEM
132 struct memcg_shrinker_map __rcu *shrinker_map; 131 struct memcg_shrinker_map __rcu *shrinker_map;
133#endif 132
134 struct rb_node tree_node; /* RB tree node */ 133 struct rb_node tree_node; /* RB tree node */
135 unsigned long usage_in_excess;/* Set to the value by which */ 134 unsigned long usage_in_excess;/* Set to the value by which */
136 /* the soft limit is exceeded*/ 135 /* the soft limit is exceeded*/
@@ -1311,6 +1310,11 @@ static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
1311 } while ((memcg = parent_mem_cgroup(memcg))); 1310 } while ((memcg = parent_mem_cgroup(memcg)));
1312 return false; 1311 return false;
1313} 1312}
1313
1314extern int memcg_expand_shrinker_maps(int new_id);
1315
1316extern void memcg_set_shrinker_bit(struct mem_cgroup *memcg,
1317 int nid, int shrinker_id);
1314#else 1318#else
1315#define mem_cgroup_sockets_enabled 0 1319#define mem_cgroup_sockets_enabled 0
1316static inline void mem_cgroup_sk_alloc(struct sock *sk) { }; 1320static inline void mem_cgroup_sk_alloc(struct sock *sk) { };
@@ -1319,6 +1323,11 @@ static inline bool mem_cgroup_under_socket_pressure(struct mem_cgroup *memcg)
1319{ 1323{
1320 return false; 1324 return false;
1321} 1325}
1326
1327static inline void memcg_set_shrinker_bit(struct mem_cgroup *memcg,
1328 int nid, int shrinker_id)
1329{
1330}
1322#endif 1331#endif
1323 1332
1324struct kmem_cache *memcg_kmem_get_cache(struct kmem_cache *cachep); 1333struct kmem_cache *memcg_kmem_get_cache(struct kmem_cache *cachep);
@@ -1390,10 +1399,6 @@ static inline int memcg_cache_id(struct mem_cgroup *memcg)
1390 return memcg ? memcg->kmemcg_id : -1; 1399 return memcg ? memcg->kmemcg_id : -1;
1391} 1400}
1392 1401
1393extern int memcg_expand_shrinker_maps(int new_id);
1394
1395extern void memcg_set_shrinker_bit(struct mem_cgroup *memcg,
1396 int nid, int shrinker_id);
1397#else 1402#else
1398 1403
1399static inline int memcg_kmem_charge(struct page *page, gfp_t gfp, int order) 1404static inline int memcg_kmem_charge(struct page *page, gfp_t gfp, int order)
@@ -1435,8 +1440,6 @@ static inline void memcg_put_cache_ids(void)
1435{ 1440{
1436} 1441}
1437 1442
1438static inline void memcg_set_shrinker_bit(struct mem_cgroup *memcg,
1439 int nid, int shrinker_id) { }
1440#endif /* CONFIG_MEMCG_KMEM */ 1443#endif /* CONFIG_MEMCG_KMEM */
1441 1444
1442#endif /* _LINUX_MEMCONTROL_H */ 1445#endif /* _LINUX_MEMCONTROL_H */
diff --git a/include/linux/shrinker.h b/include/linux/shrinker.h
index 9443cafd1969..0f80123650e2 100644
--- a/include/linux/shrinker.h
+++ b/include/linux/shrinker.h
@@ -69,7 +69,7 @@ struct shrinker {
69 69
70 /* These are for internal use */ 70 /* These are for internal use */
71 struct list_head list; 71 struct list_head list;
72#ifdef CONFIG_MEMCG_KMEM 72#ifdef CONFIG_MEMCG
73 /* ID in shrinker_idr */ 73 /* ID in shrinker_idr */
74 int id; 74 int id;
75#endif 75#endif
@@ -81,6 +81,11 @@ struct shrinker {
81/* Flags */ 81/* Flags */
82#define SHRINKER_NUMA_AWARE (1 << 0) 82#define SHRINKER_NUMA_AWARE (1 << 0)
83#define SHRINKER_MEMCG_AWARE (1 << 1) 83#define SHRINKER_MEMCG_AWARE (1 << 1)
84/*
85 * It just makes sense when the shrinker is also MEMCG_AWARE for now,
86 * non-MEMCG_AWARE shrinker should not have this flag set.
87 */
88#define SHRINKER_NONSLAB (1 << 2)
84 89
85extern int prealloc_shrinker(struct shrinker *shrinker); 90extern int prealloc_shrinker(struct shrinker *shrinker);
86extern void register_shrinker_prepared(struct shrinker *shrinker); 91extern void register_shrinker_prepared(struct shrinker *shrinker);