mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 19:16:02 +02:00
Everything: Total patches: 171 Reviews/patch: 1.83 Reviewed rate: 82% Excluding selftests: Total patches: 149 Reviews/patch: 1.77 Reviewed rate: 80% Excluding selftests and maple_tree: Total patches: 129 Reviews/patch: 1.99 Reviewed rate: 89% Summary of patch series in this merge: - "mm/rmap: index MAP_PRIVATE file-backed folios by anonymous pgoff" (Lorenzo Stoakes): Index MAP_PRIVATE file-backed folios by their anonymous page offset to resolve confusion around reverse mapping for zeroed and CoW'd file-backed memory. Use this new VMA anonymous page offset tracking to eliminate index conflicts and lay the foundation for scalable CoW performance improvements. - "promote mapped executable folios after first usage for MGLRU" (Baolin Wang): Make MGLRU's protection of mapped executable file folios more reliable. Follow the classical LRU's logic, promoting mapped executable file folios after their first usage to give executable code a better chance to stay in memory and improve workload performance. - "mm: vmscan: fix node reclaim ignoring swappiness parameter" (Ridong Chen): Fix per-node proactive reclaim interface's ignoring the swappiness parameter when CONFIG_MEMCG is disabled by consolidating sc_swappiness() into a single function that checks proactive_swappiness regardless of kernel configuration. - "mm/vmscan: reduce lru_lock contention via vmstat-derived scan-balance cost" (Usama Arif): Reduce lru_lock contention in the reclaim path by deriving scan-balance costs from vmstat counters rather than lock-acquired producer updates. Read and decay these cost signals on the reclaim side under a dedicated per-lruvec lock, reducing total LRU lock wait time by over 60% without impacting scan throughput. - "zram: fix zram issues reported by sashiko" (Sergey Senozhatsky): Fix two low-risk zram bugs which Sashiko spotted in drive-by review. - "Honor XA_FLAGS_ACCOUNT in xas_split_alloc() and charge to folio's memcg" (Zi Yan): Fix xas_split_alloc() by enabling target folio memcg charging during splits and adding the missing __GFP_ACCOUNT flag for proper XArray node memory accounting. - "selftests/mm: use pattern matching in .gitignore" (Pratyush Mallick): Replace hardcoded binary names in selftests/mm/.gitignore with a generic pattern-matching rule to automatically ignore generated test files and avoid manual updates when adding new tests. - "mm/page_ext: remove pgdat_page_ext_init()" (Sang-Heon Jeon): Make the incompatibility between FLATMEM and NUMA explicit in mm/Kconfig and remove the unused pgdat_page_ext_init() function. - "zram: fix zstd error paths and add parameter validation" (Haoqin Huang): Clean up zram compression backends by removing redundant error cleanup, adding parameter and dictionary validation, auto-prefixing algorithm error logs, and resetting parameters prior to reinitialization. - "zram: fix stale scan bounds after reinitialization" (Longlong Xia): Prevent out-of-bounds slot accesses during concurrent zram resets by moving table scan bound calculations under dev_lock in writeback_store() and read_block_state(). - "add anon mTHP collapse test cases" (Baolin Wang): Extend selftests helper functions to support arbitrary page orders and add new test cases and options for mTHP collapse in khugepaged. - "selftests/mm: Handle unsupported and transient test conditions" (Muhammad Usama Anjum): Update MM selftests to report a SKIP status instead of a failure when required kernel or filesystem features are unsupported, while adding retry logic for transient page migration errors. - "mm/zswap: Fixes and improves the zswap shrink" (Hao Jia): Fix the missing zswap global shrinker when CONFIG_MEMCG is disabled and extend shrink_memcg() to support batch writeback for improved writeback efficiency. - "alloc_tag: introduce IOCTL-based filtering for MAP" (Suren Baghdasaryan): Introduce an IOCTL-based binary interface for memory allocation profiling that enables kernel-side filtering before per-CPU counter aggregation. This eliminates the text-parsing overhead of /proc/allocinfo and provides up to a 20x speedup by transferring only filtered allocation data to userspace. - "better block swap batching and a different take on swap_ops v5" (Christoph Hellwig): Refactor block swap I/O to use swap_iocb for batching instead of single-bio requests and rebase the swap_ops interface, achieving faster swap throughput during kernel builds. - "mm: kmemleak: reduce transient false positives by confirming leaks" (Catalin Marinas): Reduce false-positive kmemleak reports by combining two kmemleak enhancements that add a second confirmation scan and a configurable minimum unreferenced scan count module parameter. - "mm: kmemleak: default min_unref_scans to 2 for verbose kernels" (Breno Leitao): Auto-scanning kernels can generate false-positive memory leak reports on single scans, so this patch defaults min_unref_scans to 2 when CONFIG_DEBUG_KMEMLEAK_VERBOSE is enabled to require a second confirming scan. - "swap_ops updates" (Christoph Hellwig): Batching I/O for synchronous swap devices causes performance regressions and filesystem-based swap suffers from double-indirection overhead. This series resolves both issues by reintroducing per-folio writes for synchronous swap and allowing filesystems to directly export their own swap_ops. - "mm/khugepaged: several cleanups" (Nico Pache): khugepaged accumulated redundant state-checking patterns and outdated comments following mTHP integration. Introduce dedicated helpers for PTE validation and event counting while refreshing the internal documentation. - "maple_tree: lock checking and clean ups" (Liam Howlett): Syzbot reports incorrectly blame memory management exit paths for locking bugs, maple tree erase operations risk allocation failures without gfp flags and internal documentation lacks clarity. Improve lock error detection, update docs, fix race and allocation edge cases and optimize erase allocations using a fallback to GFP_KERNEL | GFP_NOFAIL. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTTMBEPP41GrTpTJgfdBJ7gKXxAjgUCao9nJQAKCRDdBJ7gKXxA jk/9AQDlfevYJuSJmzAI8bt8ISG+/TfXMtIZC/MdbHqtQVYWPQD8Cvm3DUZsdGB/ Gloq/HBFuMPgE8p2pwUIthdgnTPNvAc= =c+Nb -----END PGP SIGNATURE----- Merge tag 'mm-stable-2026-08-26-15-22' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm Pull more MM updates from Andrew Morton: - "mm/rmap: index MAP_PRIVATE file-backed folios by anonymous pgoff" (Lorenzo Stoakes) Index MAP_PRIVATE file-backed folios by their anonymous page offset to resolve confusion around reverse mapping for zeroed and CoW'd file-backed memory. Use this new VMA anonymous page offset tracking to eliminate index conflicts and lay the foundation for scalable CoW performance improvements. - "promote mapped executable folios after first usage for MGLRU" (Baolin Wang) Make MGLRU's protection of mapped executable file folios more reliable. Follow the classical LRU's logic, promoting mapped executable file folios after their first usage to give executable code a better chance to stay in memory and improve workload performance. - "mm: vmscan: fix node reclaim ignoring swappiness parameter" (Ridong Chen) Fix per-node proactive reclaim interface's ignoring the swappiness parameter when CONFIG_MEMCG is disabled by consolidating sc_swappiness() into a single function that checks proactive_swappiness regardless of kernel configuration. - "mm/vmscan: reduce lru_lock contention via vmstat-derived scan-balance cost" (Usama Arif) Reduce lru_lock contention in the reclaim path by deriving scan-balance costs from vmstat counters rather than lock-acquired producer updates. Read and decay these cost signals on the reclaim side under a dedicated per-lruvec lock, reducing total LRU lock wait time by over 60% without impacting scan throughput. - "zram: fix zram issues reported by sashiko" (Sergey Senozhatsky) Fix two low-risk zram bugs which Sashiko spotted in drive-by review. - "Honor XA_FLAGS_ACCOUNT in xas_split_alloc() and charge to folio's memcg" (Zi Yan) Fix xas_split_alloc() by enabling target folio memcg charging during splits and adding the missing __GFP_ACCOUNT flag for proper XArray node memory accounting. - "selftests/mm: use pattern matching in .gitignore" (Pratyush Mallick) Replace hardcoded binary names in selftests/mm/.gitignore with a generic pattern-matching rule to automatically ignore generated test files and avoid manual updates when adding new tests. - "mm/page_ext: remove pgdat_page_ext_init()" (Sang-Heon Jeon) Make the incompatibility between FLATMEM and NUMA explicit in mm/Kconfig and remove the unused pgdat_page_ext_init() function. - "zram: fix zstd error paths and add parameter validation" (Haoqin Huang) Clean up zram compression backends by removing redundant error cleanup, adding parameter and dictionary validation, auto-prefixing algorithm error logs, and resetting parameters prior to reinitialization. - "zram: fix stale scan bounds after reinitialization" (Longlong Xia) Prevent out-of-bounds slot accesses during concurrent zram resets by moving table scan bound calculations under dev_lock in writeback_store() and read_block_state(). - "add anon mTHP collapse test cases" (Baolin Wang) Extend selftests helper functions to support arbitrary page orders and add new test cases and options for mTHP collapse in khugepaged. - "selftests/mm: Handle unsupported and transient test conditions" (Muhammad Usama Anjum) Update MM selftests to report a SKIP status instead of a failure when required kernel or filesystem features are unsupported, while adding retry logic for transient page migration errors. - "mm/zswap: Fixes and improves the zswap shrink" (Hao Jia) Fix the missing zswap global shrinker when CONFIG_MEMCG is disabled and extend shrink_memcg() to support batch writeback for improved writeback efficiency. - "alloc_tag: introduce IOCTL-based filtering for MAP" (Suren Baghdasaryan) Introduce an IOCTL-based binary interface for memory allocation profiling that enables kernel-side filtering before per-CPU counter aggregation. This eliminates the text-parsing overhead of /proc/allocinfo and provides up to a 20x speedup by transferring only filtered allocation data to userspace. - "better block swap batching and a different take on swap_ops v5" (Christoph Hellwig) Refactor block swap I/O to use swap_iocb for batching instead of single-bio requests and rebase the swap_ops interface, achieving faster swap throughput during kernel builds. - "mm: kmemleak: reduce transient false positives by confirming leaks" (Catalin Marinas) Reduce false-positive kmemleak reports by combining two kmemleak enhancements that add a second confirmation scan and a configurable minimum unreferenced scan count module parameter. - "mm: kmemleak: default min_unref_scans to 2 for verbose kernels" (Breno Leitao) Auto-scanning kernels can generate false-positive memory leak reports on single scans, so this patch defaults min_unref_scans to 2 when CONFIG_DEBUG_KMEMLEAK_VERBOSE is enabled to require a second confirming scan. - "swap_ops updates" (Christoph Hellwig) Batching I/O for synchronous swap devices causes performance regressions and filesystem-based swap suffers from double-indirection overhead. This series resolves both issues by reintroducing per-folio writes for synchronous swap and allowing filesystems to directly export their own swap_ops. - "mm/khugepaged: several cleanups" (Nico Pache) khugepaged accumulated redundant state-checking patterns and outdated comments following mTHP integration. Introduce dedicated helpers for PTE validation and event counting while refreshing the internal documentation. - "maple_tree: lock checking and clean ups" (Liam Howlett) Syzbot reports incorrectly blame memory management exit paths for locking bugs, maple tree erase operations risk allocation failures without gfp flags and internal documentation lacks clarity. Improve lock error detection, update docs, fix race and allocation edge cases and optimize erase allocations using a fallback to GFP_KERNEL | GFP_NOFAIL. * tag 'mm-stable-2026-08-26-15-22' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm: (172 commits) selftests/proc: make proc-maps-race work with READ_IMPLIES_EXEC memcg: move LRU size accounting on reparenting instead of copying it mm/vmscan: fix comment logic in balance_pgdat maple_tree: add helper mas_make_walkable() maple_tree: avoid extra gap calculation maple_tree: fix argument name in header maple_tree: change two GFP flags in tests maple_tree: document erase and allocations better maple_tree: avoid mas_erase() and mtree_erase() failures maple_tree: document that erase may use GFP_KERNEL for allocations maple_tree: catch race in mas_alloc_cyclic() maple_tree: add bulk parent set helper maple_tree: micro optimisation of mas_wr_store_type() maple_tree: optimise mas_wr_node_store() when not in rcu mode maple_tree: use prefetched value in mas_wr_store_type() maple_tree: clarify comments on mas_nomem() maple_tree: drop MAPLE_ALLOC_SLOTS maple_tree: drop dead code from mas_extend_spanning_null() maple_tree: documentation fix maple_tree: add write lock checking with lockdep sequence numbers ...
138 lines
5.4 KiB
ReStructuredText
138 lines
5.4 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
===========================
|
|
MEMORY ALLOCATION PROFILING
|
|
===========================
|
|
|
|
Low overhead (suitable for production) accounting of all memory allocations,
|
|
tracked by file and line number.
|
|
|
|
Usage:
|
|
kconfig options:
|
|
- CONFIG_MEM_ALLOC_PROFILING
|
|
|
|
- CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT
|
|
|
|
- CONFIG_MEM_ALLOC_PROFILING_DEBUG
|
|
adds warnings for allocations that weren't accounted because of a
|
|
missing annotation
|
|
|
|
Boot parameter:
|
|
sysctl.vm.mem_profiling={0|1|never}[,compressed]
|
|
|
|
When set to "never", memory allocation profiling overhead is minimized and it
|
|
cannot be enabled at runtime (sysctl becomes read-only).
|
|
When CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT=y, default value is "1".
|
|
When CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT=n, default value is "never".
|
|
"compressed" optional parameter will try to store page tag references in a
|
|
compact format, avoiding page extensions. This results in improved performance
|
|
and memory consumption, however it might fail depending on system configuration.
|
|
If compression fails, a warning is issued and memory allocation profiling gets
|
|
disabled.
|
|
|
|
sysctl:
|
|
/proc/sys/vm/mem_profiling
|
|
|
|
1: Enable memory profiling.
|
|
|
|
0: Disable memory profiling.
|
|
|
|
The default value depends on CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT.
|
|
|
|
When CONFIG_MEM_ALLOC_PROFILING_DEBUG=y, this control is read-only to avoid
|
|
warnings produced by allocations made while profiling is disabled and freed
|
|
when it's enabled.
|
|
|
|
/proc/sys/vm/mem_profiling_compressed
|
|
|
|
1: Page alloc tag compression is enabled.
|
|
|
|
0: Page alloc tag compression is disabled.
|
|
|
|
This reflects a static boot-time configuration of how page allocation tags are
|
|
stored (in page flags when compression is enabled and in page_ext when disabled).
|
|
Toggling ``mem_profiling`` at runtime does not change the state of
|
|
``mem_profiling_compressed``.
|
|
|
|
Runtime info:
|
|
/proc/allocinfo
|
|
|
|
Profiling data can be retrieved either by reading `/proc/allocinfo` directly as
|
|
text or programmatically via `ioctl()` calls defined in `<uapi/linux/alloc_tag.h>`.
|
|
The ioctl interface supports structured binary data extraction as well as filtering
|
|
by module name, function, file, line number, accuracy, or allocation size limits.
|
|
|
|
Example output::
|
|
|
|
root@moria-kvm:~# sort -g /proc/allocinfo|tail|numfmt --to=iec
|
|
2.8M 22648 fs/kernfs/dir.c:615 func:__kernfs_new_node
|
|
3.8M 953 mm/memory.c:4214 func:alloc_anon_folio
|
|
4.0M 1010 drivers/staging/ctagmod/ctagmod.c:20 [ctagmod] func:ctagmod_start
|
|
4.1M 4 net/netfilter/nf_conntrack_core.c:2567 func:nf_ct_alloc_hashtable
|
|
6.0M 1532 mm/filemap.c:1919 func:__filemap_get_folio
|
|
8.8M 2785 kernel/fork.c:307 func:alloc_thread_stack_node
|
|
13M 234 block/blk-mq.c:3421 func:blk_mq_alloc_rqs
|
|
14M 3520 mm/mm_init.c:2530 func:alloc_large_system_hash
|
|
15M 3656 mm/readahead.c:247 func:page_cache_ra_unbounded
|
|
55M 4887 mm/slub.c:2259 func:alloc_slab_page
|
|
122M 31168 mm/page_ext.c:270 func:alloc_page_ext
|
|
|
|
Theory of operation
|
|
===================
|
|
|
|
Memory allocation profiling builds off of code tagging, which is a library for
|
|
declaring static structs (that typically describe a file and line number in
|
|
some way, hence code tagging) and then finding and operating on them at runtime,
|
|
- i.e. iterating over them to print them in debugfs/procfs.
|
|
|
|
To add accounting for an allocation call, we replace it with a macro
|
|
invocation, alloc_hooks(), that
|
|
- declares a code tag
|
|
- stashes a pointer to it in task_struct
|
|
- calls the real allocation function
|
|
- and finally, restores the task_struct alloc tag pointer to its previous value.
|
|
|
|
This allows for alloc_hooks() calls to be nested, with the most recent one
|
|
taking effect. This is important for allocations internal to the mm/ code that
|
|
do not properly belong to the outer allocation context and should be counted
|
|
separately: for example, slab object extension vectors, or when the slab
|
|
allocates pages from the page allocator.
|
|
|
|
Thus, proper usage requires determining which function in an allocation call
|
|
stack should be tagged. There are many helper functions that essentially wrap
|
|
e.g. kmalloc() and do a little more work, then are called in multiple places;
|
|
we'll generally want the accounting to happen in the callers of these helpers,
|
|
not in the helpers themselves.
|
|
|
|
To fix up a given helper, for example foo(), do the following:
|
|
- switch its allocation call to the _noprof() version, e.g. kmalloc_noprof()
|
|
|
|
- rename it to foo_noprof()
|
|
|
|
- define a macro version of foo() like so:
|
|
|
|
#define foo(...) alloc_hooks(foo_noprof(__VA_ARGS__))
|
|
|
|
It's also possible to stash a pointer to an alloc tag in your own data structures.
|
|
|
|
Do this when you're implementing a generic data structure that does allocations
|
|
"on behalf of" some other code - for example, the rhashtable code. This way,
|
|
instead of seeing a large line in /proc/allocinfo for rhashtable.c, we can
|
|
break it out by rhashtable type.
|
|
|
|
To do so:
|
|
- Hook your data structure's init function, like any other allocation function.
|
|
|
|
- Within your init function, use the convenience macro alloc_tag_record() to
|
|
record alloc tag in your data structure.
|
|
|
|
- Then, use the following form for your allocations:
|
|
alloc_hooks_tag(ht->your_saved_tag, kmalloc_noprof(...))
|
|
|
|
Notes
|
|
=====
|
|
|
|
- When a slab object is allocated from KFENCE, its accounting is skipped.
|
|
KFENCE allocations are rare and limited to a small number, so this omission
|
|
is negligible.
|