gfs2: Clean up gfs2_scan_glock_lru
authorAndreas Gruenbacher <agruenba@redhat.com>
Sat, 10 Dec 2022 01:14:04 +0000 (02:14 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 31 Jan 2023 21:40:24 +0000 (22:40 +0100)
Switch to list_for_each_entry_safe() and eliminate the "skipped" list in
gfs2_scan_glock_lru().

At the same time, scan the requested number of items to scan, not one
more than that number.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/glock.c

index 2868e97..05ef0ff 100644 (file)
@@ -1985,26 +1985,21 @@ add_back_to_lru:
 
 static long gfs2_scan_glock_lru(int nr)
 {
-       struct gfs2_glock *gl;
-       LIST_HEAD(skipped);
+       struct gfs2_glock *gl, *next;
        LIST_HEAD(dispose);
        long freed = 0;
 
        spin_lock(&lru_lock);
-       while ((nr-- >= 0) && !list_empty(&lru_list)) {
-               gl = list_first_entry(&lru_list, struct gfs2_glock, gl_lru);
-
+       list_for_each_entry_safe(gl, next, &lru_list, gl_lru) {
+               if (nr-- <= 0)
+                       break;
                /* Test for being demotable */
                if (!test_bit(GLF_LOCK, &gl->gl_flags)) {
                        list_move(&gl->gl_lru, &dispose);
                        atomic_dec(&lru_count);
                        freed++;
-                       continue;
                }
-
-               list_move(&gl->gl_lru, &skipped);
        }
-       list_splice(&skipped, &lru_list);
        if (!list_empty(&dispose))
                gfs2_dispose_glock_lru(&dispose);
        spin_unlock(&lru_lock);