From: Vlastimil Babka <vbabka@suse.cz>
To: Hongru Zhang <zhanghongru06@gmail.com>,
akpm@linux-foundation.org, david@kernel.org
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
surenb@google.com, mhocko@suse.com, jackmanb@google.com,
hannes@cmpxchg.org, ziy@nvidia.com, lorenzo.stoakes@oracle.com,
Liam.Howlett@oracle.com, rppt@kernel.org,
axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com,
Hongru Zhang <zhanghongru@xiaomi.com>
Subject: Re: [PATCH 0/3] mm: add per-migratetype counts to buddy allocator and optimize pagetypeinfo access
Date: Fri, 28 Nov 2025 10:24:16 +0100 [thread overview]
Message-ID: <97a9e695-487a-4428-87b7-cb8a505c9966@suse.cz> (raw)
In-Reply-To: <cover.1764297987.git.zhanghongru@xiaomi.com>
On 11/28/25 04:10, Hongru Zhang wrote:
> On mobile devices, some user-space memory management components check
> memory pressure and fragmentation status periodically or via PSI, and
> take actions such as killing processes or performing memory compaction
> based on this information.
Hm /proc/buddyinfo could be enough to determine fragmentation? Also we have
in-kernel proactive compaction these days.
> Under high load scenarios, reading /proc/pagetypeinfo causes memory
> management components or memory allocation/free paths to be blocked
> for extended periods waiting for the zone lock, leading to the following
> issues:
> 1. Long interrupt-disabled spinlocks - occasionally exceeding 10ms on Qcom
> 8750 platforms, reducing system real-time performance
> 2. Memory management components being blocked for extended periods,
> preventing rapid acquisition of memory fragmentation information for
> critical memory management decisions and actions
> 3. Increased latency in memory allocation and free paths due to prolonged
> zone lock contention
It could be argued that not capturing /proc/pagetypeinfo (often) would help.
I wonder if we can find also other benefits from the counters in the kernel
itself.
Adding these migratetype counters is something that wouldn't be even
possible in the past, until the freelist migratetype hygiene was merged.
So now it should be AFAIK possible, but it's still some overhead in
relatively hot paths. I wonder if we even considered this before in the
context of migratetype hygiene? Couldn't find anything quickly.
> Changes:
> 1. Add per-migratetype counts to the buddy allocator to track free page
> block counts for each migratetype and order
> 2. Optimize /proc/pagetypeinfo access by utilizing these per-migratetype
> counts instead of iterating through free lists under zone lock
>
> Performance testing shows following improvements:
> 1. /proc/pagetypeinfo access latency reduced
>
> +-----------------------+----------+------------+
> | | no-patch | with-patch |
> +-----------------------+----------+------------+
> | Just after boot | 700.9 us | 268.6 us |
> +-----------------------+----------+------------+
> | After building kernel | 28.7 ms | 269.8 us |
> +-----------------------+----------+------------+
>
> 2. When /proc/pagetypeinfo is accessed concurrently, memory allocation and
> free performance degradation is reduced compared to the previous
> implementation
>
> Test setup:
> - Using config-pagealloc-micro
> - Monitor set to proc-pagetypeinfo, update frequency set to 10ms
> - PAGEALLOC_ORDER_MIN=4, PAGEALLOC_ORDER_MAX=4
>
> Without patch test results:
> vanilla vanilla
> no-monitor monitor
> Min alloc-odr4-1 8539.00 ( 0.00%) 8762.00 ( -2.61%)
> Min alloc-odr4-2 6501.00 ( 0.00%) 6683.00 ( -2.80%)
> Min alloc-odr4-4 5537.00 ( 0.00%) 5873.00 ( -6.07%)
> Min alloc-odr4-8 5030.00 ( 0.00%) 5361.00 ( -6.58%)
> Min alloc-odr4-16 4782.00 ( 0.00%) 5162.00 ( -7.95%)
> Min alloc-odr4-32 5838.00 ( 0.00%) 6499.00 ( -11.32%)
> Min alloc-odr4-64 6565.00 ( 0.00%) 7413.00 ( -12.92%)
> Min alloc-odr4-128 6896.00 ( 0.00%) 7898.00 ( -14.53%)
> Min alloc-odr4-256 7303.00 ( 0.00%) 8163.00 ( -11.78%)
> Min alloc-odr4-512 10179.00 ( 0.00%) 11985.00 ( -17.74%)
> Min alloc-odr4-1024 11000.00 ( 0.00%) 12165.00 ( -10.59%)
> Min free-odr4-1 820.00 ( 0.00%) 1230.00 ( -50.00%)
> Min free-odr4-2 511.00 ( 0.00%) 952.00 ( -86.30%)
> Min free-odr4-4 347.00 ( 0.00%) 434.00 ( -25.07%)
> Min free-odr4-8 286.00 ( 0.00%) 399.00 ( -39.51%)
> Min free-odr4-16 250.00 ( 0.00%) 405.00 ( -62.00%)
> Min free-odr4-32 294.00 ( 0.00%) 405.00 ( -37.76%)
> Min free-odr4-64 333.00 ( 0.00%) 363.00 ( -9.01%)
> Min free-odr4-128 340.00 ( 0.00%) 412.00 ( -21.18%)
> Min free-odr4-256 339.00 ( 0.00%) 329.00 ( 2.95%)
> Min free-odr4-512 361.00 ( 0.00%) 409.00 ( -13.30%)
> Min free-odr4-1024 300.00 ( 0.00%) 361.00 ( -20.33%)
> Stddev alloc-odr4-1 7.29 ( 0.00%) 90.78 (-1146.00%)
> Stddev alloc-odr4-2 3.87 ( 0.00%) 51.30 (-1225.75%)
> Stddev alloc-odr4-4 3.20 ( 0.00%) 50.90 (-1491.24%)
> Stddev alloc-odr4-8 4.67 ( 0.00%) 52.23 (-1019.35%)
> Stddev alloc-odr4-16 5.72 ( 0.00%) 27.53 (-381.04%)
> Stddev alloc-odr4-32 6.25 ( 0.00%) 641.23 (-10154.46%)
> Stddev alloc-odr4-64 2.06 ( 0.00%) 386.99 (-18714.22%)
> Stddev alloc-odr4-128 14.36 ( 0.00%) 52.39 (-264.77%)
> Stddev alloc-odr4-256 32.42 ( 0.00%) 326.19 (-906.05%)
> Stddev alloc-odr4-512 65.58 ( 0.00%) 184.49 (-181.31%)
> Stddev alloc-odr4-1024 8.88 ( 0.00%) 153.01 (-1622.67%)
> Stddev free-odr4-1 2.29 ( 0.00%) 152.27 (-6549.85%)
> Stddev free-odr4-2 10.99 ( 0.00%) 73.10 (-564.89%)
> Stddev free-odr4-4 1.99 ( 0.00%) 28.40 (-1324.45%)
> Stddev free-odr4-8 2.51 ( 0.00%) 52.93 (-2007.64%)
> Stddev free-odr4-16 2.85 ( 0.00%) 26.04 (-814.88%)
> Stddev free-odr4-32 4.04 ( 0.00%) 27.05 (-569.79%)
> Stddev free-odr4-64 2.10 ( 0.00%) 48.07 (-2185.66%)
> Stddev free-odr4-128 2.63 ( 0.00%) 26.23 (-897.86%)
> Stddev free-odr4-256 6.29 ( 0.00%) 37.04 (-488.71%)
> Stddev free-odr4-512 2.56 ( 0.00%) 10.65 (-315.28%)
> Stddev free-odr4-1024 0.95 ( 0.00%) 6.46 (-582.22%)
> Max alloc-odr4-1 8564.00 ( 0.00%) 9099.00 ( -6.25%)
> Max alloc-odr4-2 6511.00 ( 0.00%) 6844.00 ( -5.11%)
> Max alloc-odr4-4 5549.00 ( 0.00%) 6038.00 ( -8.81%)
> Max alloc-odr4-8 5045.00 ( 0.00%) 5551.00 ( -10.03%)
> Max alloc-odr4-16 4800.00 ( 0.00%) 5257.00 ( -9.52%)
> Max alloc-odr4-32 5861.00 ( 0.00%) 8115.00 ( -38.46%)
> Max alloc-odr4-64 6571.00 ( 0.00%) 8292.00 ( -26.19%)
> Max alloc-odr4-128 6930.00 ( 0.00%) 8081.00 ( -16.61%)
> Max alloc-odr4-256 7372.00 ( 0.00%) 9150.00 ( -24.12%)
> Max alloc-odr4-512 10333.00 ( 0.00%) 12636.00 ( -22.29%)
> Max alloc-odr4-1024 11035.00 ( 0.00%) 12590.00 ( -14.09%)
> Max free-odr4-1 828.00 ( 0.00%) 1724.00 (-108.21%)
> Max free-odr4-2 543.00 ( 0.00%) 1192.00 (-119.52%)
> Max free-odr4-4 354.00 ( 0.00%) 519.00 ( -46.61%)
> Max free-odr4-8 293.00 ( 0.00%) 617.00 (-110.58%)
> Max free-odr4-16 260.00 ( 0.00%) 483.00 ( -85.77%)
> Max free-odr4-32 308.00 ( 0.00%) 488.00 ( -58.44%)
> Max free-odr4-64 341.00 ( 0.00%) 505.00 ( -48.09%)
> Max free-odr4-128 346.00 ( 0.00%) 497.00 ( -43.64%)
> Max free-odr4-256 353.00 ( 0.00%) 463.00 ( -31.16%)
> Max free-odr4-512 367.00 ( 0.00%) 442.00 ( -20.44%)
> Max free-odr4-1024 303.00 ( 0.00%) 381.00 ( -25.74%)
>
> With patch test results:
> patched patched
> no-monitor monitor
> Min alloc-odr4-1 8488.00 ( 0.00%) 8514.00 ( -0.31%)
> Min alloc-odr4-2 6551.00 ( 0.00%) 6527.00 ( 0.37%)
> Min alloc-odr4-4 5536.00 ( 0.00%) 5591.00 ( -0.99%)
> Min alloc-odr4-8 5008.00 ( 0.00%) 5098.00 ( -1.80%)
> Min alloc-odr4-16 4760.00 ( 0.00%) 4857.00 ( -2.04%)
> Min alloc-odr4-32 5827.00 ( 0.00%) 5919.00 ( -1.58%)
> Min alloc-odr4-64 6561.00 ( 0.00%) 6680.00 ( -1.81%)
> Min alloc-odr4-128 6898.00 ( 0.00%) 7014.00 ( -1.68%)
> Min alloc-odr4-256 7311.00 ( 0.00%) 7464.00 ( -2.09%)
> Min alloc-odr4-512 10181.00 ( 0.00%) 10286.00 ( -1.03%)
> Min alloc-odr4-1024 11205.00 ( 0.00%) 11725.00 ( -4.64%)
> Min free-odr4-1 789.00 ( 0.00%) 867.00 ( -9.89%)
> Min free-odr4-2 490.00 ( 0.00%) 526.00 ( -7.35%)
> Min free-odr4-4 350.00 ( 0.00%) 360.00 ( -2.86%)
> Min free-odr4-8 272.00 ( 0.00%) 287.00 ( -5.51%)
> Min free-odr4-16 247.00 ( 0.00%) 254.00 ( -2.83%)
> Min free-odr4-32 298.00 ( 0.00%) 304.00 ( -2.01%)
> Min free-odr4-64 334.00 ( 0.00%) 325.00 ( 2.69%)
> Min free-odr4-128 334.00 ( 0.00%) 329.00 ( 1.50%)
> Min free-odr4-256 336.00 ( 0.00%) 336.00 ( 0.00%)
> Min free-odr4-512 360.00 ( 0.00%) 342.00 ( 5.00%)
> Min free-odr4-1024 327.00 ( 0.00%) 355.00 ( -8.56%)
> Stddev alloc-odr4-1 5.19 ( 0.00%) 45.38 (-775.09%)
> Stddev alloc-odr4-2 6.99 ( 0.00%) 37.63 (-437.98%)
> Stddev alloc-odr4-4 3.91 ( 0.00%) 17.85 (-356.28%)
> Stddev alloc-odr4-8 5.15 ( 0.00%) 9.34 ( -81.47%)
> Stddev alloc-odr4-16 3.83 ( 0.00%) 5.34 ( -39.34%)
> Stddev alloc-odr4-32 1.96 ( 0.00%) 10.28 (-425.09%)
> Stddev alloc-odr4-64 1.32 ( 0.00%) 333.30 (-25141.39%)
> Stddev alloc-odr4-128 2.06 ( 0.00%) 7.37 (-258.28%)
> Stddev alloc-odr4-256 15.56 ( 0.00%) 113.48 (-629.25%)
> Stddev alloc-odr4-512 61.25 ( 0.00%) 165.09 (-169.53%)
> Stddev alloc-odr4-1024 18.89 ( 0.00%) 2.93 ( 84.51%)
> Stddev free-odr4-1 4.45 ( 0.00%) 40.12 (-800.98%)
> Stddev free-odr4-2 1.50 ( 0.00%) 29.30 (-1850.31%)
> Stddev free-odr4-4 1.27 ( 0.00%) 19.49 (-1439.40%)
> Stddev free-odr4-8 0.97 ( 0.00%) 8.93 (-823.07%)
> Stddev free-odr4-16 8.38 ( 0.00%) 4.51 ( 46.21%)
> Stddev free-odr4-32 3.18 ( 0.00%) 6.59 (-107.42%)
> Stddev free-odr4-64 2.40 ( 0.00%) 3.09 ( -28.50%)
> Stddev free-odr4-128 1.55 ( 0.00%) 2.53 ( -62.92%)
> Stddev free-odr4-256 0.41 ( 0.00%) 2.80 (-585.57%)
> Stddev free-odr4-512 1.60 ( 0.00%) 4.84 (-202.08%)
> Stddev free-odr4-1024 0.66 ( 0.00%) 1.19 ( -80.68%)
> Max alloc-odr4-1 8505.00 ( 0.00%) 8676.00 ( -2.01%)
> Max alloc-odr4-2 6572.00 ( 0.00%) 6651.00 ( -1.20%)
> Max alloc-odr4-4 5552.00 ( 0.00%) 5646.00 ( -1.69%)
> Max alloc-odr4-8 5024.00 ( 0.00%) 5131.00 ( -2.13%)
> Max alloc-odr4-16 4774.00 ( 0.00%) 4875.00 ( -2.12%)
> Max alloc-odr4-32 5834.00 ( 0.00%) 5950.00 ( -1.99%)
> Max alloc-odr4-64 6565.00 ( 0.00%) 7434.00 ( -13.24%)
> Max alloc-odr4-128 6907.00 ( 0.00%) 7034.00 ( -1.84%)
> Max alloc-odr4-256 7347.00 ( 0.00%) 7843.00 ( -6.75%)
> Max alloc-odr4-512 10315.00 ( 0.00%) 10866.00 ( -5.34%)
> Max alloc-odr4-1024 11278.00 ( 0.00%) 11733.00 ( -4.03%)
> Max free-odr4-1 803.00 ( 0.00%) 1009.00 ( -25.65%)
> Max free-odr4-2 495.00 ( 0.00%) 607.00 ( -22.63%)
> Max free-odr4-4 354.00 ( 0.00%) 417.00 ( -17.80%)
> Max free-odr4-8 275.00 ( 0.00%) 313.00 ( -13.82%)
> Max free-odr4-16 273.00 ( 0.00%) 272.00 ( 0.37%)
> Max free-odr4-32 309.00 ( 0.00%) 324.00 ( -4.85%)
> Max free-odr4-64 340.00 ( 0.00%) 335.00 ( 1.47%)
> Max free-odr4-128 340.00 ( 0.00%) 338.00 ( 0.59%)
> Max free-odr4-256 338.00 ( 0.00%) 346.00 ( -2.37%)
> Max free-odr4-512 364.00 ( 0.00%) 359.00 ( 1.37%)
> Max free-odr4-1024 329.00 ( 0.00%) 359.00 ( -9.12%)
>
> The main overhead is a slight increase in latency on the memory allocation
> and free paths due to additional per-migratetype counting, with
> theoretically minimal impact on overall performance.
>
> This patch series is based on v6.18-rc7
>
> Hongru Zhang (3):
> mm/page_alloc: add per-migratetype counts to buddy allocator
> mm/vmstat: get fragmentation statistics from per-migragetype count
> mm: optimize free_area_empty() check using per-migratetype counts
>
> include/linux/mmzone.h | 1 +
> mm/internal.h | 2 +-
> mm/mm_init.c | 1 +
> mm/page_alloc.c | 9 ++++++++-
> mm/vmstat.c | 30 +++++++-----------------------
> 5 files changed, 18 insertions(+), 25 deletions(-)
>
next prev parent reply other threads:[~2025-11-28 9:24 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-28 3:10 Hongru Zhang
2025-11-28 3:11 ` [PATCH 1/3] mm/page_alloc: add per-migratetype counts to buddy allocator Hongru Zhang
2025-11-29 0:34 ` Barry Song
2025-11-28 3:12 ` [PATCH 2/3] mm/vmstat: get fragmentation statistics from per-migragetype count Hongru Zhang
2025-11-28 12:03 ` zhongjinji
2025-11-29 0:00 ` Barry Song
2025-11-29 7:55 ` Barry Song
2025-12-01 12:29 ` Hongru Zhang
2025-12-01 18:54 ` Barry Song
2025-11-28 3:12 ` [PATCH 3/3] mm: optimize free_area_empty() check using per-migratetype counts Hongru Zhang
2025-11-29 0:04 ` Barry Song
2025-11-29 9:24 ` Barry Song
2025-11-28 7:49 ` [PATCH 0/3] mm: add per-migratetype counts to buddy allocator and optimize pagetypeinfo access Lorenzo Stoakes
2025-11-28 8:34 ` Hongru Zhang
2025-11-28 8:40 ` Lorenzo Stoakes
2025-11-28 9:24 ` Vlastimil Babka [this message]
2025-11-28 13:08 ` Johannes Weiner
2025-12-01 2:36 ` Hongru Zhang
2025-12-01 17:01 ` Zi Yan
2025-12-02 2:42 ` Hongru Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=97a9e695-487a-4428-87b7-cb8a505c9966@suse.cz \
--to=vbabka@suse.cz \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=axelrasmussen@google.com \
--cc=david@kernel.org \
--cc=hannes@cmpxchg.org \
--cc=jackmanb@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--cc=weixugc@google.com \
--cc=yuanchu@google.com \
--cc=zhanghongru06@gmail.com \
--cc=zhanghongru@xiaomi.com \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox