Re: Ask help about this patch c0cd6f557b90 "mm: page_alloc: fix freelist movement during block conversion"
From: Johannes Weiner
Date: Thu Apr 03 2025 - 17:27:26 EST
Hi Carlos,
On Thu, Apr 03, 2025 at 09:23:55AM +0000, Carlos Song wrote:
> Thank you for your quick ack and help! After applied this patch, it improved well.
> I apply this patch at this HEAD:
> f0a16f536332 (tag: next-20250403, origin/master, origin/HEAD) Add linux-next specific files for 20250403
>
> and do 10 times same test like what I have done before in IMX7D:
> The IRQ off tracer shows the irq_off time 7~10ms. Is this what you expected?
This is great, thank you for testing it!
> # irqsoff latency trace v1.1.5 on 6.14.0-next-20250403-00003-gf9e8473ee91a
> # --------------------------------------------------------------------
> # latency: 8111 us, #4323/4323, CPU#0 | (M:NONE VP:0, KP:0, SP:0 HP:0 #P:2)
> # -----------------
> # | task: dd-820 (uid:0 nice:0 policy:0 rt_prio:0)
> # -----------------
> # => started at: __rmqueue_pcplist
> # => ended at: _raw_spin_unlock_irqrestore
> #
> #
> # _------=> CPU#
> # / _-----=> irqs-off/BH-disabled
> # | / _----=> need-resched
> # || / _---=> hardirq/softirq
> # ||| / _--=> preempt-depth
> # |||| / _-=> migrate-disable
> # ||||| / delay
> # cmd pid |||||| time | caller
> # \ / |||||| \ | /
> dd-820 0d.... 1us : __rmqueue_pcplist
> dd-820 0d.... 3us : _raw_spin_trylock <-__rmqueue_pcplist
> dd-820 0d.... 7us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 11us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 13us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 15us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 17us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 19us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 21us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 23us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 25us : __mod_zone_page_state <-__rmqueue_pcplist
> ...
> dd-820 0d.... 1326us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1328us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1330us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1332us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1334us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1336us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1337us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1339us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1341us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1343us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1345us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1347us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1349us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1351us : __mod_zone_page_state <-__rmqueue_pcplist
> ...
> dd-820 0d.... 1660us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1662us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1664us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 1666us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1668us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1670us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1672us+: try_to_claim_block <-__rmqueue_pcplist
> dd-820 0d.... 1727us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1729us+: try_to_claim_block <-__rmqueue_pcplist
> dd-820 0d.... 1806us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1807us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1809us+: try_to_claim_block <-__rmqueue_pcplist
> dd-820 0d.... 1854us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1856us+: try_to_claim_block <-__rmqueue_pcplist
> dd-820 0d.... 1893us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1895us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1896us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1898us+: try_to_claim_block <-__rmqueue_pcplist
> dd-820 0d.... 1954us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 1956us+: try_to_claim_block <-__rmqueue_pcplist
> dd-820 0d.... 2012us : find_suitable_fallback <-__rmqueue_pcplist
> ...
> dd-820 0d.... 8077us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8079us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 8081us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8083us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 8084us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8086us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8088us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8089us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8091us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8093us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 8095us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8097us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 8098us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8100us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8102us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 8104us : find_suitable_fallback <-__rmqueue_pcplist
> dd-820 0d.... 8105us : __mod_zone_page_state <-__rmqueue_pcplist
> dd-820 0d.... 8107us : _raw_spin_unlock_irqrestore <-__rmqueue_pcplist
> dd-820 0d.... 8110us : _raw_spin_unlock_irqrestore
> dd-820 0d.... 8113us+: trace_hardirqs_on <-_raw_spin_unlock_irqrestore
> dd-820 0d.... 8156us : <stack trace>
This pattern looks much better. Once it fails to claim blocks, it goes
straight to single-page stealing.
Another observation is that find_suitable_callback() is hot. Looking
closer at that function, I think there are a few optimizations we can
do. Attaching another patch below, to go on top of the previous one.
Carlos, would you be able to give this a spin?
Thanks!
---