From patchwork Mon Sep 5 03:10:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 12965433 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4AC08C6FA83 for ; Mon, 5 Sep 2022 03:10:30 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 92E8B80198; Sun, 4 Sep 2022 23:10:29 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8DDDE8D0030; Sun, 4 Sep 2022 23:10:29 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7A71080198; Sun, 4 Sep 2022 23:10:29 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 6D0918D0030 for ; Sun, 4 Sep 2022 23:10:29 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 34ED21A0690 for ; Mon, 5 Sep 2022 03:10:29 +0000 (UTC) X-FDA: 79876553778.13.5A0475A Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by imf03.hostedemail.com (Postfix) with ESMTP id A7A8120062 for ; Mon, 5 Sep 2022 03:10:28 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 4458A38625; Mon, 5 Sep 2022 03:10:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1662347427; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=W/MLllXjzybsXPJWu2E4vY9RqlvmdcidUV1t25DTGms=; b=QE2kWbLlqrC1kyK3ai3F1jPIROFXMtp0/0GDGS9a8KBRtsEVxDu+l9XGsPK1iBYOMCLtOe GpGLWbJwR2i+NCzn0ZjUoPTZPCXmZ/ElFbcnlQ8TlX6I/JuNlvYhrXPG1fKhCHe54Bk6sA aQl4gPWN1B16yEZZXKDyTfQy6zbdVqo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1662347427; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=W/MLllXjzybsXPJWu2E4vY9RqlvmdcidUV1t25DTGms=; b=KpfxdY3TW/Xrugb7T4FShDjUqtfv+Y9Ciss5tKJ8qJa6RcGk1SpcnRZZeiBxmOQ7VrsxvF lwkvd9lFcrGEGKAA== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 7DA5A139F9; Mon, 5 Sep 2022 03:10:26 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id a7jcG6JoFWMeHwAAMHmgww (envelope-from ); Mon, 05 Sep 2022 03:10:26 +0000 From: Oscar Salvador To: Andrew Morton Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Michal Hocko , Vlastimil Babka , Eric Dumazet , Waiman Long , Suren Baghdasaryan , Marco Elver , Andrey Konovalov , Alexander Potapenko , Oscar Salvador Subject: [PATCH v2 0/3] page_owner: print stacks and their counter Date: Mon, 5 Sep 2022 05:10:09 +0200 Message-Id: <20220905031012.4450-1-osalvador@suse.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=suse.de header.s=susede2_rsa header.b=QE2kWbLl; dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=KpfxdY3T; spf=pass (imf03.hostedemail.com: domain of osalvador@suse.de designates 195.135.220.28 as permitted sender) smtp.mailfrom=osalvador@suse.de; dmarc=pass (policy=none) header.from=suse.de ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1662347428; a=rsa-sha256; cv=none; b=VQV8qa5Yy01l4+mVyrYB9O8mj1h7hS08YYYo1gabpkbbNmGC3ozcOTXUzDjRkQPQ6IzcHo AjstOyLS57a9vWaaU371ycTYN9NzZUBThUChKL6bQC8Cx5qIlt9IgQjqDnT7cHUZjzwKC5 U2qvBuC/P8PUezWe/dzTXjaMTjeK1g4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1662347428; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=W/MLllXjzybsXPJWu2E4vY9RqlvmdcidUV1t25DTGms=; b=gfNslRQuJzocTkZHeWLwb7FzOx8KOzVEf/60LRcc5fsHMYUijCDjhbg4zmGp5su5r1FKXt G/BoTYK/y58HwtIE0cyfqrL/ThxhtNvN5B+8wxlKXiXW+TR03U7O39TOVB9itMvtaDN5E3 UbdvJW2ZeX+k2CHaj6+mtmXsmDcYTK8= X-Rspamd-Server: rspam02 X-Rspam-User: Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=suse.de header.s=susede2_rsa header.b=QE2kWbLl; dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=KpfxdY3T; spf=pass (imf03.hostedemail.com: domain of osalvador@suse.de designates 195.135.220.28 as permitted sender) smtp.mailfrom=osalvador@suse.de; dmarc=pass (policy=none) header.from=suse.de X-Stat-Signature: bx9azhegpm9hji1f5xgqdy8ij4kg7e4w X-Rspamd-Queue-Id: A7A8120062 X-HE-Tag: 1662347428-200836 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: Changes v1 -> v2: - Add feedback from Michal, Marco and Ammar (Thanks!) Hi, page_owner is a great debug functionality tool that gets us to know about all pages that have been allocated/freed and their stacktrace. This comes very handy when e.g: debugging leaks, as with some scripting we might be able to see those stacktraces that are allocating pages but not freeing theme. In my experience, that is one of the most useful cases, but it can get really tedious to screen through all pages aand try to reconstruct the stack <-> allocated/freed relationship. There is a lot of noise to cancel off. This patch aims to fix that by adding a new functionality into page_owner. What this does is to create a new read-only file "page_owner_stacks", which prints only the allocating stacktraces and their counting, being that the times the stacktrace has allocated - the times it has freed. So we have a clear overview of stacks <-> allocated/freed relationship without the need to fiddle with pages and trying to match free stacktraces with allocated stacktraces. This is achieved by adding a new refcount_t field in the stack_record struct, incrementing that refcount_t everytime the same stacktrace allocates, and decrementing it when it frees a page. Details can be seen in the respective patches. We also create another file called "page_owner_threshold", which let us specify a threshold, so when when reading from "page_owner_stacks", we will only see those stacktraces which counting goes beyond the threshold we specified. A PoC can be found below: # cat /sys/kernel/debug/page_owner_threshold 0 # cat /sys/kernel/debug/page_owner_stacks > stacks_full.txt # head -32 stacks_full.txt prep_new_page+0x10d/0x180 get_page_from_freelist+0x1bd6/0x1e10 __alloc_pages+0x194/0x360 alloc_page_interleave+0x13/0x90 new_slab+0x31d/0x530 ___slab_alloc+0x5d7/0x720 __slab_alloc.isra.85+0x4a/0x90 kmem_cache_alloc+0x455/0x4a0 acpi_ps_alloc_op+0x57/0x8f acpi_ps_create_scope_op+0x12/0x23 acpi_ps_execute_method+0x102/0x2c1 acpi_ns_evaluate+0x343/0x4da acpi_evaluate_object+0x1cb/0x392 acpi_run_osc+0x135/0x260 acpi_init+0x165/0x4ed do_one_initcall+0x3e/0x200 stack count: 2 free_pcp_prepare+0x287/0x5c0 free_unref_page+0x1c/0xd0 __mmdrop+0x50/0x160 finish_task_switch+0x249/0x2b0 __schedule+0x2c3/0x960 schedule+0x44/0xb0 futex_wait_queue+0x70/0xd0 futex_wait+0x160/0x250 do_futex+0x11c/0x1b0 __x64_sys_futex+0x5e/0x1d0 do_syscall_64+0x37/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd stack count: 1 # echo 10000 > /sys/kernel/debug/page_owner_threshold # cat /sys/kernel/debug/page_owner_stacks > stacks_10000.txt # cat stacks_10000.txt prep_new_page+0x10d/0x180 get_page_from_freelist+0x1bd6/0x1e10 __alloc_pages+0x194/0x360 folio_alloc+0x17/0x40 page_cache_ra_unbounded+0x96/0x170 filemap_get_pages+0x23d/0x5e0 filemap_read+0xbf/0x3a0 __kernel_read+0x136/0x2f0 kernel_read_file+0x197/0x2d0 kernel_read_file_from_fd+0x54/0x90 __do_sys_finit_module+0x89/0x120 do_syscall_64+0x37/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd stack count: 36195 prep_new_page+0x10d/0x180 get_page_from_freelist+0x1bd6/0x1e10 __alloc_pages+0x194/0x360 folio_alloc+0x17/0x40 page_cache_ra_unbounded+0x96/0x170 filemap_get_pages+0x23d/0x5e0 filemap_read+0xbf/0x3a0 new_sync_read+0x106/0x180 vfs_read+0x16f/0x190 ksys_read+0xa5/0xe0 do_syscall_64+0x37/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd stack count: 44484 prep_new_page+0x10d/0x180 get_page_from_freelist+0x1bd6/0x1e10 __alloc_pages+0x194/0x360 folio_alloc+0x17/0x40 page_cache_ra_unbounded+0x96/0x170 filemap_get_pages+0xdd/0x5e0 filemap_read+0xbf/0x3a0 new_sync_read+0x106/0x180 vfs_read+0x16f/0x190 ksys_read+0xa5/0xe0 do_syscall_64+0x37/0x90 entry_SYSCALL_64_after_hwframe+0x63/0xcd stack count: 17874 Oscar Salvador (3): lib/stackdepot: Add a refcount field in stack_record mm, page_owner: Add page_owner_stacks file to print out only stacks and their counter mm,page_owner: Filter out stacks by a threshold counter include/linux/stackdepot.h | 15 ++++- lib/stackdepot.c | 121 ++++++++++++++++++++++++++++++++----- mm/kasan/common.c | 3 +- mm/page_owner.c | 88 +++++++++++++++++++++++++-- 4 files changed, 207 insertions(+), 20 deletions(-)