On Mon, Nov 25, 2013 at 03:26:10PM +0100, Vlastimil Babka wrote: > Compaction used to start its migrate and free page scaners at the zone's > lowest > and highest pfn, respectively. Later, caching was introduced to remember the > scanners' progress across compaction attempts so that pageblocks are not > re-scanned uselessly. Additionally, pageblocks where isolation failed are > marked to be quickly skipped when encountered again in future compactions. > > Currently, both the reset of cached pfn's and clearing of the pageblock skip > information for a zone is done in __reset_isolation_suitable(). This function > gets called when: > - compaction is restarting after being deferred > - compact_blockskip_flush flag is set in compact_finished() when the scanners > meet (and not again cleared when direct compaction succeeds in allocation) > and kswapd acts upon this flag before going to sleep > > This behavior is suboptimal for several reasons: > - when direct sync compaction is called after async compaction fails (in the > allocation slowpath), it will effectively do nothing, unless kswapd > happens to process the compact_blockskip_flush flag meanwhile. This is racy > and goes against the purpose of sync compaction to more thoroughly retry > the compaction of a zone where async compaction has failed. > The restart-after-deferring path cannot help here as deferring happens only > after the sync compaction fails. It is also done only for the preferred > zone, while the compaction might be done for a fallback zone. > - the mechanism of marking pageblock to be skipped has little value since the > cached pfn's are reset only together with the pageblock skip flags. This > effectively limits pageblock skip usage to parallel compactions. > > This patch changes compact_finished() so that cached pfn's are reset > immediately when the scanners meet. Clearing pageblock skip flags is > unchanged, > as well as the other situations where cached pfn's are reset. This allows the > sync-after-async compaction to retry pageblocks not marked as skipped, such as > blocks !MIGRATE_MOVABLE blocks that async compactions now skips without > marking them. > > Cc: Mel Gorman <[email protected]> > Cc: Rik van Riel <[email protected]> > Signed-off-by: Vlastimil Babka <[email protected]>
Acked-by: Mel Gorman <[email protected]> -- Mel Gorman SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

