> On Jul 24, 2024, at 08:45, Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> wrote: > > On Thu, 18 Jul 2024 16:36:07 +0800 Muchun Song <songmuchun@xxxxxxxxxxxxx> wrote: > >> The mem_cgroup_from_slab_obj() is supposed to be called under rcu >> lock or cgroup_mutex or others which could prevent returned memcg >> from being freed. Fix it by adding missing rcu read lock. > > "or others" is rather vague. What others? Like objcg_lock. I have added this one into obj_cgroup_memcg(). > >> @@ -109,14 +110,20 @@ EXPORT_SYMBOL_GPL(list_lru_add); >> >> bool list_lru_add_obj(struct list_lru *lru, struct list_head *item) >> { >> + bool ret; >> int nid = page_to_nid(virt_to_page(item)); >> - struct mem_cgroup *memcg = list_lru_memcg_aware(lru) ? >> - mem_cgroup_from_slab_obj(item) : NULL; >> + struct mem_cgroup *memcg; >> >> - return list_lru_add(lru, item, nid, memcg); >> + rcu_read_lock(); >> + memcg = list_lru_memcg_aware(lru) ? mem_cgroup_from_slab_obj(item) : NULL; >> + ret = list_lru_add(lru, item, nid, memcg); >> + rcu_read_unlock(); > > We don't need rcu_read_lock() to evaluate NULL. > > memcg = NULL; > if (list_lru_memcg_aware(lru)) { > rcu_read_lock(); > memcg = mem_cgroup_from_slab_obj(item); > rcu_read_unlock(); Actually, the access to memcg is in list_lru_add(), so the rcu lock should also cover this function rather than only mem_cgroup_from_slab_obj(). Something like: memcg = NULL; if (list_lru_memcg_aware(lru)) { rcu_read_lock(); memcg = mem_cgroup_from_slab_obj(item); } ret = list_lru_add(lru, item, nid, memcg); if (list_lru_memcg_aware(lru)) rcu_read_unlock(); Not concise. I don't know if this is good. > } > > Seems worthwhile? > >