summaryrefslogtreecommitdiff
path: root/libbcachefs/journal_reclaim.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/journal_reclaim.c')
-rw-r--r--libbcachefs/journal_reclaim.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/libbcachefs/journal_reclaim.c b/libbcachefs/journal_reclaim.c
index 24d04e5..427be2d 100644
--- a/libbcachefs/journal_reclaim.c
+++ b/libbcachefs/journal_reclaim.c
@@ -677,13 +677,15 @@ int bch2_journal_reclaim(struct journal *j)
static int bch2_journal_reclaim_thread(void *arg)
{
struct journal *j = arg;
- unsigned long next;
+ unsigned long delay, now;
int ret = 0;
set_freezable();
kthread_wait_freezable(test_bit(JOURNAL_RECLAIM_STARTED, &j->flags));
+ j->last_flushed = jiffies;
+
while (!ret && !kthread_should_stop()) {
j->reclaim_kicked = false;
@@ -691,7 +693,12 @@ static int bch2_journal_reclaim_thread(void *arg)
ret = __bch2_journal_reclaim(j, false);
mutex_unlock(&j->reclaim_lock);
- next = j->last_flushed + msecs_to_jiffies(j->reclaim_delay_ms);
+ now = jiffies;
+ delay = msecs_to_jiffies(j->reclaim_delay_ms);
+ j->next_reclaim = j->last_flushed + delay;
+
+ if (!time_in_range(j->next_reclaim, now, now + delay))
+ j->next_reclaim = now + delay;
while (1) {
set_current_state(TASK_INTERRUPTIBLE);
@@ -699,10 +706,9 @@ static int bch2_journal_reclaim_thread(void *arg)
break;
if (j->reclaim_kicked)
break;
- if (time_after_eq(jiffies, next))
+ if (time_after_eq(jiffies, j->next_reclaim))
break;
- schedule_timeout(next - jiffies);
- try_to_freeze();
+ freezable_schedule_timeout(j->next_reclaim - jiffies);
}
__set_current_state(TASK_RUNNING);