|
@@ -65,18 +65,24 @@ static __always_inline struct mem_cgroup *mem_cgroup_from_kmem(void *ptr)
|
|
}
|
|
}
|
|
|
|
|
|
static inline struct list_lru_one *
|
|
static inline struct list_lru_one *
|
|
-list_lru_from_kmem(struct list_lru_node *nlru, void *ptr)
|
|
|
|
|
|
+list_lru_from_kmem(struct list_lru_node *nlru, void *ptr,
|
|
|
|
+ struct mem_cgroup **memcg_ptr)
|
|
{
|
|
{
|
|
- struct mem_cgroup *memcg;
|
|
|
|
|
|
+ struct list_lru_one *l = &nlru->lru;
|
|
|
|
+ struct mem_cgroup *memcg = NULL;
|
|
|
|
|
|
if (!nlru->memcg_lrus)
|
|
if (!nlru->memcg_lrus)
|
|
- return &nlru->lru;
|
|
|
|
|
|
+ goto out;
|
|
|
|
|
|
memcg = mem_cgroup_from_kmem(ptr);
|
|
memcg = mem_cgroup_from_kmem(ptr);
|
|
if (!memcg)
|
|
if (!memcg)
|
|
- return &nlru->lru;
|
|
|
|
|
|
+ goto out;
|
|
|
|
|
|
- return list_lru_from_memcg_idx(nlru, memcg_cache_id(memcg));
|
|
|
|
|
|
+ l = list_lru_from_memcg_idx(nlru, memcg_cache_id(memcg));
|
|
|
|
+out:
|
|
|
|
+ if (memcg_ptr)
|
|
|
|
+ *memcg_ptr = memcg;
|
|
|
|
+ return l;
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
static void list_lru_register(struct list_lru *lru)
|
|
static void list_lru_register(struct list_lru *lru)
|
|
@@ -99,8 +105,11 @@ list_lru_from_memcg_idx(struct list_lru_node *nlru, int idx)
|
|
}
|
|
}
|
|
|
|
|
|
static inline struct list_lru_one *
|
|
static inline struct list_lru_one *
|
|
-list_lru_from_kmem(struct list_lru_node *nlru, void *ptr)
|
|
|
|
|
|
+list_lru_from_kmem(struct list_lru_node *nlru, void *ptr,
|
|
|
|
+ struct mem_cgroup **memcg_ptr)
|
|
{
|
|
{
|
|
|
|
+ if (memcg_ptr)
|
|
|
|
+ *memcg_ptr = NULL;
|
|
return &nlru->lru;
|
|
return &nlru->lru;
|
|
}
|
|
}
|
|
#endif /* CONFIG_MEMCG_KMEM */
|
|
#endif /* CONFIG_MEMCG_KMEM */
|
|
@@ -113,7 +122,7 @@ bool list_lru_add(struct list_lru *lru, struct list_head *item)
|
|
|
|
|
|
spin_lock(&nlru->lock);
|
|
spin_lock(&nlru->lock);
|
|
if (list_empty(item)) {
|
|
if (list_empty(item)) {
|
|
- l = list_lru_from_kmem(nlru, item);
|
|
|
|
|
|
+ l = list_lru_from_kmem(nlru, item, NULL);
|
|
list_add_tail(item, &l->list);
|
|
list_add_tail(item, &l->list);
|
|
l->nr_items++;
|
|
l->nr_items++;
|
|
nlru->nr_items++;
|
|
nlru->nr_items++;
|
|
@@ -133,7 +142,7 @@ bool list_lru_del(struct list_lru *lru, struct list_head *item)
|
|
|
|
|
|
spin_lock(&nlru->lock);
|
|
spin_lock(&nlru->lock);
|
|
if (!list_empty(item)) {
|
|
if (!list_empty(item)) {
|
|
- l = list_lru_from_kmem(nlru, item);
|
|
|
|
|
|
+ l = list_lru_from_kmem(nlru, item, NULL);
|
|
list_del_init(item);
|
|
list_del_init(item);
|
|
l->nr_items--;
|
|
l->nr_items--;
|
|
nlru->nr_items--;
|
|
nlru->nr_items--;
|