From patchwork Wed Mar 10 18:01:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Minchan Kim X-Patchwork-Id: 12128895 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C66D9C433E6 for ; Wed, 10 Mar 2021 18:01:12 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 6832964D73 for ; Wed, 10 Mar 2021 18:01:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6832964D73 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 0237F8D01F4; Wed, 10 Mar 2021 13:01:12 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id F3BCA8D01ED; Wed, 10 Mar 2021 13:01:11 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DB74B8D01F4; Wed, 10 Mar 2021 13:01:11 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0093.hostedemail.com [216.40.44.93]) by kanga.kvack.org (Postfix) with ESMTP id C2B0F8D01ED for ; Wed, 10 Mar 2021 13:01:11 -0500 (EST) Received: from smtpin23.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 869428249980 for ; Wed, 10 Mar 2021 18:01:11 +0000 (UTC) X-FDA: 77904731142.23.367A4B1 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) by imf23.hostedemail.com (Postfix) with ESMTP id 43DC2A001A84 for ; Wed, 10 Mar 2021 18:01:10 +0000 (UTC) Received: by mail-pg1-f174.google.com with SMTP id p21so11897691pgl.12 for ; Wed, 10 Mar 2021 10:01:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=9jmoenAGMFpKHfMNt6zq7dsNBrDUYlAgJfLcxbv2cwY=; b=DSDRCT2Gn+BkaXVqZYpRnM7Vhl8kTYeebkTTSNqc3y/R+hb3F3LaGSctN8hAACu8uU elN/UzMtTqpKCHQBiyFOJiubnRHsoveuM8VqSRjPWzZDXq9XiecLx5mVmSz/LKqtLqZo 7HvM9Z6lk92sjl9yJ1au8+pZSyqWM1fvkiUl4mcGLdPtzy1JlMdTFUYrIw1GcPSYBFUd tPwipmpQRHoZn0H4A3vkjF38cUtcDdmrcm1AcoijWUlVE4uG5V/+u5XP0uUREbfQ/2im Fc3Ligirw05nZA5HdqP4gXTnEGNs4ETlwRS7lgHm2onoBfgaTTeaV4em9NDqSAKHe8mH XQbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; bh=9jmoenAGMFpKHfMNt6zq7dsNBrDUYlAgJfLcxbv2cwY=; b=frfN2pJK0LSKRtpOHD/7FdD04+DgtBp7l8c6TnEROLMz6JedK7lbTNzmgUy2rgnagK CFHiFsjyUlYzMHLQ5EUGCk9shQN2H6sQz6KiBD8yvGwTrbsjpWcxC2a4pe0IEyir54fM id+OrhPsr/CH4nB5Zy2j/LmiaPRZOBjiZfq9cBW2Xi12ma2YIKb5pETBl40B1+7A3Kw8 DxIbPMcz4VyW3wKPjdQlwcKrjAjcJ4itVOGyWFRj6xF8rOppoxZrADm8fgXDmX0cra4n KSthXFWzxRrvnKSEDuOCm8cr+BWyYZUCuoIrYkvTbuYGzOoZUvw0o5rZLPfJ4Rdumcdw s3WQ== X-Gm-Message-State: AOAM532b4Dd8hAUNCMzIMVfg31AnvrwSq3FUDhR5qn0nkJcKvJb3ltmA DDNbmvCFl0q6WoSv/Qdpfcs= X-Google-Smtp-Source: ABdhPJwzWYaUv5g003e42TPTQsAVKPBZ10h8/tuAidHFZ0TQfUXW/Oxu4Xxn3w9OBBdo3pAwzS81TA== X-Received: by 2002:a63:cd09:: with SMTP id i9mr3806659pgg.407.1615399269162; Wed, 10 Mar 2021 10:01:09 -0800 (PST) Received: from bbox-1.mtv.corp.google.com ([2620:15c:211:201:64cb:74c7:f2c:e5e0]) by smtp.gmail.com with ESMTPSA id 35sm217683pgr.14.2021.03.10.10.01.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Mar 2021 10:01:08 -0800 (PST) From: Minchan Kim To: Andrew Morton Cc: linux-mm , LKML , John Dias , Michal Hocko , David Hildenbrand , Jason Baron , Minchan Kim Subject: [PATCH v3] mm: page_alloc: dump migrate-failed pages Date: Wed, 10 Mar 2021 10:01:04 -0800 Message-Id: <20210310180104.517886-1-minchan@kernel.org> X-Mailer: git-send-email 2.30.1.766.gb4fecdf3b7-goog MIME-Version: 1.0 X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 43DC2A001A84 X-Stat-Signature: bdsead4uupx84grw8bzp8qq3jzfh7cq1 Received-SPF: none (gmail.com>: No applicable sender policy available) receiver=imf23; identity=mailfrom; envelope-from=""; helo=mail-pg1-f174.google.com; client-ip=209.85.215.174 X-HE-DKIM-Result: pass/pass X-HE-Tag: 1615399270-54337 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Currently, debugging CMA allocation failures is quite limited. The most commong source of these failures seems to be page migration which doesn't provide any useful information on the reason of the failure by itself. alloc_contig_range can report those failures as it holds a list of migrate-failed pages. page refcount, mapcount with page flags on dump_page are helpful information to deduce the culprit. Furthermore, dump_page_owner was super helpful to find long term pinner who initiated the page allocation. The reason it approach with dynamic debug is the debug message could emit lots of noises as alloc_contig_range calls more frequently since it's a best effort allocator. There are two ifdefery conditions to support common dyndbg options: - CONFIG_DYNAMIC_DEBUG_CORE && DYNAMIC_DEBUG_MODULE It aims for supporting the feature with only specific file with adding ccflags. - CONFIG_DYNAMIC_DEBUG It aims for supporting the feature with system wide globally. A simple example to enable the feature: Admin could enable the dump like this(by default, disabled) echo "func dump_migrate_failure_pages +p" > control Admin could disable it. echo "func dump_migrate_failure_pages =_" > control Detail goes Documentation/admin-guide/dynamic-debug-howto.rst A concern is utility functions in dump_page uses inconsistent loglevels. __dump_page: KERN_WARNING __dump_page_owner: KERN_ALERT stack_trace_print: KERN_DEFAULT There are bunch of places to use the inconsistent loglevel utility functions(e.g., just grep dump_page/strace_trace_print). It's unfortunate but here we are. It could be addressed different patchset. Signed-off-by: Minchan Kim --- * from v2 - https://lore.kernel.org/linux-mm/20210308202047.1903802-1-minchan@kernel.org/ * remove ratelimit - mhocko * from v1 - https://lore.kernel.org/linux-mm/20210217163603.429062-1-minchan@kernel.org/ * use dynamic debugging with system wide instead of per-call site - mhocko mm/page_alloc.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3e4b29ee2b1e..f42f3e208794 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8453,6 +8453,27 @@ static unsigned long pfn_max_align_up(unsigned long pfn) pageblock_nr_pages)); } +#if defined(CONFIG_DYNAMIC_DEBUG) || \ + (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) +static void alloc_contig_dump_pages(struct list_head *page_list) +{ + DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, + "migrate failure"); + + if (DYNAMIC_DEBUG_BRANCH(descriptor)) { + struct page *page; + + WARN(1, "failed callstack"); + list_for_each_entry(page, page_list, lru) + dump_page(page, "migration failure"); + } +} +#else +static inline void alloc_contig_dump_pages(struct list_head *page_list) +{ +} +#endif + /* [start, end) must belong to a single zone. */ static int __alloc_contig_migrate_range(struct compact_control *cc, unsigned long start, unsigned long end) @@ -8496,6 +8517,7 @@ static int __alloc_contig_migrate_range(struct compact_control *cc, NULL, (unsigned long)&mtc, cc->mode, MR_CONTIG_RANGE); } if (ret < 0) { + alloc_contig_dump_pages(&cc->migratepages); putback_movable_pages(&cc->migratepages); return ret; }