]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mm, list_lru: refactor the locking code
authorKairui Song <kasong@tencent.com>
Mon, 26 May 2025 18:06:38 +0000 (02:06 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 10 Jul 2025 05:41:56 +0000 (22:41 -0700)
Cocci is confused by the try lock then release RCU and return logic here.
So separate the try lock part out into a standalone helper.  The code is
easier to follow too.

No feature change, fixes:

cocci warnings: (new ones prefixed by >>)
>> mm/list_lru.c:82:3-9: preceding lock on line 77
>> mm/list_lru.c:82:3-9: preceding lock on line 77
   mm/list_lru.c:82:3-9: preceding lock on line 75
   mm/list_lru.c:82:3-9: preceding lock on line 75

Link: https://lkml.kernel.org/r/20250526180638.14609-1-ryncsn@gmail.com
Signed-off-by: Kairui Song <kasong@tencent.com>
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Julia Lawall <julia.lawall@inria.fr>
Closes: https://lore.kernel.org/r/202505252043.pbT1tBHJ-lkp@intel.com/
Reviewed-by: Qi Zheng <zhengqi.arch@bytedance.com>
Reviewed-by: Muchun Song <muchun.song@linux.dev>
Reviewed-by: SeongJae Park <sj@kernel.org>
Cc: Chengming Zhou <zhouchengming@bytedance.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kairui Song <kasong@tencent.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/list_lru.c

index 490473af312265208f038ef663dbf449af00f6bc..ec48b5dadf519a5296ac14cda035c067f9e448f8 100644 (file)
@@ -60,30 +60,34 @@ list_lru_from_memcg_idx(struct list_lru *lru, int nid, int idx)
        return &lru->node[nid].lru;
 }
 
+static inline bool lock_list_lru(struct list_lru_one *l, bool irq)
+{
+       if (irq)
+               spin_lock_irq(&l->lock);
+       else
+               spin_lock(&l->lock);
+       if (unlikely(READ_ONCE(l->nr_items) == LONG_MIN)) {
+               if (irq)
+                       spin_unlock_irq(&l->lock);
+               else
+                       spin_unlock(&l->lock);
+               return false;
+       }
+       return true;
+}
+
 static inline struct list_lru_one *
 lock_list_lru_of_memcg(struct list_lru *lru, int nid, struct mem_cgroup *memcg,
                       bool irq, bool skip_empty)
 {
        struct list_lru_one *l;
-       long nr_items;
 
        rcu_read_lock();
 again:
        l = list_lru_from_memcg_idx(lru, nid, memcg_kmem_id(memcg));
-       if (likely(l)) {
-               if (irq)
-                       spin_lock_irq(&l->lock);
-               else
-                       spin_lock(&l->lock);
-               nr_items = READ_ONCE(l->nr_items);
-               if (likely(nr_items != LONG_MIN)) {
-                       rcu_read_unlock();
-                       return l;
-               }
-               if (irq)
-                       spin_unlock_irq(&l->lock);
-               else
-                       spin_unlock(&l->lock);
+       if (likely(l) && lock_list_lru(l, irq)) {
+               rcu_read_unlock();
+               return l;
        }
        /*
         * Caller may simply bail out if raced with reparenting or