Received: by 2002:a05:6358:53a8:b0:117:f937:c515 with SMTP id z40csp5836074rwe; Tue, 18 Apr 2023 12:16:19 -0700 (PDT) X-Google-Smtp-Source: AKy350Z9uGvx6LLi8w8M5RuaCTyBnU40iJTpSTimQU0lEGWQCRhTejzrVwdtLLQjKhdKr+J7QWkO X-Received: by 2002:a05:6a00:1826:b0:63b:599b:a2da with SMTP id y38-20020a056a00182600b0063b599ba2damr911822pfa.27.1681845379263; Tue, 18 Apr 2023 12:16:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1681845379; cv=none; d=google.com; s=arc-20160816; b=BPcfE6VKf078K0V8Xw3ARn9gPl5P1eSkAl6pbSvnsR7OYqH/mP2qKdr61IaTgVXeD/ WITREj8u3KUFM8bvanVm0Kq4B+cFecQ8zUZzv/zmtPxGgfU7vGkf85D/4J6BjRNft6x3 eR5mXYlPcBJifWMSe/aRhj2/zNFiZuj9YE8QYi5IkpIhn2QSuSPYUTiveMZHcwl0J5/0 b/c1+7M9HjisJyopSoJ9aiv2T2hQdjzxeNzV823k2VLHdARnMIdB6e8kTJ4Tkr6fhGFm 4I7ZRWBDOhcMmmDxUiCia/MTPAfj+CHC2WFsb69v1KbjNs/laL5uqwAqMrVpdT8TvzxM LFUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=13UUYwnQDW8sv6Z5U/gfNQWUn2NaHbpFqCKtGCMsvrI=; b=KLjHPFY1g99CtLIVPIed+1IyFd/oYeJHSjD6MzjXpwf+kODNXf751I870JRLj4w0I2 t2WApKH6anj081B2kBLYuh4wrIVk9rgFuSMTKIY6WK0n7kaYDnc1f5tRyztSpQiqt4RJ m3nzf9fOim9c2ZzjCjpNFihlunBnG6t37WW4CQ1ewFTjHqLRb8Nxqe7+Zo6u/onoBE0W kfqjSXr6BLXOXH2Wz5obNco06LLULdEqi672xg3UgndzpowXY1ZcvkWh6+f/NWaaSGqA oruvWw5EgBkBtJKbF4Mx4C/PA26bVq0XBKd0c4KJdUKnNtWZLMZ3+TpOWVn2R8NzUW1W vdEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cmpxchg-org.20221208.gappssmtp.com header.s=20221208 header.b=KYPCQZ61; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=cmpxchg.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f65-20020a625144000000b0063d329e9a08si2927944pfb.301.2023.04.18.12.16.07; Tue, 18 Apr 2023 12:16:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@cmpxchg-org.20221208.gappssmtp.com header.s=20221208 header.b=KYPCQZ61; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=cmpxchg.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232907AbjDRTOI (ORCPT + 99 others); Tue, 18 Apr 2023 15:14:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57462 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232920AbjDRTNt (ORCPT ); Tue, 18 Apr 2023 15:13:49 -0400 Received: from mail-qv1-xf2e.google.com (mail-qv1-xf2e.google.com [IPv6:2607:f8b0:4864:20::f2e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 76BCAAD2F for ; Tue, 18 Apr 2023 12:13:28 -0700 (PDT) Received: by mail-qv1-xf2e.google.com with SMTP id op30so18258741qvb.3 for ; Tue, 18 Apr 2023 12:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cmpxchg-org.20221208.gappssmtp.com; s=20221208; t=1681845207; x=1684437207; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=13UUYwnQDW8sv6Z5U/gfNQWUn2NaHbpFqCKtGCMsvrI=; b=KYPCQZ61APdNYs9D70nl3yomvGcC38mIMM4ac/0Jxqh0MQrsikJDyqz8kNAKqw9iC1 1bmnq4F1MqaGWpFLA8ADTd1KOLEiSxDVYMfswSH15y4crGrkoG6QG/Dr8TRu4HNJqULs 3ondml+qKSu04IkF3zQ8fUI8BpomkXLoFtEZTlNb5W8qR5dw6PS9O8KDT/9Kxlz6inFB Zoapu1IejZKECDPcQcl9q/KpgYWJmZLUxb2uAQzBruh9kz4IWlq+6bWZCm5vzL8tOPu8 21csNAuzKAdA/rLnXVEEXuAuDwsTm2WP87lOxN6ifFsa6PFpUcCMCZg4Et1TQULauXd7 sXdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681845207; x=1684437207; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=13UUYwnQDW8sv6Z5U/gfNQWUn2NaHbpFqCKtGCMsvrI=; b=bgVPfgiBLM40POG/QOadjZxIFJ7Hfm9xKwTemnmgYawprJcBm7ElfD2N4Xc15Pjg6C jjKro0OW/V+Cwk5VqIze65MUIbnLEcVs6XuJYEka5ODSr5j7rIelDsxvODbTFsusxuHd +++W60DiugVNuU0iJvYmTW5nHA2GoyZFJ+LD6nwFpm9OqEp4LJ4+veWXwNiaEIu9JJwz V6r/CChZn1nyyBF3LdMbt8tiYZFf09jNOHbs3ynLepiAKUMkT3C8k4COZRG6MQXU5jTT ef4FrGUtSK4N5f8apIKioV5xnAsS0RHLO6fZglrvantc8MkWNRc1YgbqkuO3NzNeXHVG Ymzg== X-Gm-Message-State: AAQBX9fHBp11ESJl+YenteUM3eRZRgDhpsLNRTgOxhdcyR/cPGbELmiV MVvvUAq3X35eQ1ujt0rzSFxqPQ== X-Received: by 2002:ad4:5946:0:b0:5ef:9b22:dc88 with SMTP id eo6-20020ad45946000000b005ef9b22dc88mr5188244qvb.0.1681845207300; Tue, 18 Apr 2023 12:13:27 -0700 (PDT) Received: from localhost ([2620:10d:c091:400::5:e646]) by smtp.gmail.com with ESMTPSA id db3-20020a056214170300b005e5b30eef24sm3907199qvb.56.2023.04.18.12.13.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Apr 2023 12:13:26 -0700 (PDT) From: Johannes Weiner To: linux-mm@kvack.org Cc: Kaiyang Zhao , Mel Gorman , Vlastimil Babka , David Rientjes , linux-kernel@vger.kernel.org, kernel-team@fb.com Subject: [RFC PATCH 07/26] mm: page_alloc: move capture_control to the page allocator Date: Tue, 18 Apr 2023 15:12:54 -0400 Message-Id: <20230418191313.268131-8-hannes@cmpxchg.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230418191313.268131-1-hannes@cmpxchg.org> References: <20230418191313.268131-1-hannes@cmpxchg.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Compaction capturing is really a component of the page allocator. Later patches will also disconnect allocation request size from the compaction size, so move the setup of the capturing parameters to the "request domain", i.e. the page allocator. No functional change. Signed-off-by: Johannes Weiner --- include/linux/compaction.h | 3 ++- mm/compaction.c | 33 ++++++++++----------------------- mm/page_alloc.c | 25 ++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/include/linux/compaction.h b/include/linux/compaction.h index 52a9ff65faee..06eeb2e25833 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h @@ -56,6 +56,7 @@ enum compact_result { }; struct alloc_context; /* in mm/internal.h */ +struct capture_control; /* in mm/internal.h */ /* * Number of free order-0 pages that should be available above given watermark @@ -94,7 +95,7 @@ extern int fragmentation_index(struct zone *zone, unsigned int order); extern enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, unsigned int alloc_flags, const struct alloc_context *ac, enum compact_priority prio, - struct page **page); + struct capture_control *capc); extern void reset_isolation_suitable(pg_data_t *pgdat); extern enum compact_result compaction_suitable(struct zone *zone, int order, unsigned int alloc_flags, int highest_zoneidx); diff --git a/mm/compaction.c b/mm/compaction.c index 84db84e8fd3a..a2280001eea3 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -2510,7 +2510,7 @@ compact_zone(struct compact_control *cc, struct capture_control *capc) static enum compact_result compact_zone_order(struct zone *zone, int order, gfp_t gfp_mask, enum compact_priority prio, unsigned int alloc_flags, int highest_zoneidx, - struct page **capture) + struct capture_control *capc) { enum compact_result ret; struct compact_control cc = { @@ -2527,38 +2527,25 @@ static enum compact_result compact_zone_order(struct zone *zone, int order, .ignore_skip_hint = (prio == MIN_COMPACT_PRIORITY), .ignore_block_suitable = (prio == MIN_COMPACT_PRIORITY) }; - struct capture_control capc = { - .cc = &cc, - .page = NULL, - }; - /* - * Make sure the structs are really initialized before we expose the - * capture control, in case we are interrupted and the interrupt handler - * frees a page. - */ + /* See the comment in __alloc_pages_direct_compact() */ barrier(); - WRITE_ONCE(current->capture_control, &capc); + WRITE_ONCE(capc->cc, &cc); - ret = compact_zone(&cc, &capc); + ret = compact_zone(&cc, capc); + + WRITE_ONCE(capc->cc, NULL); VM_BUG_ON(!list_empty(&cc.freepages)); VM_BUG_ON(!list_empty(&cc.migratepages)); - /* - * Make sure we hide capture control first before we read the captured - * page pointer, otherwise an interrupt could free and capture a page - * and we would leak it. - */ - WRITE_ONCE(current->capture_control, NULL); - *capture = READ_ONCE(capc.page); /* * Technically, it is also possible that compaction is skipped but * the page is still captured out of luck(IRQ came and freed the page). * Returning COMPACT_SUCCESS in such cases helps in properly accounting * the COMPACT[STALL|FAIL] when compaction is skipped. */ - if (*capture) + if (capc->page) ret = COMPACT_SUCCESS; return ret; @@ -2573,13 +2560,13 @@ int sysctl_extfrag_threshold = 500; * @alloc_flags: The allocation flags of the current allocation * @ac: The context of current allocation * @prio: Determines how hard direct compaction should try to succeed - * @capture: Pointer to free page created by compaction will be stored here + * @capc: The context for capturing pages during freeing * * This is the main entry point for direct page compaction. */ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, unsigned int alloc_flags, const struct alloc_context *ac, - enum compact_priority prio, struct page **capture) + enum compact_priority prio, struct capture_control *capc) { int may_perform_io = (__force int)(gfp_mask & __GFP_IO); struct zoneref *z; @@ -2607,7 +2594,7 @@ enum compact_result try_to_compact_pages(gfp_t gfp_mask, unsigned int order, } status = compact_zone_order(zone, order, gfp_mask, prio, - alloc_flags, ac->highest_zoneidx, capture); + alloc_flags, ac->highest_zoneidx, capc); rc = max(status, rc); /* The allocation should succeed, stop compacting */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index b9366c002334..4d20513c83be 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -944,7 +944,7 @@ static inline struct capture_control *task_capc(struct zone *zone) { struct capture_control *capc = current->capture_control; - return unlikely(capc) && + return unlikely(capc && capc->cc) && !(current->flags & PF_KTHREAD) && !capc->page && capc->cc->zone == zone ? capc : NULL; @@ -4480,22 +4480,41 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, struct page *page = NULL; unsigned long pflags; unsigned int noreclaim_flag; + struct capture_control capc = { + .page = NULL, + }; if (!order) return NULL; + /* + * Make sure the structs are really initialized before we expose the + * capture control, in case we are interrupted and the interrupt handler + * frees a page. + */ + barrier(); + WRITE_ONCE(current->capture_control, &capc); + psi_memstall_enter(&pflags); delayacct_compact_start(); noreclaim_flag = memalloc_noreclaim_save(); *compact_result = try_to_compact_pages(gfp_mask, order, alloc_flags, ac, - prio, &page); + prio, &capc); memalloc_noreclaim_restore(noreclaim_flag); psi_memstall_leave(&pflags); delayacct_compact_end(); - if (*compact_result == COMPACT_SKIPPED) + /* + * Make sure we hide capture control first before we read the captured + * page pointer, otherwise an interrupt could free and capture a page + * and we would leak it. + */ + WRITE_ONCE(current->capture_control, NULL); + page = READ_ONCE(capc.page); + + if (!page && *compact_result == COMPACT_SKIPPED) return NULL; /* * At least in one zone compaction wasn't deferred or skipped, so let's -- 2.39.2