on 8/15/2023 4:53 PM, Baolin Wang wrote: > > > On 8/5/2023 7:07 PM, Kemeng Shi wrote: >> We always do zone_watermark_ok check and compaction_suitable check >> together to test if compaction for target order should be runned. >> Factor these code out for preparation to remove repeat code. >> >> Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> >> --- >> mm/compaction.c | 42 +++++++++++++++++++++++++++++------------- >> 1 file changed, 29 insertions(+), 13 deletions(-) >> >> diff --git a/mm/compaction.c b/mm/compaction.c >> index b5a699ed526b..26787ebb0297 100644 >> --- a/mm/compaction.c >> +++ b/mm/compaction.c >> @@ -2365,6 +2365,30 @@ bool compaction_zonelist_suitable(struct alloc_context *ac, int order, >> return false; >> } >> +/* >> + * Should we do compaction for target allocation order. >> + * Return COMPACT_SUCCESS if allocation for target order can be already >> + * satisfied >> + * Return COMPACT_SKIPPED if compaction for target order is likely to fail >> + * Return COMPACT_CONTINUE if compaction for target order should be runned >> + */ >> +static inline enum compact_result >> +compaction_suit_allocation_order(struct zone *zone, unsigned int order, >> + int highest_zoneidx, unsigned int alloc_flags) >> +{ >> + unsigned long watermark; >> + >> + watermark = wmark_pages(zone, alloc_flags & ALLOC_WMARK_MASK); > > IIUC, the watermark used in patch 8 and patch 9 is different, right? Have you measured the impact of modifying this watermark? > Actually, there is no functional change intended. Consider wmark_pages with alloc_flags = 0 is equivalent to min_wmark_pages, patch 8 and patch 9 still use original watermark. >> + if (zone_watermark_ok(zone, order, watermark, highest_zoneidx, >> + alloc_flags)) >> + return COMPACT_SUCCESS; >> + >> + if (!compaction_suitable(zone, order, highest_zoneidx)) >> + return COMPACT_SKIPPED; >> + >> + return COMPACT_CONTINUE; >> +} >> + >> static enum compact_result >> compact_zone(struct compact_control *cc, struct capture_control *capc) >> { >> @@ -2390,19 +2414,11 @@ compact_zone(struct compact_control *cc, struct capture_control *capc) >> cc->migratetype = gfp_migratetype(cc->gfp_mask); >> if (compaction_with_allocation_order(cc->order)) { >> - unsigned long watermark; >> - >> - /* Allocation can already succeed, nothing to do */ >> - watermark = wmark_pages(cc->zone, >> - cc->alloc_flags & ALLOC_WMARK_MASK); >> - if (zone_watermark_ok(cc->zone, cc->order, watermark, >> - cc->highest_zoneidx, cc->alloc_flags)) >> - return COMPACT_SUCCESS; >> - >> - /* Compaction is likely to fail */ >> - if (!compaction_suitable(cc->zone, cc->order, >> - cc->highest_zoneidx)) >> - return COMPACT_SKIPPED; >> + ret = compaction_suit_allocation_order(cc->zone, cc->order, >> + cc->highest_zoneidx, >> + cc->alloc_flags); >> + if (ret != COMPACT_CONTINUE) >> + return ret; >> } >> /* > >