@@ -85,6 +85,7 @@ list_lru_from_memcg_idx(struct list_lru *lru, int nid, int idx)
85
85
}
86
86
#endif /* CONFIG_MEMCG */
87
87
88
+ /* The caller must ensure the memcg lifetime. */
88
89
bool list_lru_add (struct list_lru * lru , struct list_head * item , int nid ,
89
90
struct mem_cgroup * memcg )
90
91
{
@@ -109,14 +110,22 @@ EXPORT_SYMBOL_GPL(list_lru_add);
109
110
110
111
bool list_lru_add_obj (struct list_lru * lru , struct list_head * item )
111
112
{
113
+ bool ret ;
112
114
int nid = page_to_nid (virt_to_page (item ));
113
- struct mem_cgroup * memcg = list_lru_memcg_aware (lru ) ?
114
- mem_cgroup_from_slab_obj (item ) : NULL ;
115
115
116
- return list_lru_add (lru , item , nid , memcg );
116
+ if (list_lru_memcg_aware (lru )) {
117
+ rcu_read_lock ();
118
+ ret = list_lru_add (lru , item , nid , mem_cgroup_from_slab_obj (item ));
119
+ rcu_read_unlock ();
120
+ } else {
121
+ ret = list_lru_add (lru , item , nid , NULL );
122
+ }
123
+
124
+ return ret ;
117
125
}
118
126
EXPORT_SYMBOL_GPL (list_lru_add_obj );
119
127
128
+ /* The caller must ensure the memcg lifetime. */
120
129
bool list_lru_del (struct list_lru * lru , struct list_head * item , int nid ,
121
130
struct mem_cgroup * memcg )
122
131
{
@@ -139,11 +148,18 @@ EXPORT_SYMBOL_GPL(list_lru_del);
139
148
140
149
bool list_lru_del_obj (struct list_lru * lru , struct list_head * item )
141
150
{
151
+ bool ret ;
142
152
int nid = page_to_nid (virt_to_page (item ));
143
- struct mem_cgroup * memcg = list_lru_memcg_aware (lru ) ?
144
- mem_cgroup_from_slab_obj (item ) : NULL ;
145
153
146
- return list_lru_del (lru , item , nid , memcg );
154
+ if (list_lru_memcg_aware (lru )) {
155
+ rcu_read_lock ();
156
+ ret = list_lru_del (lru , item , nid , mem_cgroup_from_slab_obj (item ));
157
+ rcu_read_unlock ();
158
+ } else {
159
+ ret = list_lru_del (lru , item , nid , NULL );
160
+ }
161
+
162
+ return ret ;
147
163
}
148
164
EXPORT_SYMBOL_GPL (list_lru_del_obj );
149
165
0 commit comments