On Tue, 7 Oct 2014 17:33:36 +0200 Vlastimil Babka <vbabka@xxxxxxx> wrote: > Since commit ("mm, compaction: defer each zone individually instead of > preferred zone"), compaction is deferred for each zone where sync direct > compaction fails, and reset where it succeeds. However, it was observed > that for DMA zone compaction often appeared to succeed while subsequent > allocation attempt would not, due to different outcome of watermark check. > In order to properly defer compaction in this zone, the candidate zone has > to be passed back to __alloc_pages_direct_compact() and compaction deferred > in the zone after the allocation attempt fails. > > The large source of mismatch between watermark check in compaction and > allocation was the lack of alloc_flags and classzone_idx values in compaction, > which has been fixed in the previous patch. So with this problem fixed, we > can simplify the code by removing the candidate_zone parameter and deferring > in __alloc_pages_direct_compact(). > > After this patch, the compaction activity during stress-highalloc benchmark is > still somewhat increased, but it's negligible compared to the increase that > occurred without the better watermark checking. This suggests that it is still > possible to apparently succeed in compaction but fail to allocate, possibly > due to parallel allocation activity. > > ... > > --- a/include/linux/compaction.h > +++ b/include/linux/compaction.h > @@ -33,8 +33,7 @@ extern int fragmentation_index(struct zone *zone, unsigned int order); > extern unsigned long try_to_compact_pages(struct zonelist *zonelist, > int order, gfp_t gfp_mask, nodemask_t *mask, > enum migrate_mode mode, int *contended, > - int alloc_flags, int classzone_idx, > - struct zone **candidate_zone); > + int alloc_flags, int classzone_idx); > extern void compact_pgdat(pg_data_t *pgdat, int order); > extern void reset_isolation_suitable(pg_data_t *pgdat); > extern unsigned long compaction_suitable(struct zone *zone, int order, > @@ -105,8 +104,7 @@ static inline bool compaction_restarting(struct zone *zone, int order) > static inline unsigned long try_to_compact_pages(struct zonelist *zonelist, > int order, gfp_t gfp_mask, nodemask_t *nodemask, > enum migrate_mode mode, int *contended, > - int alloc_flags, int classzone_idx, > - struct zone **candidate_zone) > + int alloc_flags, int classzone_idx); > { > return COMPACT_CONTINUE; > } --- a/include/linux/compaction.h~mm-compaction-simplify-deferred-compaction-fix +++ a/include/linux/compaction.h @@ -104,7 +104,7 @@ static inline bool compaction_restarting static inline unsigned long try_to_compact_pages(struct zonelist *zonelist, int order, gfp_t gfp_mask, nodemask_t *nodemask, enum migrate_mode mode, int *contended, - int alloc_flags, int classzone_idx); + int alloc_flags, int classzone_idx) { return COMPACT_CONTINUE; } It clearly wasn't tested with this config. Please do so and let us know the result? -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>