|
@@ -1481,6 +1481,21 @@ static long writeback_sb_inodes(struct super_block *sb,
|
|
|
wbc_detach_inode(&wbc);
|
|
|
work->nr_pages -= write_chunk - wbc.nr_to_write;
|
|
|
wrote += write_chunk - wbc.nr_to_write;
|
|
|
+
|
|
|
+ if (need_resched()) {
|
|
|
+ /*
|
|
|
+ * We're trying to balance between building up a nice
|
|
|
+ * long list of IOs to improve our merge rate, and
|
|
|
+ * getting those IOs out quickly for anyone throttling
|
|
|
+ * in balance_dirty_pages(). cond_resched() doesn't
|
|
|
+ * unplug, so get our IOs out the door before we
|
|
|
+ * give up the CPU.
|
|
|
+ */
|
|
|
+ blk_flush_plug(current);
|
|
|
+ cond_resched();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
spin_lock(&wb->list_lock);
|
|
|
spin_lock(&inode->i_lock);
|
|
|
if (!(inode->i_state & I_DIRTY_ALL))
|
|
@@ -1488,7 +1503,7 @@ static long writeback_sb_inodes(struct super_block *sb,
|
|
|
requeue_inode(inode, wb, &wbc);
|
|
|
inode_sync_complete(inode);
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
- cond_resched_lock(&wb->list_lock);
|
|
|
+
|
|
|
/*
|
|
|
* bail out to wb_writeback() often enough to check
|
|
|
* background threshold and other termination conditions.
|