On Tue, Apr 19, 2011 at 11:00:05AM +0800, Wu Fengguang wrote: > Dynamically compute the dirty expire timestamp at queue_io() time. > > writeback_control.older_than_this used to be determined at entrance to > the kupdate writeback work. This _static_ timestamp may go stale if the > kupdate work runs on and on. The flusher may then stuck with some old > busy inodes, never considering newly expired inodes thereafter. > > This has two possible problems: > > - It is unfair for a large dirty inode to delay (for a long time) the > writeback of small dirty inodes. > > - As time goes by, the large and busy dirty inode may contain only > _freshly_ dirtied pages. Ignoring newly expired dirty inodes risks > delaying the expired dirty pages to the end of LRU lists, triggering > the evil pageout(). Nevertheless this patch merely addresses part > of the problem. When wb_writeback() is called with for_kupdate set, it initialises wbc->older_than_this appropriately outside the writeback loop. queue_io() is called once per writeback_inodes_wb() call, which is once per loop in wb_writeback. All your change does is re-initialise older_than_this once per loop in wb_writeback, jus tin a different and very non-obvious place. So why didn't you just re-initialise it inside the loop in wb_writeback() and leave all the other code alone? Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>