Skip to content

Commit fae91d6

Browse files
Kirill Tkhaitorvalds
authored andcommitted
mm/list_lru.c: set bit in memcg shrinker bitmap on first list_lru item appearance
Introduce set_shrinker_bit() function to set shrinker-related bit in memcg shrinker bitmap, and set the bit after the first item is added and in case of reparenting destroyed memcg's items. This will allow next patch to make shrinkers be called only, in case of they have charged objects at the moment, and to improve shrink_slab() performance. [ktkhai@virtuozzo.com: v9] Link: http://lkml.kernel.org/r/153112557572.4097.17315791419810749985.stgit@localhost.localdomain Link: http://lkml.kernel.org/r/153063065671.1818.15914674956134687268.stgit@localhost.localdomain Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Acked-by: Vladimir Davydov <vdavydov.dev@gmail.com> Tested-by: Shakeel Butt <shakeelb@google.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Guenter Roeck <linux@roeck-us.net> Cc: "Huang, Ying" <ying.huang@intel.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Josef Bacik <jbacik@fb.com> Cc: Li RongQing <lirongqing@baidu.com> Cc: Matthew Wilcox <willy@infradead.org> Cc: Matthias Kaehlcke <mka@chromium.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Michal Hocko <mhocko@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Philippe Ombredanne <pombredanne@nexb.com> Cc: Roman Gushchin <guro@fb.com> Cc: Sahitya Tummala <stummala@codeaurora.org> Cc: Stephen Rothwell <sfr@canb.auug.org.au> Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Waiman Long <longman@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent dfd2f10 commit fae91d6

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

include/linux/memcontrol.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,6 +1286,8 @@ static inline int memcg_cache_id(struct mem_cgroup *memcg)
12861286

12871287
extern int memcg_expand_shrinker_maps(int new_id);
12881288

1289+
extern void memcg_set_shrinker_bit(struct mem_cgroup *memcg,
1290+
int nid, int shrinker_id);
12891291
#else
12901292
#define for_each_memcg_cache_index(_idx) \
12911293
for (; NULL; )
@@ -1308,6 +1310,8 @@ static inline void memcg_put_cache_ids(void)
13081310
{
13091311
}
13101312

1313+
static inline void memcg_set_shrinker_bit(struct mem_cgroup *memcg,
1314+
int nid, int shrinker_id) { }
13111315
#endif /* CONFIG_MEMCG_KMEM */
13121316

13131317
#endif /* _LINUX_MEMCONTROL_H */

mm/list_lru.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ static void list_lru_unregister(struct list_lru *lru)
3030
mutex_unlock(&list_lrus_mutex);
3131
}
3232

33+
static int lru_shrinker_id(struct list_lru *lru)
34+
{
35+
return lru->shrinker_id;
36+
}
37+
3338
static inline bool list_lru_memcg_aware(struct list_lru *lru)
3439
{
3540
/*
@@ -93,6 +98,11 @@ static void list_lru_unregister(struct list_lru *lru)
9398
{
9499
}
95100

101+
static int lru_shrinker_id(struct list_lru *lru)
102+
{
103+
return -1;
104+
}
105+
96106
static inline bool list_lru_memcg_aware(struct list_lru *lru)
97107
{
98108
return false;
@@ -118,13 +128,17 @@ bool list_lru_add(struct list_lru *lru, struct list_head *item)
118128
{
119129
int nid = page_to_nid(virt_to_page(item));
120130
struct list_lru_node *nlru = &lru->node[nid];
131+
struct mem_cgroup *memcg;
121132
struct list_lru_one *l;
122133

123134
spin_lock(&nlru->lock);
124135
if (list_empty(item)) {
125-
l = list_lru_from_kmem(nlru, item, NULL);
136+
l = list_lru_from_kmem(nlru, item, &memcg);
126137
list_add_tail(item, &l->list);
127-
l->nr_items++;
138+
/* Set shrinker bit if the first element was added */
139+
if (!l->nr_items++)
140+
memcg_set_shrinker_bit(memcg, nid,
141+
lru_shrinker_id(lru));
128142
nlru->nr_items++;
129143
spin_unlock(&nlru->lock);
130144
return true;
@@ -507,6 +521,7 @@ static void memcg_drain_list_lru_node(struct list_lru *lru, int nid,
507521
struct list_lru_node *nlru = &lru->node[nid];
508522
int dst_idx = dst_memcg->kmemcg_id;
509523
struct list_lru_one *src, *dst;
524+
bool set;
510525

511526
/*
512527
* Since list_lru_{add,del} may be called under an IRQ-safe lock,
@@ -518,7 +533,10 @@ static void memcg_drain_list_lru_node(struct list_lru *lru, int nid,
518533
dst = list_lru_from_memcg_idx(nlru, dst_idx);
519534

520535
list_splice_init(&src->list, &dst->list);
536+
set = (!dst->nr_items && src->nr_items);
521537
dst->nr_items += src->nr_items;
538+
if (set)
539+
memcg_set_shrinker_bit(dst_memcg, nid, lru_shrinker_id(lru));
522540
src->nr_items = 0;
523541

524542
spin_unlock_irq(&nlru->lock);

mm/memcontrol.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,19 @@ int memcg_expand_shrinker_maps(int new_id)
422422
mutex_unlock(&memcg_shrinker_map_mutex);
423423
return ret;
424424
}
425+
426+
void memcg_set_shrinker_bit(struct mem_cgroup *memcg, int nid, int shrinker_id)
427+
{
428+
if (shrinker_id >= 0 && memcg && !mem_cgroup_is_root(memcg)) {
429+
struct memcg_shrinker_map *map;
430+
431+
rcu_read_lock();
432+
map = rcu_dereference(memcg->nodeinfo[nid]->shrinker_map);
433+
set_bit(shrinker_id, map->map);
434+
rcu_read_unlock();
435+
}
436+
}
437+
425438
#else /* CONFIG_MEMCG_KMEM */
426439
static int memcg_alloc_shrinker_maps(struct mem_cgroup *memcg)
427440
{

0 commit comments

Comments
 (0)