This series aims to improve scalability of list_lru shrinking and to make list_lru_count_one() working more effective. On RHEL7 3.10 kernel I observe high system time usage and time spent in super_cache_count() during slab shrinking: 0,94% mysqld [kernel.vmlinux] [k] _raw_spin_lock [k] _raw_spin_lock 0,57% mysqld [kernel.vmlinux] [k] shrink_slab [k] shrink_slab 0,51% mysqld [kernel.vmlinux] [k] super_cache_count [k] super_cache_count 0,32% mysqld [kernel.vmlinux] [k] __list_lru_count_one.isra.2 [k] _raw_spin_lock 0,32% mysqld [kernel.vmlinux] [k] list_lru_count_one [k] __list_lru_count_one.isra.2 (percentage of all node time; collected via $perf record --call-graph fp -j k -a). It's an example, how the processes traces look like. And many processes spend time in the above. There is a node with many containers (more, than 200), and (as it's usually happen) containers have no free memory (cache is actively used). Since shrink_slab() iterates all superblocks, and it happens frequently, the shrink scales badly, and node spends in sys more than 90% of time. The patchset makes list_lru_count_one() lockless via RCU technics. Patch [1/3] adds a new rcu field to struct list_lru_memcg and makes functions account its size during allocations. Patch [2/3] makes list_lru_node::memcg_lrus RCU-protected and RCU-accessible. Patch [3/3] removes the lock and adds rcu read protection into __list_lru_count_one(). --- Kirill Tkhai (3): mm: Add rcu field to struct list_lru_memcg mm: Make list_lru_node::memcg_lrus RCU protected mm: Count list_lru_one::nr_items lockless include/linux/list_lru.h | 3 +- mm/list_lru.c | 77 ++++++++++++++++++++++++++++++---------------- 2 files changed, 53 insertions(+), 27 deletions(-) -- Signed-off-by: Kirill Tkhai <ktkhai@xxxxxxxxxxxxx> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>