bcachefs: Skip periodic wakeup of journal reclaim when journal empty
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 6 Mar 2022 22:20:39 +0000 (17:20 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:27 +0000 (17:09 -0400)
Less system noise.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/journal.c
fs/bcachefs/journal_reclaim.c
fs/bcachefs/journal_types.h

index 1c43ec1d4f6c375c50b6518ecdcb9954d6cb1a9c..54a318a841a1b6219956bff40d3989014a836b4a 100644 (file)
@@ -240,6 +240,9 @@ static int journal_entry_open(struct journal *j)
        if (u64s <= 0)
                return cur_entry_journal_full;
 
+       if (fifo_empty(&j->pin) && j->reclaim_thread)
+               wake_up_process(j->reclaim_thread);
+
        /*
         * The fifo_push() needs to happen at the same time as j->seq is
         * incremented for journal_last_seq() to be calculated correctly
index 39f4b2eebac0dfec28c3b03317952acffb2dab69..56b0c018ac2630f3571921aa50b2da73786eed9d 100644 (file)
@@ -667,6 +667,7 @@ static int bch2_journal_reclaim_thread(void *arg)
        struct journal *j = arg;
        struct bch_fs *c = container_of(j, struct bch_fs, journal);
        unsigned long delay, now;
+       bool journal_empty;
        int ret = 0;
 
        set_freezable();
@@ -693,10 +694,17 @@ static int bch2_journal_reclaim_thread(void *arg)
                                break;
                        if (j->reclaim_kicked)
                                break;
-                       if (time_after_eq(jiffies, j->next_reclaim))
-                               break;
-                       schedule_timeout(j->next_reclaim - jiffies);
 
+                       spin_lock(&j->lock);
+                       journal_empty = fifo_empty(&j->pin);
+                       spin_unlock(&j->lock);
+
+                       if (journal_empty)
+                               schedule();
+                       else if (time_after(j->next_reclaim, jiffies))
+                               schedule_timeout(j->next_reclaim - jiffies);
+                       else
+                               break;
                }
                __set_current_state(TASK_RUNNING);
        }
index 330c5d79e645f468e5988459b4e35d57e0fe6019..91f829adf8627dfb774ad3e97c262dc023b07e7c 100644 (file)
@@ -243,6 +243,10 @@ struct journal {
        spinlock_t              err_lock;
 
        struct mutex            reclaim_lock;
+       /*
+        * Used for waiting until journal reclaim has freed up space in the
+        * journal:
+        */
        wait_queue_head_t       reclaim_wait;
        struct task_struct      *reclaim_thread;
        bool                    reclaim_kicked;