diff mbox series

[v2] btrfs: Be smarter when sleeping in transaction_kthread

Message ID 20201020094417.738267-1-nborisov@suse.com (mailing list archive)
State New, archived
Headers show
Series [v2] btrfs: Be smarter when sleeping in transaction_kthread | expand

Commit Message

Nikolay Borisov Oct. 20, 2020, 9:44 a.m. UTC
If transaction_kthread is woken up before
btrfs_fs_info::commit_interval seconds have elapsed it will sleep for a
fixed period of 5 seconds. This is not a problem per-se but is not
accuaret, instead the code should sleep for an interval which guarantees
on next wakeup commit_interval would have passed. Since time tracking is
not precise substract 1 second from delta to ensure the delay we end up waiting
will be longer than than the wake up period.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---

This one survived my testing and debugging confirmed that sometimes delta can
indeed be 0 so utilising min is the right thing to do.

 fs/btrfs/disk-io.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--
2.25.1
diff mbox series

Patch

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index b7deb3e9dd9e..2632b5833f64 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1735,7 +1735,8 @@  static int transaction_kthread(void *arg)
 		if (cur->state < TRANS_STATE_COMMIT_START &&
 		    delta < fs_info->commit_interval) {
 			spin_unlock(&fs_info->trans_lock);
-			delay = msecs_to_jiffies(5000);
+			delay -= msecs_to_jiffies((delta-1) * 1000);
+			delay = min(delay, msecs_to_jiffies(fs_info->commit_interval * 1000));
 			goto sleep;
 		}
 		transid = cur->transid;