On 08/24/2015 04:19 AM, Joonsoo Kim wrote: > Further compaction attempt is deferred when some of compaction attempts > already fails. But, after some number of trial are skipped, compaction > restarts work to check whether compaction is now possible or not. It > scans whole range of zone to determine this possibility and if compaction > possibility doesn't recover, this whole range scan is quite big overhead. > As a first step to reduce this overhead, this patch implement compaction > depleted state on zone. > > The way to determine depletion of compaction possility is checking number > of success on previous compaction attempt. If number of successful > compaction is below than specified threshold, we guess that compaction > will not successful next time so mark the zone as compaction depleted. > In this patch, threshold is choosed by 1 to imitate current compaction > deferring algorithm. In the following patch, compaction algorithm will be > changed and this threshold is also adjusted to that change. > > In this patch, only state definition is implemented. There is no action > for this new state so no functional change. But, following patch will > add some handling for this new state. > > Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> > --- > include/linux/mmzone.h | 3 +++ > mm/compaction.c | 44 +++++++++++++++++++++++++++++++++++++++++--- > 2 files changed, 44 insertions(+), 3 deletions(-) > > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 754c259..700e9b5 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -517,6 +517,8 @@ struct zone { > unsigned int compact_considered; > unsigned int compact_defer_shift; > int compact_order_failed; > + unsigned long compact_success; > + unsigned long compact_depletion_depth; > #endif > > #if defined CONFIG_COMPACTION || defined CONFIG_CMA > @@ -543,6 +545,7 @@ enum zone_flags { > * many pages under writeback > */ > ZONE_FAIR_DEPLETED, /* fair zone policy batch depleted */ > + ZONE_COMPACTION_DEPLETED, /* compaction possiblity depleted */ > }; > > static inline unsigned long zone_end_pfn(const struct zone *zone) > diff --git a/mm/compaction.c b/mm/compaction.c > index c2d3d6a..de96e9d 100644 > --- a/mm/compaction.c > +++ b/mm/compaction.c > @@ -129,6 +129,23 @@ static struct page *pageblock_pfn_to_page(unsigned long start_pfn, > > /* Do not skip compaction more than 64 times */ > #define COMPACT_MAX_DEFER_SHIFT 6 > +#define COMPACT_MIN_DEPLETE_THRESHOLD 1UL > + > +static bool compaction_depleted(struct zone *zone) > +{ > + unsigned long threshold; > + unsigned long success = zone->compact_success; > + > + /* > + * Now, to imitate current compaction deferring approach, > + * choose threshold to 1. It will be changed in the future. > + */ > + threshold = COMPACT_MIN_DEPLETE_THRESHOLD; > + if (success >= threshold) > + return false; > + > + return true; > +} > > /* > * Compaction is deferred when compaction fails to result in a page > @@ -223,6 +240,16 @@ static void __reset_isolation_suitable(struct zone *zone) > zone->compact_cached_free_pfn = end_pfn; > zone->compact_blockskip_flush = false; > > + if (compaction_depleted(zone)) { > + if (test_bit(ZONE_COMPACTION_DEPLETED, &zone->flags)) > + zone->compact_depletion_depth++; > + else { > + set_bit(ZONE_COMPACTION_DEPLETED, &zone->flags); > + zone->compact_depletion_depth = 0; > + } > + } > + zone->compact_success = 0; It's possible that the following comment is made moot by further patches, but: I assume doing this in __reset_isolation_suitable() is to react on the compaction_restarting() state. But __reset_isolation_suitable() is called also from manually invoked compaction, and from kswapd. What if compaction has succeeded S times, but threshold is T, S < T and T is larger than 1 (by a later patch). Then kswapd or manual compaction will reset S to zero, without giving it chance to reach T, even when compaction would succeed? -- 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>