On 08/16/2016 07:58 AM, Joonsoo Kim wrote:
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -1644,6 +1644,8 @@ static enum compact_result compact_zone_order(struct zone 
*zone, int order,
                .alloc_flags = alloc_flags,
                .classzone_idx = classzone_idx,
                .direct_compaction = true,
+               .whole_zone = (prio == COMPACT_PRIO_SYNC_FULL),
+               .ignore_skip_hint = (prio == COMPACT_PRIO_SYNC_FULL)
        };
        INIT_LIST_HEAD(&cc.freepages);
        INIT_LIST_HEAD(&cc.migratepages);
@@ -1689,7 +1691,8 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, 
unsigned int order,
                                                                ac->nodemask) {
                enum compact_result status;

-               if (compaction_deferred(zone, order)) {
+               if (prio > COMPACT_PRIO_SYNC_FULL
+                                       && compaction_deferred(zone, order)) {
                        rc = max_t(enum compact_result, COMPACT_DEFERRED, rc);
                        continue;

Could we provide prio to compaction_deferred() and do the decision in
that that function?

BTW, in kcompactd, compaction_deferred() is checked but
.ignore_skip_hint=true. Is there any reason? If we can remove
compaction_deferred() for kcompactd, we can check .ignore_skip_hint
to determine if defer is needed or not.

I don't want to change kcompactd right now, as the current series seems to help against premature OOMs. But I'll revisit it later.

Thanks.

Reply via email to