On 8/1/19 6:01 AM, Vlastimil Babka wrote: > Could you try testing the patch below instead? It should hopefully > eliminate the stalls. If it makes hugepage allocation give up too early, > we'll know we have to involve __GFP_RETRY_MAYFAIL in allowing the > MIN_COMPACT_PRIORITY priority. Thanks! Thanks. This patch does eliminate the stalls I was seeing. In my testing, there is little difference in how many hugetlb pages are allocated. It does not appear to be giving up/failing too early. But, this is only with __GFP_RETRY_MAYFAIL. The real concern would with THP requests. Any suggestions on how to test that? -- Mike Kravetz > ----8<---- > diff --git a/include/linux/compaction.h b/include/linux/compaction.h > index 9569e7c786d3..b8bfe8d5d2e9 100644 > --- a/include/linux/compaction.h > +++ b/include/linux/compaction.h > @@ -129,11 +129,7 @@ static inline bool compaction_failed(enum compact_result result) > return false; > } > > -/* > - * Compaction has backed off for some reason. It might be throttling or > - * lock contention. Retrying is still worthwhile. > - */ > -static inline bool compaction_withdrawn(enum compact_result result) > +static inline bool compaction_needs_reclaim(enum compact_result result) > { > /* > * Compaction backed off due to watermark checks for order-0 > @@ -142,6 +138,15 @@ static inline bool compaction_withdrawn(enum compact_result result) > if (result == COMPACT_SKIPPED) > return true; > > + return false; > +} > + > +/* > + * Compaction has backed off for some reason. It might be throttling or > + * lock contention. Retrying is still worthwhile. > + */ > +static inline bool compaction_withdrawn(enum compact_result result) > +{ > /* > * If compaction is deferred for high-order allocations, it is > * because sync compaction recently failed. If this is the case > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 272c6de1bf4e..3dfce1f79112 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -3965,6 +3965,11 @@ should_compact_retry(struct alloc_context *ac, int order, int alloc_flags, > if (compaction_failed(compact_result)) > goto check_priority; > > + if (compaction_needs_reclaim(compact_result)) { > + ret = compaction_zonelist_suitable(ac, order, alloc_flags); > + goto out; > + } > + > /* > * make sure the compaction wasn't deferred or didn't bail out early > * due to locks contention before we declare that we should give up. > @@ -3972,8 +3977,7 @@ should_compact_retry(struct alloc_context *ac, int order, int alloc_flags, > * compaction. > */ > if (compaction_withdrawn(compact_result)) { > - ret = compaction_zonelist_suitable(ac, order, alloc_flags); > - goto out; > + goto check_priority; > } > > /* >