mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
mm/page_owner: document page_owner filter
Add documentation for the page_owner_filter userspace tool and kernel-level filtering features. [rdunlap@infradead.org: avoid docs build warning] Link: https://lore.kernel.org/20260708213548.469155-1-rdunlap@infradead.org Link: https://lore.kernel.org/20260707115411.1714314-5-zhen.ni@easystack.cn Signed-off-by: Zhen Ni <zhen.ni@easystack.cn> Signed-off-by: Randy Dunlap <rdunlap@infradead.org> Acked-by: Vlastimil Babka (SUSE) <vbabka@kernel.org> Acked-by: Zi Yan <ziy@nvidia.com> Cc: Brendan Jackman <jackmanb@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Suren Baghdasaryan <surenb@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
@@ -65,7 +65,15 @@ un-tracking state.
|
||||
Usage
|
||||
=====
|
||||
|
||||
1) Build user-space helper::
|
||||
1) Build user-space helpers:
|
||||
::
|
||||
|
||||
To filter page_owner output:
|
||||
|
||||
cd tools/mm
|
||||
make page_owner_filter
|
||||
|
||||
To sort and analyze page_owner output:
|
||||
|
||||
cd tools/mm
|
||||
make page_owner_sort
|
||||
@@ -74,7 +82,11 @@ Usage
|
||||
|
||||
3) Do the job that you want to debug.
|
||||
|
||||
4) Analyze information from page owner::
|
||||
4) (Optional) Filter page_owner output::
|
||||
|
||||
./page_owner_filter -m handle -n 0,1,2 > filtered_page_owner.txt
|
||||
|
||||
5) Analyze information from page owner::
|
||||
|
||||
cat /sys/kernel/debug/page_owner_stacks/show_stacks > stacks.txt
|
||||
cat stacks.txt
|
||||
@@ -263,3 +275,65 @@ STANDARD FORMAT SPECIFIERS
|
||||
f free whether the page has been released or not
|
||||
st stacktrace stack trace of the page allocation
|
||||
ator allocator memory allocator for pages
|
||||
|
||||
Filtering page_owner output
|
||||
============================
|
||||
|
||||
page_owner supports filtering output at the kernel level before reading,
|
||||
which reduces the amount of data that needs to be processed in userspace.
|
||||
|
||||
The page_owner_filter tool provides a convenient interface for this filtering
|
||||
capability. It supports two types of filters:
|
||||
|
||||
1. **print_mode filter**: Control what information is printed for each page
|
||||
- ``stack``: Print full stack traces (default, compatible with existing usage)
|
||||
- ``handle``: Print only stack handle numbers (much faster, smaller output)
|
||||
- ``stack_handle``: Print both stack traces and handle numbers
|
||||
|
||||
The ``handle`` mode uses numeric identifiers instead of full stack traces.
|
||||
The mapping from handles to actual stack traces can be obtained via the
|
||||
show_stacks_handles interface.
|
||||
|
||||
2. **NUMA node filter**: Filter pages by NUMA node ID
|
||||
- Supports single node: ``-n 0``
|
||||
- Multiple nodes: ``-n 0,1,2``
|
||||
- Ranges: ``-n 0-3``
|
||||
- Mixed format: ``-n 0,2-3,5``
|
||||
|
||||
Usage examples::
|
||||
|
||||
# Filter by print mode
|
||||
./page_owner_filter -m handle
|
||||
./page_owner_filter -m stack_handle
|
||||
|
||||
# Filter by NUMA node
|
||||
./page_owner_filter -n 0
|
||||
./page_owner_filter -n 0-3
|
||||
|
||||
# Combined filters
|
||||
./page_owner_filter -m stack -n 0,1,2
|
||||
./page_owner_filter -m handle -n 0,2-3
|
||||
|
||||
# Save to file
|
||||
./page_owner_filter -m handle -o filtered_output.txt
|
||||
|
||||
The handle mode is particularly useful for monitoring and performance-critical
|
||||
scenarios as it dramatically reduces output size. Testing shows handle mode can
|
||||
reduce output size by ~66% (84MB vs 244MB) and improve read performance by ~4.4x
|
||||
compared to full stack output.
|
||||
|
||||
The NUMA node filter is useful for NUMA-aware memory allocation analysis and debugging.
|
||||
|
||||
Behind the scenes, page_owner_filter opens /sys/kernel/debug/page_owner and
|
||||
writes filter commands before reading the filtered output. The filtering uses
|
||||
per-file-descriptor state, allowing each open() to have independent filter settings.
|
||||
|
||||
Each file descriptor maintains its own filter state, so you can have multiple
|
||||
independent filtering operations running concurrently. For example, in different
|
||||
terminals you can run different filters simultaneously::
|
||||
|
||||
# Terminal 1: Filter node 0
|
||||
./page_owner_filter -n 0 > node0_output.txt
|
||||
|
||||
# Terminal 2: Filter node 1 (runs concurrently)
|
||||
./page_owner_filter -n 1 > node1_output.txt
|
||||
|
||||
Reference in New Issue
Block a user