hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/mm/list_lru.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2013 Red Hat, Inc. and Parallels Inc. All rights reserved.
34 * Authors: David Chinner and Glauber Costa
....@@ -11,6 +12,7 @@
1112 #include <linux/slab.h>
1213 #include <linux/mutex.h>
1314 #include <linux/memcontrol.h>
15
+#include "slab.h"
1416
1517 #ifdef CONFIG_MEMCG_KMEM
1618 static LIST_HEAD(list_lrus);
....@@ -55,16 +57,6 @@
5557 return &nlru->lru;
5658 }
5759
58
-static __always_inline struct mem_cgroup *mem_cgroup_from_kmem(void *ptr)
59
-{
60
- struct page *page;
61
-
62
- if (!memcg_kmem_enabled())
63
- return NULL;
64
- page = virt_to_head_page(ptr);
65
- return page->mem_cgroup;
66
-}
67
-
6860 static inline struct list_lru_one *
6961 list_lru_from_kmem(struct list_lru_node *nlru, void *ptr,
7062 struct mem_cgroup **memcg_ptr)
....@@ -75,7 +67,7 @@
7567 if (!nlru->memcg_lrus)
7668 goto out;
7769
78
- memcg = mem_cgroup_from_kmem(ptr);
70
+ memcg = mem_cgroup_from_obj(ptr);
7971 if (!memcg)
8072 goto out;
8173
....@@ -188,7 +180,7 @@
188180
189181 rcu_read_lock();
190182 l = list_lru_from_memcg_idx(nlru, memcg_cache_id(memcg));
191
- count = l->nr_items;
183
+ count = READ_ONCE(l->nr_items);
192184 rcu_read_unlock();
193185
194186 return count;
....@@ -221,7 +213,7 @@
221213
222214 /*
223215 * decrement nr_to_walk first so that we don't livelock if we
224
- * get stuck on large numbesr of LRU_RETRY items
216
+ * get stuck on large numbers of LRU_RETRY items
225217 */
226218 if (!*nr_to_walk)
227219 break;
....@@ -231,7 +223,7 @@
231223 switch (ret) {
232224 case LRU_REMOVED_RETRY:
233225 assert_spin_locked(&nlru->lock);
234
- /* fall through */
226
+ fallthrough;
235227 case LRU_REMOVED:
236228 isolated++;
237229 nlru->nr_items--;
....@@ -381,14 +373,14 @@
381373 struct list_lru_memcg *memcg_lrus;
382374 /*
383375 * This is called when shrinker has already been unregistered,
384
- * and nobody can use it. So, there is no need to use kvfree_rcu().
376
+ * and nobody can use it. So, there is no need to use kvfree_rcu_local().
385377 */
386378 memcg_lrus = rcu_dereference_protected(nlru->memcg_lrus, true);
387379 __memcg_destroy_list_lru_node(memcg_lrus, 0, memcg_nr_cache_ids);
388380 kvfree(memcg_lrus);
389381 }
390382
391
-static void kvfree_rcu(struct rcu_head *head)
383
+static void kvfree_rcu_local(struct rcu_head *head)
392384 {
393385 struct list_lru_memcg *mlru;
394386
....@@ -427,7 +419,7 @@
427419 rcu_assign_pointer(nlru->memcg_lrus, new);
428420 spin_unlock_irq(&nlru->lock);
429421
430
- call_rcu(&old->rcu, kvfree_rcu);
422
+ call_rcu(&old->rcu, kvfree_rcu_local);
431423 return 0;
432424 }
433425
....@@ -599,7 +591,6 @@
599591 struct lock_class_key *key, struct shrinker *shrinker)
600592 {
601593 int i;
602
- size_t size = sizeof(*lru->node) * nr_node_ids;
603594 int err = -ENOMEM;
604595
605596 #ifdef CONFIG_MEMCG_KMEM
....@@ -610,7 +601,7 @@
610601 #endif
611602 memcg_get_cache_ids();
612603
613
- lru->node = kzalloc(size, GFP_KERNEL);
604
+ lru->node = kcalloc(nr_node_ids, sizeof(*lru->node), GFP_KERNEL);
614605 if (!lru->node)
615606 goto out;
616607