diff options
Diffstat (limited to 'fs/xfs/xfs_trans_ail.c')
| -rw-r--r-- | fs/xfs/xfs_trans_ail.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 2ffc570679be..e799824f7245 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
| @@ -237,14 +237,15 @@ out: | |||
| 237 | } | 237 | } |
| 238 | 238 | ||
| 239 | /* | 239 | /* |
| 240 | * Function that does the work of pushing on the AIL | 240 | * xfsaild_push does the work of pushing on the AIL. Returning a timeout of |
| 241 | * zero indicates that the caller should sleep until woken. | ||
| 241 | */ | 242 | */ |
| 242 | long | 243 | long |
| 243 | xfsaild_push( | 244 | xfsaild_push( |
| 244 | struct xfs_ail *ailp, | 245 | struct xfs_ail *ailp, |
| 245 | xfs_lsn_t *last_lsn) | 246 | xfs_lsn_t *last_lsn) |
| 246 | { | 247 | { |
| 247 | long tout = 1000; /* milliseconds */ | 248 | long tout = 0; |
| 248 | xfs_lsn_t last_pushed_lsn = *last_lsn; | 249 | xfs_lsn_t last_pushed_lsn = *last_lsn; |
| 249 | xfs_lsn_t target = ailp->xa_target; | 250 | xfs_lsn_t target = ailp->xa_target; |
| 250 | xfs_lsn_t lsn; | 251 | xfs_lsn_t lsn; |
| @@ -252,6 +253,7 @@ xfsaild_push( | |||
| 252 | int flush_log, count, stuck; | 253 | int flush_log, count, stuck; |
| 253 | xfs_mount_t *mp = ailp->xa_mount; | 254 | xfs_mount_t *mp = ailp->xa_mount; |
| 254 | struct xfs_ail_cursor *cur = &ailp->xa_cursors; | 255 | struct xfs_ail_cursor *cur = &ailp->xa_cursors; |
| 256 | int push_xfsbufd = 0; | ||
| 255 | 257 | ||
| 256 | spin_lock(&ailp->xa_lock); | 258 | spin_lock(&ailp->xa_lock); |
| 257 | xfs_trans_ail_cursor_init(ailp, cur); | 259 | xfs_trans_ail_cursor_init(ailp, cur); |
| @@ -262,7 +264,7 @@ xfsaild_push( | |||
| 262 | */ | 264 | */ |
| 263 | xfs_trans_ail_cursor_done(ailp, cur); | 265 | xfs_trans_ail_cursor_done(ailp, cur); |
| 264 | spin_unlock(&ailp->xa_lock); | 266 | spin_unlock(&ailp->xa_lock); |
| 265 | last_pushed_lsn = 0; | 267 | *last_lsn = 0; |
| 266 | return tout; | 268 | return tout; |
| 267 | } | 269 | } |
| 268 | 270 | ||
| @@ -279,7 +281,6 @@ xfsaild_push( | |||
| 279 | * prevents use from spinning when we can't do anything or there is | 281 | * prevents use from spinning when we can't do anything or there is |
| 280 | * lots of contention on the AIL lists. | 282 | * lots of contention on the AIL lists. |
| 281 | */ | 283 | */ |
| 282 | tout = 10; | ||
| 283 | lsn = lip->li_lsn; | 284 | lsn = lip->li_lsn; |
| 284 | flush_log = stuck = count = 0; | 285 | flush_log = stuck = count = 0; |
| 285 | while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { | 286 | while ((XFS_LSN_CMP(lip->li_lsn, target) < 0)) { |
| @@ -308,6 +309,7 @@ xfsaild_push( | |||
| 308 | XFS_STATS_INC(xs_push_ail_pushbuf); | 309 | XFS_STATS_INC(xs_push_ail_pushbuf); |
| 309 | IOP_PUSHBUF(lip); | 310 | IOP_PUSHBUF(lip); |
| 310 | last_pushed_lsn = lsn; | 311 | last_pushed_lsn = lsn; |
| 312 | push_xfsbufd = 1; | ||
| 311 | break; | 313 | break; |
| 312 | 314 | ||
| 313 | case XFS_ITEM_PINNED: | 315 | case XFS_ITEM_PINNED: |
| @@ -322,12 +324,6 @@ xfsaild_push( | |||
| 322 | stuck++; | 324 | stuck++; |
| 323 | break; | 325 | break; |
| 324 | 326 | ||
| 325 | case XFS_ITEM_FLUSHING: | ||
| 326 | XFS_STATS_INC(xs_push_ail_flushing); | ||
| 327 | last_pushed_lsn = lsn; | ||
| 328 | stuck++; | ||
| 329 | break; | ||
| 330 | |||
| 331 | default: | 327 | default: |
| 332 | ASSERT(0); | 328 | ASSERT(0); |
| 333 | break; | 329 | break; |
| @@ -371,19 +367,24 @@ xfsaild_push( | |||
| 371 | * move forward in the AIL. | 367 | * move forward in the AIL. |
| 372 | */ | 368 | */ |
| 373 | XFS_STATS_INC(xs_push_ail_flush); | 369 | XFS_STATS_INC(xs_push_ail_flush); |
| 374 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); | 370 | xfs_log_force(mp, 0); |
| 371 | } | ||
| 372 | |||
| 373 | if (push_xfsbufd) { | ||
| 374 | /* we've got delayed write buffers to flush */ | ||
| 375 | wake_up_process(mp->m_ddev_targp->bt_task); | ||
| 375 | } | 376 | } |
| 376 | 377 | ||
| 377 | if (!count) { | 378 | if (!count) { |
| 378 | /* We're past our target or empty, so idle */ | 379 | /* We're past our target or empty, so idle */ |
| 379 | tout = 1000; | 380 | last_pushed_lsn = 0; |
| 380 | } else if (XFS_LSN_CMP(lsn, target) >= 0) { | 381 | } else if (XFS_LSN_CMP(lsn, target) >= 0) { |
| 381 | /* | 382 | /* |
| 382 | * We reached the target so wait a bit longer for I/O to | 383 | * We reached the target so wait a bit longer for I/O to |
| 383 | * complete and remove pushed items from the AIL before we | 384 | * complete and remove pushed items from the AIL before we |
| 384 | * start the next scan from the start of the AIL. | 385 | * start the next scan from the start of the AIL. |
| 385 | */ | 386 | */ |
| 386 | tout += 20; | 387 | tout = 50; |
| 387 | last_pushed_lsn = 0; | 388 | last_pushed_lsn = 0; |
| 388 | } else if ((stuck * 100) / count > 90) { | 389 | } else if ((stuck * 100) / count > 90) { |
| 389 | /* | 390 | /* |
| @@ -395,11 +396,14 @@ xfsaild_push( | |||
| 395 | * Backoff a bit more to allow some I/O to complete before | 396 | * Backoff a bit more to allow some I/O to complete before |
| 396 | * continuing from where we were. | 397 | * continuing from where we were. |
| 397 | */ | 398 | */ |
| 398 | tout += 10; | 399 | tout = 20; |
| 400 | } else { | ||
| 401 | /* more to do, but wait a short while before continuing */ | ||
| 402 | tout = 10; | ||
| 399 | } | 403 | } |
| 400 | *last_lsn = last_pushed_lsn; | 404 | *last_lsn = last_pushed_lsn; |
| 401 | return tout; | 405 | return tout; |
| 402 | } /* xfsaild_push */ | 406 | } |
| 403 | 407 | ||
| 404 | 408 | ||
| 405 | /* | 409 | /* |
