summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/journal_reclaim.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-03-06 17:20:39 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:27 -0400
commit718ce1eb8a84f47f66d0c89de43c6d0f0b14a20e (patch)
tree01e7614265a3298cf11bfd2203d94912febab80a /fs/bcachefs/journal_reclaim.c
parentf0cc5d2931378b7a2a7e797c726a2ab760d4a84d (diff)
downloadlinux-718ce1eb8a84f47f66d0c89de43c6d0f0b14a20e.tar.gz
linux-718ce1eb8a84f47f66d0c89de43c6d0f0b14a20e.tar.bz2
linux-718ce1eb8a84f47f66d0c89de43c6d0f0b14a20e.zip
bcachefs: Skip periodic wakeup of journal reclaim when journal empty
Less system noise. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/journal_reclaim.c')
-rw-r--r--fs/bcachefs/journal_reclaim.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/bcachefs/journal_reclaim.c b/fs/bcachefs/journal_reclaim.c
index 39f4b2eebac0..56b0c018ac26 100644
--- a/fs/bcachefs/journal_reclaim.c
+++ b/fs/bcachefs/journal_reclaim.c
@@ -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);
}