From nobody Wed Jun 17 04:05:11 2026 Received: from mail-m49203.qiye.163.com (mail-m49203.qiye.163.com [45.254.49.203]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB4123D47A4 for ; Tue, 28 Apr 2026 08:27:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.254.49.203 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777364838; cv=none; b=PXJbk4GqatgMLpmUbd9BNLXPXjCzjsyqRoD7A2SGJAi3P3Q1kqBax6GmCiD7yD/Y5WWx69MubvWRTSnGAM3GwXdaHUBPXIIt9GkmsGyROI3ovCVSV4ZIs0Z88n99d4q271obP2i+kPd6jj7NTroHczQUa/N5UGG3yIYkkoSKiRQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777364838; c=relaxed/simple; bh=+IqpEDML3CGPzhW88m74vY4u1DzTl51NWmCtAgg9qOc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fVg/juOMSuKeb7hiQkWcgC/DyM7dZy1MC5xIJm/Y33zo3+G6M8sABVU1yuY8HKGncocQGjGqV0K2C/IowN+jdHl0JHnljwbEgStHJKXr4MSFsoZurWu0IzZz5i6agXZA9Tewy10upzRZAbgpuGFRxzrjaR2MMqPYW0ZtpwGZeRM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn; spf=pass smtp.mailfrom=easystack.cn; arc=none smtp.client-ip=45.254.49.203 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=easystack.cn Received: from localhost.localdomain (unknown [218.94.118.90]) by smtp.qiye.163.com (Hmail) with ESMTP id 197b492f8; Tue, 28 Apr 2026 15:11:24 +0800 (GMT+08:00) From: Zhen Ni To: akpm@linux-foundation.org, vbabka@kernel.org Cc: surenb@google.com, mhocko@suse.com, jackmanb@google.com, hannes@cmpxchg.org, ziy@nvidia.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Zhen Ni Subject: [PATCH v3 1/4] mm/page_owner: add filter infrastructure Date: Tue, 28 Apr 2026 15:11:09 +0800 Message-Id: <20260428071112.1420380-2-zhen.ni@easystack.cn> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260428071112.1420380-1-zhen.ni@easystack.cn> References: <20260428071112.1420380-1-zhen.ni@easystack.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9dd2eda9d00229kunmb0c223f1156f03 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFJQjdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlDGU0ZVh9CTE4fHUNPGUNIHlYVFA kWGhdVGRETFhoSFyQUDg9ZV1kYEgtZQVlJSkNVQk9VSkpDVUJLWVdZFhoPEhUdFFlBWU9LSFVKS0 lPT09IVUpLS1VKQktLWQY+ Content-Type: text/plain; charset="utf-8" Add data structure for page_owner filtering functionality and create debugfs directory for filter controls. This adds: - enum page_owner_print_mode with values for full_stack and stack_handle - struct page_owner_filter with print_mode and nid_mask fields - Static owner_filter instance initialized with default values - page_owner_filter debugfs directory The filter infrastructure will be used to add print_mode and NUMA node filtering capabilities in subsequent commits. Link: https://lore.kernel.org/linux-mm/20260417154638.22370-2-zhen.ni@easys= tack.cn/ Suggested-by: Zi Yan Signed-off-by: Zhen Ni --- Changes in v2: - Use enum page_owner_print_mode instead of bool 'compact' for better clari= ty - Use nodemask_t instead of int 'nid' to support multi-node filtering Changes in v3: - No code changes --- mm/page_owner.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/mm/page_owner.c b/mm/page_owner.c index 8178e0be557f..5884d883837e 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -54,6 +54,21 @@ struct stack_print_ctx { u8 flags; }; =20 +enum page_owner_print_mode { + PAGE_OWNER_PRINT_FULL_STACK, + PAGE_OWNER_PRINT_STACK_HANDLE, +}; + +struct page_owner_filter { + enum page_owner_print_mode print_mode; + nodemask_t nid_mask; +}; + +static struct page_owner_filter owner_filter =3D { + .print_mode =3D PAGE_OWNER_PRINT_FULL_STACK, + .nid_mask =3D NODE_MASK_NONE, +}; + static bool page_owner_enabled __initdata; DEFINE_STATIC_KEY_FALSE(page_owner_inited); =20 @@ -973,7 +988,7 @@ DEFINE_SIMPLE_ATTRIBUTE(page_owner_threshold_fops, &pag= e_owner_threshold_get, =20 static int __init pageowner_init(void) { - struct dentry *dir; + struct dentry *dir, *filter_dir; =20 if (!static_branch_unlikely(&page_owner_inited)) { pr_info("page_owner is disabled\n"); @@ -981,6 +996,9 @@ static int __init pageowner_init(void) } =20 debugfs_create_file("page_owner", 0400, NULL, NULL, &page_owner_fops); + + filter_dir =3D debugfs_create_dir("page_owner_filter", NULL); + dir =3D debugfs_create_dir("page_owner_stacks", NULL); debugfs_create_file("show_stacks", 0400, dir, (void *)(STACK_PRINT_FLAG_STACK | --=20 2.20.1 From nobody Wed Jun 17 04:05:11 2026 Received: from mail-m1973197.qiye.163.com (mail-m1973197.qiye.163.com [220.197.31.97]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 84DA23D648C for ; Tue, 28 Apr 2026 07:26:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777361218; cv=none; b=oxGZJ4Zii9oluVXTsRKnu+ODHWggWXsWlTVLlYnXp61zWMWDbVujvR3LyvXqRFtb2tIe9ypFAEXkggep9D+lRr/XF1KEjl4wsmOESn6/2T5Ebkooc0HWliL55tgJGueDGeO1JtD/qpr1lrgUlG3w6l6WsW5z0MzqH950osqf75g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777361218; c=relaxed/simple; bh=ujWkUCN01e4StMqQq2nqIxxrBWa8rlTGIqA7v3FOkw0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=lMPWimC8Fv3MUw30nHoloUzJbIYaipsyc1uqb0QWDkEtcKbYmUy+s7w3dx2Hxjxp/Oyz6S63HswbAF82JUAqAbviEFbkOAEcACU9szAY7EYtyH3ZE3JgSRRjXm92/dKFCGfC939Jc+0siIX43mfjGpBG6efFuYTyZJ+MMYtk+ww= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn; spf=pass smtp.mailfrom=easystack.cn; arc=none smtp.client-ip=220.197.31.97 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=easystack.cn Received: from localhost.localdomain (unknown [218.94.118.90]) by smtp.qiye.163.com (Hmail) with ESMTP id 197b49302; Tue, 28 Apr 2026 15:11:26 +0800 (GMT+08:00) From: Zhen Ni To: akpm@linux-foundation.org, vbabka@kernel.org Cc: surenb@google.com, mhocko@suse.com, jackmanb@google.com, hannes@cmpxchg.org, ziy@nvidia.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Zhen Ni Subject: [PATCH v3 2/4] mm/page_owner: add print_mode filter Date: Tue, 28 Apr 2026 15:11:10 +0800 Message-Id: <20260428071112.1420380-3-zhen.ni@easystack.cn> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260428071112.1420380-1-zhen.ni@easystack.cn> References: <20260428071112.1420380-1-zhen.ni@easystack.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9dd2edb2230229kunmb0c223f1156f19 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFJQjdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCTkgdVhgYQkpNHxgeShhIH1YVFA kWGhdVGRETFhoSFyQUDg9ZV1kYEgtZQVlJSkNVQk9VSkpDVUJLWVdZFhoPEhUdFFlBWU9LSFVKS0 lPT09IVUpLS1VKQktLWQY+ Content-Type: text/plain; charset="utf-8" Add print_mode functionality to reduce page_owner output size by printing only the stack handle instead of the full stack trace. Example output with print_mode enabled: Page allocated via order 0, mask 0x42800(GFP_NOWAIT|__GFP_COMP), pid 1, tgid 1 (systemd), ts 349667370 ns PFN 0xa00a2 type Unmovable Block 1280 type Unmovable Flags 0x33fffe0000004124(referenced|lru|active|private|node=3D3|zone=3D0| lastcpupid=3D0x1ffff) handle: 17432583 Charged to memcg / Print mode significantly reduces output size while preserving all other page allocation information. The correspondence between handles and stack traces can be obtained through the show_stacks_handles interface. Link: https://lore.kernel.org/linux-mm/20260417154638.22370-3-zhen.ni@easys= tack.cn/ Suggested-by: Zi Yan Signed-off-by: Zhen Ni --- Changes in v2: - Renamed from 'compact mode' to 'print_mode' for better clarity - Use enum values (0=3Dfull_stack, 1=3Dstack_handle) instead of boolean - Update debugfs filename from 'compact' to 'print_mode' Changes in v3: - No code changes --- mm/page_owner.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/mm/page_owner.c b/mm/page_owner.c index 5884d883837e..6d87b6948cfa 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -590,7 +590,13 @@ print_page_owner(char __user *buf, size_t count, unsig= ned long pfn, migratetype_names[pageblock_mt], &page->flags); =20 - ret +=3D stack_depot_snprint(handle, kbuf + ret, count - ret, 0); + /* Print mode: full stack or stack handle */ + if (READ_ONCE(owner_filter.print_mode) =3D=3D PAGE_OWNER_PRINT_STACK_HAND= LE) { + ret +=3D scnprintf(kbuf + ret, count - ret, + "handle: %d\n", handle); + } else { + ret +=3D stack_depot_snprint(handle, kbuf + ret, count - ret, 0); + } if (ret >=3D count) goto err; =20 @@ -985,6 +991,24 @@ static int page_owner_threshold_set(void *data, u64 va= l) DEFINE_SIMPLE_ATTRIBUTE(page_owner_threshold_fops, &page_owner_threshold_g= et, &page_owner_threshold_set, "%llu"); =20 +static int page_owner_print_mode_get(void *data, u64 *val) +{ + *val =3D READ_ONCE(owner_filter.print_mode); + return 0; +} + +static int page_owner_print_mode_set(void *data, u64 val) +{ + if (val > PAGE_OWNER_PRINT_STACK_HANDLE) + return -EINVAL; + WRITE_ONCE(owner_filter.print_mode, val); + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(page_owner_print_mode_fops, + &page_owner_print_mode_get, + &page_owner_print_mode_set, "%lld"); + =20 static int __init pageowner_init(void) { @@ -998,6 +1022,8 @@ static int __init pageowner_init(void) debugfs_create_file("page_owner", 0400, NULL, NULL, &page_owner_fops); =20 filter_dir =3D debugfs_create_dir("page_owner_filter", NULL); + debugfs_create_file("print_mode", 0600, filter_dir, NULL, + &page_owner_print_mode_fops); =20 dir =3D debugfs_create_dir("page_owner_stacks", NULL); debugfs_create_file("show_stacks", 0400, dir, --=20 2.20.1 From nobody Wed Jun 17 04:05:11 2026 Received: from mail-m1973196.qiye.163.com (mail-m1973196.qiye.163.com [220.197.31.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6ADA03C4552 for ; Tue, 28 Apr 2026 07:26:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.31.96 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777361218; cv=none; b=N1mminxPsgq4ao4/JNeye8AU7gnT3EmoE6fLzxsjulY73rTomHJTdoeQG+oUfUsMDJ5akYonhVuLDWrDXdcOjUBrlPHToJ8msVkmXyrr2Pykf21O+OyKjK7+MHMUWFUbDsbey+Rt7PuZAdxY9zskKbUTgKeN+beTZbcPBCko8oQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777361218; c=relaxed/simple; bh=ZNmAacTvlcxUpZTzLgEpNmjctmtoWm1BdY2OZ9tCEZY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oR/hLX9GSBA6cy8NoLG/GVctO+hNQ8+mQJk6iGSE6qIe97ugLZuhnWKIs8HmtMXq74EcOS2iqOyYIWys7nGj8g6n5CLzo8TF0rVCaH36nYbSrACJHDgmUDk5APk0tWBItgASiX1a7vrvpjIyTVofdEoN9GU3X5v6ubY1ilIKsVw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn; spf=pass smtp.mailfrom=easystack.cn; arc=none smtp.client-ip=220.197.31.96 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=easystack.cn Received: from localhost.localdomain (unknown [218.94.118.90]) by smtp.qiye.163.com (Hmail) with ESMTP id 197b49307; Tue, 28 Apr 2026 15:11:27 +0800 (GMT+08:00) From: Zhen Ni To: akpm@linux-foundation.org, vbabka@kernel.org Cc: surenb@google.com, mhocko@suse.com, jackmanb@google.com, hannes@cmpxchg.org, ziy@nvidia.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Zhen Ni Subject: [PATCH v3 3/4] mm/page_owner: add NUMA node filter with nodelist support Date: Tue, 28 Apr 2026 15:11:11 +0800 Message-Id: <20260428071112.1420380-4-zhen.ni@easystack.cn> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260428071112.1420380-1-zhen.ni@easystack.cn> References: <20260428071112.1420380-1-zhen.ni@easystack.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9dd2edb8600229kunmb0c223f1156f22 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFJQjdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVkaQ09PVhlCH04ZTEwaHRlNSFYVFA kWGhdVGRETFhoSFyQUDg9ZV1kYEgtZQVlJSkNVQk9VSkpDVUJLWVdZFhoPEhUdFFlBWU9LSFVKS0 lPT09IVUpLS1VKQktLWQY+ Content-Type: text/plain; charset="utf-8" Add NUMA node filtering functionality to page_owner to allow filtering pages by specific NUMA node(s) using nodelist format. The filter allows users to focus on pages from specific NUMA nodes, which is useful for NUMA-aware memory allocation analysis and debugging. Supported input formats: - Single node: echo "2" > nid - Multiple nodes: echo "0,2,3" > nid - Node range: echo "0-3" > nid - Mixed format: echo "0,2-4,7" > nid - Disable filter: echo "-1" > nid Link: https://lore.kernel.org/linux-mm/20260417154638.22370-4-zhen.ni@easys= tack.cn/ Link: https://lore.kernel.org/linux-mm/20260419155540.376847-4-zhen.ni@easy= stack.cn/ Suggested-by: Zi Yan Signed-off-by: Zhen Ni --- Changes in v2: - Use nodemask_t instead of int to support multiple nodes - Implement nodelist_parse() to support flexible input formats * Single node: "0", "2" * Multiple nodes: "0,2,3" * Ranges: "0-3" * Mixed: "0,2-4,7" - Use %*pbl format for output (e.g., "0-2", "0,2-4,7") - Use dynamic memory allocation (kmalloc) to handle variable-length input - Follow cpuset's max_write_len pattern: (100 + 6 * MAX_NUMNODES) Changes in v3: - Remove READ_ONCE/WRITE_ONCE for nodemask_t (fixes compilation errors) * nodemask_t is a large structure (128 bytes) that triggers compile-time = asserts * Direct assignment is safe for this use case - Add comment explaining input length calculation formula * 6 bytes =3D ",NNNNN" (comma + 5-digit node number) - Simplify "-1" check using kstrtoint() instead of dual strcmp() - Move nodemask_t mask read outside PFN iteration loop for performance * Avoids 128-byte structure copy on each iteration --- mm/page_owner.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/mm/page_owner.c b/mm/page_owner.c index 6d87b6948cfa..e674a374669a 100644 --- a/mm/page_owner.c +++ b/mm/page_owner.c @@ -685,6 +685,7 @@ read_page_owner(struct file *file, char __user *buf, si= ze_t count, loff_t *ppos) struct page_ext *page_ext; struct page_owner *page_owner; depot_stack_handle_t handle; + nodemask_t mask; =20 if (!static_branch_unlikely(&page_owner_inited)) return -EINVAL; @@ -698,6 +699,8 @@ read_page_owner(struct file *file, char __user *buf, si= ze_t count, loff_t *ppos) while (!pfn_valid(pfn) && (pfn & (MAX_ORDER_NR_PAGES - 1)) !=3D 0) pfn++; =20 + mask =3D owner_filter.nid_mask; + /* Find an allocated page */ for (; pfn < max_pfn; pfn++) { /* @@ -730,6 +733,14 @@ read_page_owner(struct file *file, char __user *buf, s= ize_t count, loff_t *ppos) if (unlikely(!page_ext)) continue; =20 + /* NUMA node filter using bitmask */ + if (!nodes_empty(mask)) { + int nid =3D page_to_nid(page); + + if (!node_isset(nid, mask)) + goto ext_put_continue; + } + /* * Some pages could be missed by concurrent allocation or free, * because we don't hold the zone lock. @@ -1009,6 +1020,75 @@ DEFINE_SIMPLE_ATTRIBUTE(page_owner_print_mode_fops, &page_owner_print_mode_get, &page_owner_print_mode_set, "%lld"); =20 +static ssize_t nid_filter_write(struct file *file, + const char __user *buf, + size_t count, loff_t *ppos) +{ + char *kbuf; + nodemask_t mask; + int ret; + int val; + + /* + * Limit input size to handle worst-case nodelist (all nodes). + * Worst case per node: ",NNNNN" (comma + 5-digit node number) =3D 6 byte= s. + * Formula: 100 bytes overhead + 6 * MAX_NUMNODES + */ + if (count > (100 + 6 * MAX_NUMNODES)) + return -EINVAL; + + kbuf =3D kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) + return -ENOMEM; + + if (copy_from_user(kbuf, buf, count)) { + ret =3D -EFAULT; + goto out_free; + } + kbuf[count] =3D '\0'; + + /* Support: "-1" to clear, or nodelist format like "0", "0,2", "0-3" */ + if (kstrtoint(kbuf, 10, &val) =3D=3D 0 && val =3D=3D -1) + nodes_clear(mask); + else if (nodelist_parse(kbuf, mask)) { + ret =3D -EINVAL; + goto out_free; + } + + owner_filter.nid_mask =3D mask; + ret =3D count; + +out_free: + kfree(kbuf); + return ret; +} + +static int nid_filter_show(struct seq_file *m, void *v) +{ + nodemask_t mask =3D owner_filter.nid_mask; + + if (nodes_empty(mask)) + seq_puts(m, "-1\n"); + else + seq_printf(m, "%*pbl\n", nodemask_pr_args(&mask)); + + return 0; +} + +static int nid_filter_open(struct inode *inode, struct file *file) +{ + return single_open(file, nid_filter_show, NULL); +} + +static const struct file_operations nid_filter_fops =3D { + .owner =3D THIS_MODULE, + .open =3D nid_filter_open, + .read =3D seq_read, + .llseek =3D seq_lseek, + .write =3D nid_filter_write, + .release =3D single_release, +}; + =20 static int __init pageowner_init(void) { @@ -1024,6 +1104,8 @@ static int __init pageowner_init(void) filter_dir =3D debugfs_create_dir("page_owner_filter", NULL); debugfs_create_file("print_mode", 0600, filter_dir, NULL, &page_owner_print_mode_fops); + debugfs_create_file("nid", 0600, filter_dir, NULL, + &nid_filter_fops); =20 dir =3D debugfs_create_dir("page_owner_stacks", NULL); debugfs_create_file("show_stacks", 0400, dir, --=20 2.20.1 From nobody Wed Jun 17 04:05:11 2026 Received: from mail-m32112.qiye.163.com (mail-m32112.qiye.163.com [220.197.32.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4ADD13D6CDF for ; Tue, 28 Apr 2026 07:26:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=220.197.32.112 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777361222; cv=none; b=Pq+Xu0MR00wpt1kHcuWon9NzImCS6dCM4WoB51gkOl8rYu3jccuBQn8BFhEv8He1Spkx/w94GH7QCndqDiAZuTTebVUjtHXDDDvPIhPrf6cV/0jDSF0MKjEddbLBZn3sEWBiayjk6BSrps6k5wtDeA5wdJKe8f18foLK488eCrA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777361222; c=relaxed/simple; bh=8AxRuB6PdhnZ5mViMlFtjIPzDrwgeTCegj1zMHHDRog=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sng3lp1BmiKIeipXtNiWp6ziAGe5bz+VQvNevGrPlFJsK7dly4NbHGan1fZ5UTyg1LP6xX1922rXLmr1gYpwP6v/h/r7p0oirPhxjsWnFb5P8lhKSZYZaKhz0lcS0ZbwuWMnyhRB/ndWlq6hbF1j7VpZe32F6I64rDg2lMhw4Jo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn; spf=pass smtp.mailfrom=easystack.cn; arc=none smtp.client-ip=220.197.32.112 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=easystack.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=easystack.cn Received: from localhost.localdomain (unknown [218.94.118.90]) by smtp.qiye.163.com (Hmail) with ESMTP id 197b49313; Tue, 28 Apr 2026 15:11:29 +0800 (GMT+08:00) From: Zhen Ni To: akpm@linux-foundation.org, vbabka@kernel.org Cc: surenb@google.com, mhocko@suse.com, jackmanb@google.com, hannes@cmpxchg.org, ziy@nvidia.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Zhen Ni Subject: [PATCH v3 4/4] mm/page_owner: document page_owner filter features Date: Tue, 28 Apr 2026 15:11:12 +0800 Message-Id: <20260428071112.1420380-5-zhen.ni@easystack.cn> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20260428071112.1420380-1-zhen.ni@easystack.cn> References: <20260428071112.1420380-1-zhen.ni@easystack.cn> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-HM-Tid: 0a9dd2edc0af0229kunmb0c223f1156f39 X-HM-MType: 1 X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFJQjdXWRgWCB1ZQUpXWS1ZQUlXWQ8JGhUIEh9ZQVlCTENPVkxNSk4ZTk5DGU1JHlYVFA kWGhdVGRETFhoSFyQUDg9ZV1kYEgtZQVlJSkNVQk9VSkpDVUJLWVdZFhoPEhUdFFlBWU9LSFVKS0 lPT09IVUpLS1VKQktLWQY+ Content-Type: text/plain; charset="utf-8" Add documentation for the page_owner filter functionality, including: - Print mode filter (full stack vs stack handle) - NUMA node filter (single node, multiple nodes, ranges) - Usage examples for both filters Signed-off-by: Zhen Ni --- Changes in v3: - New patch to document filter features as requested by Andrew Morton --- Documentation/mm/page_owner.rst | 55 ++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/Documentation/mm/page_owner.rst b/Documentation/mm/page_owner.= rst index 6b12f3b007ec..6261366d33fe 100644 --- a/Documentation/mm/page_owner.rst +++ b/Documentation/mm/page_owner.rst @@ -74,7 +74,17 @@ Usage =20 3) Do the job that you want to debug. =20 -4) Analyze information from page owner:: +4) (Optional) Use filters to focus on specific memory allocations:: + + cd /sys/kernel/debug/page_owner_filter + + # Print only stack handles instead of full traces + echo 1 > print_mode + + # Filter by NUMA nodes + echo "0,2-3" > nid + +5) Analyze information from page owner:: =20 cat /sys/kernel/debug/page_owner_stacks/show_stacks > stacks.txt cat stacks.txt @@ -238,6 +248,49 @@ Usage ./page_owner_sort --tgid=3D1,2,3 ./page_owner_sort --name name1,name2 =20 +Page Owner Filters +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The page_owner feature provides filtering capabilities to focus on specific +memory allocations (e.g., by NUMA node). Filters are controlled through de= bugfs +files in ``/sys/kernel/debug/page_owner_filter/``. + +Print Mode Filter +----------------- + +The ``print_mode`` file controls the level of detail in stack trace output. + +Available modes: + +- ``0`` (default): Print full stack traces +- ``1``: Print only stack handles + +The ``print_mode=3D1`` output format:: + + Page allocated via order 0, mask 0x42800(GFP_NOWAIT|__GFP_COMP), + pid 1, tgid 1 (systemd), ts 349667370 ns + PFN 0xa00a2 type Unmovable Block 1280 type Unmovable + Flags 0x33fffe0000004124(...) + handle: 17432583 + +To retrieve the full stack trace for a handle, use:: + + cat /sys/kernel/debug/page_owner_stacks/show_stacks_handles + +NUMA Node Filter +---------------- + +The ``nid`` file filters pages by NUMA node. This is useful for NUMA-aware +environments to analyze node-specific memory allocation. + +Supported input formats: + +- Single node: ``echo "2" > nid`` +- Multiple nodes: ``echo "0,2,3" > nid`` +- Node range: ``echo "0-3" > nid`` +- Mixed format: ``echo "0,2-4,7" > nid`` +- Disable filter: ``echo "-1" > nid`` + STANDARD FORMAT SPECIFIERS =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D :: --=20 2.20.1