Commit 453eac8a authored by Dave Chinner's avatar Dave Chinner Committed by Alex Elder

xfs: Don't wake the aild once per second

Now that the AIL push algorithm is traversal safe, we don't need a
watchdog function in the xfsaild to catch pushes that fail to make
progress. Remove the watchdog timeout and make pushes purely driven
by demand. This will remove the once-per-second wakeup that is seen
when the filesystem is idle and make laptop power misers happy.
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
parent f0a76953
...@@ -877,12 +877,11 @@ xfsaild( ...@@ -877,12 +877,11 @@ xfsaild(
{ {
struct xfs_ail *ailp = data; struct xfs_ail *ailp = data;
xfs_lsn_t last_pushed_lsn = 0; xfs_lsn_t last_pushed_lsn = 0;
long tout = 0; long tout = 0; /* milliseconds */
while (!kthread_should_stop()) { while (!kthread_should_stop()) {
if (tout) schedule_timeout_interruptible(tout ?
schedule_timeout_interruptible(msecs_to_jiffies(tout)); msecs_to_jiffies(tout) : MAX_SCHEDULE_TIMEOUT);
tout = 1000;
/* swsusp */ /* swsusp */
try_to_freeze(); try_to_freeze();
......
...@@ -237,14 +237,15 @@ xfs_trans_ail_cursor_first( ...@@ -237,14 +237,15 @@ xfs_trans_ail_cursor_first(
} }
/* /*
* Function that does the work of pushing on the AIL * xfsaild_push does the work of pushing on the AIL. Returning a timeout of
* zero indicates that the caller should sleep until woken.
*/ */
long long
xfsaild_push( xfsaild_push(
struct xfs_ail *ailp, struct xfs_ail *ailp,
xfs_lsn_t *last_lsn) xfs_lsn_t *last_lsn)
{ {
long tout = 1000; /* milliseconds */ long tout = 0;
xfs_lsn_t last_pushed_lsn = *last_lsn; xfs_lsn_t last_pushed_lsn = *last_lsn;
xfs_lsn_t target = ailp->xa_target; xfs_lsn_t target = ailp->xa_target;
xfs_lsn_t lsn; xfs_lsn_t lsn;
...@@ -262,7 +263,7 @@ xfsaild_push( ...@@ -262,7 +263,7 @@ xfsaild_push(
*/ */
xfs_trans_ail_cursor_done(ailp, cur); xfs_trans_ail_cursor_done(ailp, cur);
spin_unlock(&ailp->xa_lock); spin_unlock(&ailp->xa_lock);
last_pushed_lsn = 0; *last_lsn = 0;
return tout; return tout;
} }
...@@ -279,7 +280,6 @@ xfsaild_push( ...@@ -279,7 +280,6 @@ xfsaild_push(
* prevents use from spinning when we can't do anything or there is * prevents use from spinning when we can't do anything or there is
* lots of contention on the AIL lists. * lots of contention on the AIL lists.
*/ */
tout = 10;
lsn = lip->li_lsn; lsn = lip->li_lsn;
flush_log = stuck = count = 0; flush_log = stuck = count = 0;
while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) {
...@@ -376,14 +376,14 @@ xfsaild_push( ...@@ -376,14 +376,14 @@ xfsaild_push(
if (!count) { if (!count) {
/* We're past our target or empty, so idle */ /* We're past our target or empty, so idle */
tout = 1000; last_pushed_lsn = 0;
} else if (XFS_LSN_CMP(lsn, target) >= 0) { } else if (XFS_LSN_CMP(lsn, target) >= 0) {
/* /*
* We reached the target so wait a bit longer for I/O to * We reached the target so wait a bit longer for I/O to
* complete and remove pushed items from the AIL before we * complete and remove pushed items from the AIL before we
* start the next scan from the start of the AIL. * start the next scan from the start of the AIL.
*/ */
tout += 20; tout = 50;
last_pushed_lsn = 0; last_pushed_lsn = 0;
} else if ((stuck * 100) / count > 90) { } else if ((stuck * 100) / count > 90) {
/* /*
...@@ -395,11 +395,14 @@ xfsaild_push( ...@@ -395,11 +395,14 @@ xfsaild_push(
* Backoff a bit more to allow some I/O to complete before * Backoff a bit more to allow some I/O to complete before
* continuing from where we were. * continuing from where we were.
*/ */
tout += 10; tout = 20;
} else {
/* more to do, but wait a short while before continuing */
tout = 10;
} }
*last_lsn = last_pushed_lsn; *last_lsn = last_pushed_lsn;
return tout; return tout;
} /* xfsaild_push */ }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment