Skip to content

Latest commit

 

History

History
595 lines (473 loc) · 26 KB

File metadata and controls

595 lines (473 loc) · 26 KB

Bao cao: loi GPU panfrost lam treo giao dien tren Xiaomi Redmi 9 "lancelot"

  • May: Xiaomi Redmi 9 (lancelot), MT6769T / Helio G80, GPU Mali-G52 MC2 r1p0
  • Kernel: mainline 6.18 (~/linux-618 tren ctdagent), release 6.18.0-gc75a6bdd2a48-dirty
  • Userspace: Debian 13 arm64, Mesa 25.0.7-2+deb13u1, compositor phoc (wlroots, GLES2)
  • Ngay: 2026-08-05

1. Ket luan ngan gon

Nguyen nhan chinh (do tin cay cao, chua co bang chung tren may that): mot loi that su cua driver panfrost trong kernel <= 6.18, o duong xu ly page fault cua tiler heap (drivers/gpu/drm/panfrost/panfrost_mmu.c). Loi nay tao ra vong lap page fault vo tan tu duy tri: sau mot lan cap phat trang that bai (thieu bo nho), driver vinh vien tin rang vung 2 MB do "da duoc map" trong khi thuc te chua map gi, nen moi lan GPU cham vao dia chi do, handler tra ve "da xu ly xong" ma khong lam gi, GPU fault lai ngay lap tuc. Vong nay chi ket thuc khi reboot.

Loi da duoc sua o upstream, vao kernel 6.19, nhung khong duoc gan Cc: stable nen khong duoc backport ve 6.18.

Da lam: backport 2 commit upstream vao ~/linux-618, build xong artefact:

  • pmos/ml618-Image-gpu (sha256 a44ccf26446b0b44780ced35f2fd855880d4973d334b03738cc4fc638bf99c2a)
  • pmos/ml618-lancelot-gpu.dtb (sha256 d80c1cf7f8e69b646462cc5b0758b7981da0cae2fefc7721fc1b34750b5989ec)

Khong can tarball module: CONFIG_DRM_PANFROST=y (builtin), va chuoi phien ban kernel khong doi (6.18.0-gc75a6bdd2a48-dirty), nen module dang co tren may van dung.

Trung thuc ve muc do chac chan: chua flash, chua do lai. Xem muc 6 (nghi ngo con lai).


2. Cac gia thuyet DA BI LOAI TRU (co bang chung)

2.1. Kich thuoc trang bo nho — LOAI TRU DUT DIEM

$ grep -E 'CONFIG_ARM64_(4K|16K|64K)_PAGES' ~/linux-618/.config
CONFIG_ARM64_4K_PAGES=y
# CONFIG_ARM64_16K_PAGES is not set
# CONFIG_ARM64_64K_PAGES is not set

Kernel dung trang 4K, dung nhu panfrost/mesa gia dinh. PAGE_SHIFT = 12. CONFIG_ARM64_VA_BITS=48, CONFIG_ARM64_PA_BITS=48. Khong phai nguyen nhan.

2.2. Node DTS cua GPU — DU VA DUNG

arch/arm64/boot/dts/mediatek/mt6768.dtsi:

gpu: gpu@13040000 {
	compatible = "mediatek,mt6768-mali", "mediatek,mt8186-mali", "arm,mali-bifrost";
	reg = <0 0x13040000 0 0x4000>;
	interrupts = <GIC_SPI 276 ...>, <GIC_SPI 275 ...>, <GIC_SPI 274 ...>;
	interrupt-names = "job", "mmu", "gpu";
	clocks = <&mfgcfg CLK_MFGCFG_BG3D>;
	power-domains = <&spm MT6768_POWER_DOMAIN_MFG_CORE0>,
			<&spm MT6768_POWER_DOMAIN_MFG_CORE1>;
	power-domain-names = "core0", "core1";
	dynamic-power-coefficient = <4687>;
	operating-points-v2 = <&gpu_opp_table>;
	#cooling-cells = <2>;
};

Doi chieu:

  • mediatek,mt6768-mali khong co trong dt_match[] cua panfrost_drv.c, nen driver khop vao mediatek,mt8186-mali -> mediatek_mt8186_data: num_supplies = 1 ("mali"), num_pm_domains = 2 ("core0","core1"), pm_features = GPU_PM_CLK_DIS | GPU_PM_VREG_OFF, khong co GPU_QUIRK_FORCE_AARCH64_PGTABLE.
  • Dieu nay dung cho MT6768: MT8186 cung la Mali-G52 MC2, cung 2 power domain, va node GPU cua mt8186.dtsi gan nhu giong het. Quan trong: khong dinh quirk FORCE_AARCH64_PGTABLE (quirk do chi danh cho mt8188/mt8192/mt8370), nen bang trang van la ARM_MALI_LPAE — dung cho G52.
  • Chuoi power domain MFG day du trong mt6768.dtsi: MFG_ASYNC -> MFG -> {MFG_CORE0, MFG_CORE1}, mfgcfg nam trong MFG_ASYNC.
  • mali-supply = <&mt6358_vgpu_reg> co trong mt6769t-xiaomi-common.dtsi, mfg_async co domain-supply = <&mt6358_vsram_gpu_reg>, mfg co domain-supply = <&mt6358_vgpu_reg>.
  • Bang OPP trong mt6768.dtsi (32 muc, 299 MHz .. 1000 MHz) khop chinh xac tung gia tri voi bang downstream drivers/misc/mediatek/base/power/mt6768/mtk_gpufreq_core.h (SEG_GPU_DVFS_FREQ0..31 / SEG_GPU_DVFS_VOLT0..31).

=> DTS khong thieu gi gay job fault.

2.3. DVFS (xung nhip / dien ap) — BI BAC BO BANG PHEP DO TREN MAY THAT

Toi tung nghi day la thu pham va da chuan bi patch. Da bi bac bo.

Phep do quyet dinh (do agent chinh chay tren may that):

echo 299000000 > /sys/class/devfreq/13040000.gpu/min_freq
echo 299000000 > /sys/class/devfreq/13040000.gpu/max_freq
-> 682 loi panfrost trong 90 giay
clk_summary: mfgpll = mfgpll_ck = mfg_sel = mfg_ck = mfgcfg_bg3d = 299000000
regulator:   vgpu = 612500 uV, vsram_gpu = 850000 uV
dmesg:       KHONG co dong loi nao ve opp / regulator / devfreq

612500 uV / 850000 uV la dung y het cap gia tri downstream cho 299 MHz (SEG_GPU_DVFS_VOLT31 / FIXED_VSRAM_VOLT). Nghia la GPU dang o mot diem lam viec hoan toan hop le, tan so co dinh, khong co chuyen OPP — va van loi 7.6 lan/giay.

Ket luan: DVFS khong lien quan. Moi thay doi ve clock/regulator/OPP toi da lam deu da duoc hoan tac (git checkout drivers/clk/mediatek/clk-mt6768-mfg.c, va khoi phuc nguyen van khoi &mt6358_vgpu_reg / &mt6358_vsram_gpu_reg / &gpu_opp_table trong mt6769t-xiaomi-common.dtsi).

2.4. Phia hien thi (mediatek-drm / DSI) — LOAI TRU

Do agent chinh xac nhan: card0-DSI-1 connected 1080x2340, 1 plane XR24, crtc-0 enable=1 active=1, khong co dong underrun/underflow/vblank nao trong dmesg. Glitch "nhap nhay o giua man hinh" xay ra dong bo voi cap loi GPU (DATA_INVALID_FAULT + TILE_RANGE_FAULT, ~12 lan/giay). Day la loi GPU, khong phai loi hien thi.


3. Nguyen nhan (phan tich ma nguon)

3.1. WARNING "matching BO is not heap type" nghia la gi

drivers/gpu/drm/panfrost/panfrost_mmu.c:562 (trong panfrost_mmu_map_fault_addr()):

bomapping = addr_to_mapping(pfdev, as, addr);
if (!bomapping)
	return -ENOENT;
bo = bomapping->obj;
if (!bo->is_heap) {
	dev_WARN(pfdev->dev, "matching BO is not heap type (GPU VA = %llx)", ...);
	ret = -EINVAL;
	goto err_bo;
}

addr_to_mapping() tra ve mot mapping dang song (node drm_mm bi go khi BO bi huy/purge), nen day khong phai use-after-free va khong phai shrinker purge. Y nghia that: GPU page-fault ben trong mot BO thuong ma kernel tin la da map day du. Dieu do dang le khong the xay ra — nen moi la dev_WARN.

3.2. Bug 1 — vong lap fault vo tan (thu pham chinh)

Ma nguon 6.18, panfrost_mmu_map_fault_addr():

	if (!bo->base.pages) {
		bo->sgts = kvmalloc_array(...);
		pages = kvmalloc_array(...);
		bo->base.pages = pages;
		refcount_set(&bo->base.pages_use_count, 1);
	} else {
		pages = bo->base.pages;
		if (pages[page_offset]) {
			/* Pages are already mapped, bail out. */
			goto out;                 /* <-- tra ve 0 = "da xu ly xong" */
		}
	}
	...
	for (i = page_offset; i < page_offset + NUM_FAULT_PAGES; i++) {
		/* Can happen if the last fault only partially filled this
		 * section of the pages array before failing. ...
		 */
		if (pages[i])
			continue;
		pages[i] = shmem_read_folio_gfp(mapping, i, GFP_KERNEL);
		if (IS_ERR(pages[i])) {
			ret = PTR_ERR(pages[i]);
			pages[i] = NULL;
			goto err_unlock;          /* <-- pages[page_offset] DA duoc dat */
		}
	}

Chinh comment trong kernel thua nhan kha nang "lan fault truoc dien mang pages mot phan roi that bai". Khi dieu do xay ra:

  1. pages[page_offset] da khac NULL, nhung khoi 2 MB chua he duoc map vao bang trang GPU.
  2. Lan fault sau tren cung dia chi: if (pages[page_offset]) goto out; -> tra ve 0.
  3. panfrost_mmu_irq_handler_thread() tuong da xu ly xong, ghi AS_COMMAND_UNLOCK, cho GPU chay tiep.
  4. GPU cham lai dung dia chi do -> fault lai ngay -> quay ve buoc 2.

Vong lap tu duy tri, khong bao gio thoat. Khop chinh xac voi quan sat: "restart phosh -> 0 loi trong 10 giay -> mot luc sau loi quay lai va lien tuc mai".

Vi BO bi anh huong nang nhat la tiler heap (Mesa cap phat 1 BO PAN_BO_INVISIBLE|PAN_BO_GROWABLE 128 MB moi thiet bi, chinh la BO is_heap duy nhat), nen hau qua la:

  • job tiler (js=1) doc/ghi polygon list vao vung hong -> DATA_INVALID_FAULT, TILE_RANGE_FAULT
  • job fragment (js=0) doc ket qua tiler hong -> DATA_INVALID_FAULT, JOB_BUS_FAULT
  • glitch mot vung man hinh (mot so tile hong, phan con lai ve dung) = dung mo ta "nhap nhay o giua"
  • ty le 621 DATA_INVALID_FAULT / 12 not heap type trong 90 s: WARN chi in khi fault roi vao BO khong phai heap; phan lon fault roi vao chinh tiler heap nen khong in WARN, chi bao loi job.

3.3. Bug 2 — nuot loi khi map bang trang

mmu_map_sg() trong 6.18:

	while (len) {
		size_t pgcount, mapped = 0;
		size_t pgsize = get_pgsize(iova | paddr, len, &pgcount);

		ops->map_pages(ops, iova, paddr, pgsize, pgcount, prot,
			       GFP_KERNEL, &mapped);
		/* Don't get stuck if things have gone wrong */
		mapped = max(mapped, pgsize);
		iova += mapped;
		paddr += mapped;
		len -= mapped;
	}
	...
	return 0;                 /* luon 0 */

va panfrost_mmu_map() cung khong kiem tra gia tri tra ve, roi dat mapping->active = true.

Neu ops->map_pages() that bai (cap phat bang trang bang GFP_KERNEL bi tu choi khi thieu bo nho), vong lap nhay qua vung do va di tiep. Ket qua: mot BO thuong (khong phai heap) bi danh dau "da map" nhung bang trang GPU co lo thung. GPU cham vao lo -> TRANSLATION_FAULT_3 / SLAVE FAULT -> panfrost_mmu_map_fault_addr() tim thay mapping hop le nhung bo->is_heap == false -> chinh la WARNING o dong 562.

Day la duong sinh ra 12 lan/90 s WARNING "matching BO is not heap type".

3.4. Ket qua tra cuu upstream

Khong co bao cao cong khai nao ghep truc tiep chuoi matching BO is not heap type voi Mali-G52 (da tim Mesa GitLab, dri-devel, patchwork). Nhung ca hai bug tren da duoc sua o upstream, trong loat patch cua Adrian Larumbe (Collabora), merge vao 6.19:

Commit Tieu de Vao kernel
3d7c626716aa drm/panfrost: Check sgt to know whether pages are already mapped 6.19
4da352cf8fb1 drm/panfrost: Handle page mapping failure 6.19
f45f73c68c59 drm/panfrost: Handle error when allocating AS number 6.19
b49c35ba0ce1 Fix page leak in panfrost_mmu_map_fault_addr() when THP is on 7.0 (chi ap dung cho 7.0)

Khong co Fixes: tag, khong co Cc: stable -> khong duoc backport ve 6.16.y/6.17.y/6.18.y.

Da kiem tra: khong co su lech chuan giua Mesa va kernel ve co heap. src/panfrost/lib/kmod/panfrost_kmod.c anh xa PAN_KMOD_BO_FLAG_ALLOC_ON_FAULT -> PANFROST_BO_HEAP, va PAN_BO_GROWABLE -> PAN_KMOD_BO_FLAG_ALLOC_ON_FAULT (voi rang buoc GROWABLE => INVISIBLE). Hai ben khop nhau. RFC "Use shmem sparse allocation for heap BOs" van la RFC v2, chua merge. Panfrost chua duoc chuyen sang drm_gpuvm.


4. Da sua gi

4.1. Backport vao ~/linux-618/drivers/gpu/drm/panfrost/panfrost_mmu.c

Ap dung 3d7c626716aa roi 4da352cf8fb1. Diem khac duy nhat so voi upstream:

  1. 6.19 doi ten pfdev->dev -> pfdev->base.dev; da doi nguoc lai cho 6.18.
  2. Duong loi err_put_pages: cua panfrost_mmu_map(): upstream 6.19 goi ham nay khi da giu san dma_resv cua BO. Trong cay 6.18 nay panfrost_gem_open() khong giu lock do, con drm_gem_shmem_get_pages_sgt() tu lay/nha lock ben trong. Neu goi thang drm_gem_shmem_put_pages_locked() se dinh dma_resv_assert_held(). Da bo sung lock:
err_put_pages:
	/*
	 * Backport note: upstream (6.19) calls panfrost_mmu_map() with the
	 * BO's dma_resv already held.  In this tree panfrost_gem_open() does
	 * not hold it and drm_gem_shmem_get_pages_sgt() takes/releases it
	 * internally, so acquire it here before dropping the pages ref.
	 */
	dma_resv_lock(obj->resv, NULL);
	drm_gem_shmem_put_pages_locked(shmem);
	dma_resv_unlock(obj->resv);
	return ret;

Noi dung sau backport:

  • mmu_map_sg() kiem tra ops->map_pages(), neu loi thi go nguoc phan da map (mmu_unmap_range()) va tra loi ra ngoai.
  • panfrost_mmu_map() kiem tra loi, khong dat mapping->active = true khi that bai.
  • panfrost_mmu_map_fault_addr() kiem tra sgt->sgl (co that su da map chua) thay vi pages[page_offset] (chi biet trang da duoc doc ve chua) -> pha vo vong lap fault vo tan.
  • panfrost_mmu_map_fault_addr() co them duong err_mmu_map_sg: goi dma_unmap_sgtable().

Build sach, khong warning.

4.2. Da hoan tac hoan toan (khong con trong cay)

  • drivers/clk/mediatek/clk-mt6768-mfg.c — hoan tac (git checkout).
  • arch/arm64/boot/dts/mediatek/mt6769t-xiaomi-common.dtsi — khoi phuc nguyen van &mt6358_vgpu_reg, &mt6358_vsram_gpu_reg, va xoa bo phan &gpu_opp_table toi them. Xac nhan bang git diff khong con hunk nao lien quan GPU/regulator/OPP.

5. Artefact

File sha256 Ghi chu
pmos/ml618-Image-gpu a44ccf26446b0b44780ced35f2fd855880d4973d334b03738cc4fc638bf99c2a 33 806 344 byte
pmos/ml618-lancelot-gpu.dtb d80c1cf7f8e69b646462cc5b0758b7981da0cae2fefc7721fc1b34750b5989ec 44 789 byte
  • uname -r khong doi: 6.18.0-gc75a6bdd2a48-dirty -> module dang co tren may van dung, khong can lancelot-modules-gpu.tar.gz.
  • CONFIG_DRM_PANFROST=y (builtin), thay doi nam trong Image.
  • Luu y: cay ~/linux-618 dung chung voi cac agent khac. Image va .dtb nay do do cung chua thay doi dang lam do cua agent pin (mt6359-auxadc.c, generic-adc-battery.c, mt6358-irq.c, DTS) va agent WiFi. .dtb nay giong het ml618-lancelot-batt2.dtb ve noi dung GPU (toi khong sua DTS).

Neu can tarball module (do agent khac doi module), nho: goc tarball PHAI la usr/lib/modules/<ver>, tuyet doi khong duoc la lib/.


6. Nghi ngo con lai — chua duoc coi la "da sua"

Toi chua flash va chua do lai. Nhung diem con nghi ngo:

  1. Ty le loi. Backport nay giai thich rat tot vong lap fault tu duy tri va WARNING "not heap type". Nhung no bien "hong am tham" thanh loi -ENOMEM sach se — no khong tao ra bo nho khong co. Neu goc re la ap luc bo nho that su, sau khi va patch ban se thay Unhandled Page fault + reset GPU sach thay vi fault storm, nhung ung dung van co the mat context. Can them zram/swap.

  2. f45f73c68c59 chua backport. "drm/panfrost: Handle error when allocating AS number" cung nam trong loat patch 6.19. Toi khong backport vi no khong lien quan truc tiep den trieu chung. Neu van con loi, day la ung vien tiep theo.

  3. Mesa 25.0.7 co bug that su tren Mali-G52 — day co the la nua con lai cua van de, dac biet la trieu chung nhap nhay:

    • mesa#12718: hoi quy Mesa 25 gay flicker tren Mali-G52, da bisect ve commit e0f48568c7f2https://gitlab.freedesktop.org/mesa/mesa/-/issues/12718 (van mo)
    • mesa#13650 / Debian #1116427: ung dung GTK crash ngau nhien trong pan_preload_emit_varying_buffer (pan_fb_preload.c:876) tren Mali-G52, Mesa 25.0.7. Da sua trong Mesa 25.2.0.https://gitlab.freedesktop.org/mesa/mesa/-/issues/13650
    • Tham khao them: mesa#12061 (Mali-G31, cung chuoi AS0 / TRANSLATION_FAULT / JOB_BUS_FAULT / gpu sched timeout, khong co dong "not heap type"), mesa#7722 (G52, TRANSLATION_FAULT_1 + JOB_BUS_FAULT).
  4. Chi tiet clock chua duoc lam ro (loi tiem an, KHONG phai thu pham). drivers/clk/mediatek/clk-mt6768-mfg.c dung GATE_MTK(...) -> flags = 0, thieu CLK_SET_RATE_PARENT, trong khi mt8183/mt8186/mt8188/mt8192/mt8195 deu dung GATE_MTK_FLAGS(..., CLK_SET_RATE_PARENT). Doc clk_core_set_rate_nolock() thi clk_set_rate() tren mot gate khong co ops round/determine va khong co CLK_SET_RATE_PARENT se tra ve 0 ngay lap tuc ma khong doi gi. Phep do tren may lai cho thay mfgpll = 299 MHz khop voi devfreq — nhung do la khi devfreq bi ghim o OPP thap nhat, la gia tri co the trung voi tri boot. Chua co phep do o tan so cao de phan biet. clk-mt6768-mfg.c cung thieu .need_runtime_pm = true du mfgcfg nam trong power domain MFG_ASYNC (mt8183 co). De xuat kiem chung (30 giay, khong rui ro):

    echo simple_ondemand > /sys/class/devfreq/13040000.gpu/governor
    echo 950000000 > /sys/class/devfreq/13040000.gpu/min_freq
    grep -E 'mfgpll|mfg_sel|bg3d' /sys/kernel/debug/clk/clk_summary
    

    Neu mfgpll van la 299000000 -> loi nay co that (GPU luon chay 299 MHz, DVFS chi doi dien ap). Nen sua rieng, khong lien quan den vu treo giao dien nay.


7. VONG 2 — da flash va do that (cap nhat sau khi va patch)

Agent chinh da flash ml618-Image-gpu + ml618-lancelot-gpu.dtb. Truoc do da nang Mesa tu 25.0.7 len 26.1.2-1~bpo13+1 (trixie-backports).

7.1. Ket qua: co tac dung ro ret nhung chua dut diem

Tai chuan glmark2-es2-wayland, 90 giay:

DATA_INVALID JOB_READ JOB_BUS IMPRECISE not-heap-type Tong
Mesa 25.0.7, kernel chua va 621 2 9 19 12 663
Mesa 26.1.2, kernel chua va 195
Mesa 26.1.2, kernel da va 0 32 21 0 53 106
  • DATA_INVALID_FAULT bien mat hoan toan (621 -> 0). Day la thang loi that su cua patch 3d7c626716aa: vong lap fault vo tan da bi pha vo.
  • Tong su kien giam 6.3 lan (663 -> 106).
  • JOB_READ_FAULT/JOB_BUS_FAULT tang la loi cu doi mat na, khong phai hoi quy: truoc kia GPU ket trong vong lap nen moi job chet o buoc kiem tra descriptor (DATA_INVALID) che khuat tat ca; nay GPU chay dung den khi gap mot loi MMU that su va bao dung loai loi (job manager doc descriptor tu trang chua map = JOB_READ_FAULT).
  • Mesa 26.1.2 mot minh: 682 -> 195. Nhung chu may thay glitch nang hon, nen nang Mesa khong phai thuoc.

7.2. Manh moi manh nhat: loi bung phat tung dot

Chay cung mot benchmark 3 lan lien tiep:

lan 1: glmark2 Score 1044  ->   0 loi
lan 2: glmark2 Score  999  ->   2 loi
lan 3: glmark2 Score  105  -> 898 loi

Khi khong loi, GPU chay rat tot (FPS 900-1100). Phosh nam im: 12 loi/60 s. Day la hanh vi tich luy, khong phai loi tinh.

7.3. Tuong quan bo nho — va tai sao "khong co page allocation failure" KHONG bac bo duoc

giay | MemAvail | loi tich luy
  65 |   360 MB |   0
  70 |   252 MB |  20    <-- loi bat dau dung luc RAM tut 108 MB
  75 |   260 MB |  54
  85 |   259 MB | 129

Agent chinh dung lai o cho "khong dam ket luan" vi grep 'page allocation failure|oom' = 0 va grep 'nomem|failed to map' = 0. Ca hai con so 0 do deu vo nghia:

  1. drivers/gpu/drm/panfrost/panfrost_dump.c:163:
    iter.start = __vmalloc(file_size, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
    if (!iter.start) {
    	dev_warn(pfdev->dev, "failed to allocate devcoredump file\n");
    __GFP_NOWARN | __GFP_NORETRY = that bai hoan toan im lang, khong bao gio in "page allocation failure". Va dong failed to allocate devcoredump file da xuat hien trong log -> ap luc bo nho la CO THAT va cap phat lon DANG that bai.
  2. Duong loi cua patch 4da352cf8fb1 chi return ret len Mesa, khong in gi ca. Nen grep nomem = 0 khong chung minh duoc no khong xay ra.

Ngoai ra file_size cua devcoredump = tong kich thuoc tat ca BO cua job, va duoc thu lai o moi lan job timeout. Trong con bao 898 loi, day la vong phan hoi duong: loi -> vmalloc lon -> them ap luc -> them loi. Cong them 898 backtrace day du tu dev_WARN. Rat co the day chinh la co che lam score sup tu 1044 xuong 105.

7.4. Boi canh he thong lam nang them (quan trong)

  • May chi nhan 871 MB RAM (MemTotal: 892120 kB) du phan cung co 3 GB. Dang co viec rieng sua, chua xong. Day co the la dieu kien du gay ra toan bo hien tuong nay.
  • Khong co swap, CONFIG_ZRAM truoc do chua bat -> modprobe zram bao not found.
  • CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y — lua chon rat xau cho may 871 MB (phinh bo nho + phan manh). Va neu shmem_enabled khong phai never thi con dinh mot bug panfrost that su: 6.18 dung shmem_read_mapping_page() theo tung trang trong khi drm_gem_put_pages() dem ref theo folio -> ro ri trang moi lan gap huge folio. Upstream sua o 7.0: b49c35ba0ce1 "drm/panfrost: Fix a page leak in panfrost_mmu_map_fault_addr() when THP is on". Ro ri trang tich luy khop chinh xac voi kieu "cang chay cang tut RAM, bung phat tung dot". (Chua backport vi Fixes: cua no tro toi c12e9fcb5a5a "Introduce huge tmpfs mountpoint option" — commit do khong co trong 6.18, nen duong THP chi kich hoat neu shmem_enabled != never. Can do truoc, xem 7.6.)
  • irq/172-mt6358-irq an 22.5% CPU lien tuc (viec khac dang xu ly).
  • GPU co tang xung dung: idle 299 MHz, tai len 1000 MHz. Xac nhan lai lan nua rang DVFS khong lien quan.

7.5. Kernel chan doan — ml618-Image-gpu2

File sha256
pmos/ml618-Image-gpu2 3d0c5101fdf2914d2fd02b16e406bc693b0cbbedce6c0f8e7dd1cea6a021ece8
pmos/ml618-lancelot-gpu2.dtb d80c1cf7f8e69b646462cc5b0758b7981da0cae2fefc7721fc1b34750b5989ec (giong het gpu.dtb)

Gom ml618-Image-gpu + nhung thu sau:

A. Bat ZRAM (bien phap giam nhe that su, khong chi chan doan)

CONFIG_ZRAM=y, CONFIG_ZSMALLOC=y, CONFIG_ZRAM_BACKEND_LZO=y, CONFIG_ZRAM_DEF_COMP="lzo-rle", CONFIG_CRYPTO_LZO=y. Builtin -> khong can tarball module.

Cach dung:

sudo zramctl --find --size 512M --algorithm lzo-rle
sudo mkswap /dev/zram0 && sudo swapon -p 100 /dev/zram0

B. Do dac trong duong map (tra loi cau hoi 4 cua agent chinh)

panfrost_mmu.c — thay dev_WARN "matching BO is not heap type" bang WARN_ONCE (mot backtrace duy nhat) + dev_err_ratelimited chi tiet:

non-heap BO fault: fault_va=%llx bo_va=%llx..%llx off=%lld bo_size=%zu
                   label='%s' active=%d madv=%d pages=%s gpu_usecount=%d noexec=%d
  • label = ten BO do Mesa dat qua SET_LABEL_BO (Mesa 26.1 co dat). dmesg se noi thang do la buffer gi: "Tiler heap", "Batch descriptors", ...
  • active = mapping con hieu luc khong (0 -> BO da bi go mapping)
  • madv = trang thai madvise (-1 -> BO da bi shrinker thu hoi)
  • off = do lech so voi dau BO (am hoac > bo_size -> GPU doc vuot ngoai BO / dia chi GPU bi dung lai cho BO khac)

Ba truong nay phan biet dut khoat 3 kha nang con lai. Them cac dong:

map_pages failed: err=... iova=... paddr=... pgsize=... pgcount=... mapped=... total_mapped=...
panfrost_mmu_map failed: err=... size=... va=... noexec=...
heap fault: shmem_read_mapping_page failed err=... at page ... (block base ...) addr=...
heap fault: sg_alloc_table_from_pages failed err=... addr=...
heap fault: dma_map_sgtable failed err=... addr=...

(truoc day toan bo cac duong loi nay hoan toan im lang).

Doi dev_WARN -> WARN_ONCE cung giam tai log: 898 backtrace day du trong mot con bao la rat nang, va co the ban than viec in log dang gop phan lam sup score.

7.6. Ba phep do chay ngay tren kernel dang co (khong can build lai)

(1) Shrinker cua panfrost co thu hoi BO khong — phep do quan trong nhat. panfrost_gem_shrinker.c da san co pr_info_ratelimited("Purging %lu bytes\n", ...).

sudo dmesg -c >/dev/null; glmark2-es2-wayland; dmesg | grep -nE 'Purging|panfrost' | head -60

Neu "Purging" xuat hien ngay truoc khi loi bung phat -> noi thang duoc ap luc bo nho voi loi GPU. Co che de xuat: shrinker thu hoi BO ma Mesa danh dau purgeable; panfrost_gem_teardown_mapping() go luon node drm_mm, tra vung dia chi GPU ve pool; vung do duoc cap lai cho BO khac; job cu cua GPU van tro toi dia chi cu -> roi vao BO moi -> bo->is_heap == false -> dung cai WARN "not heap type". Neu khong co dong "Purging" nao thi shrinker vo can va phai tim huong khac — ket qua nao cung co gia tri.

(2) THP.

cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/shmem_enabled
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never   | sudo tee /sys/kernel/mm/transparent_hugepage/shmem_enabled

roi chay lai glmark2 3 lan. Neu lan 3 khong con sup do -> xac nhan huong ro ri trang THP (muc 7.4) va can backport b49c35ba0ce1.

(3) Cat vong phan hoi duong cua devcoredump.

echo 1 | sudo tee /sys/class/devcoredump/disabled

Chay lai glmark2 3 lan. Neu con bao diu di nhieu -> xac nhan devcoredump dang lam nang them.

7.7. Danh gia hien tai

Patch da sua mot bug that su va co the do luong duoc (DATA_INVALID 621 -> 0, tong giam 6.3 lan, GPU dat score 1044 khi khong loi). Nhung chua dut diem. Nghi ngo hang dau bay gio la ap luc bo nho (871 MB thay vi 3 GB, khong swap, THP=always), voi hai co che kha di: (a) shrinker thu hoi BO -> tai su dung dia chi GPU, (b) ro ri trang THP trong panfrost_mmu_map_fault_addr(). Ca hai deu do duoc bang muc 7.6.

Lever thuc te lon nhat van la sua cho may nhan du 3 GB RAM.


8. Viec nen lam tiep, theo thu tu

  1. Flash ml618-Image-gpu + ml618-lancelot-gpu.dtb, chay Phosh, do lai bang dung phep dem cu:

    dmesg -w | grep -c 'panfrost'   # trong 90 giay
    dmesg | grep -oP 'status=\K\w+' | sort | uniq -c
    

    So sanh voi mau chuan da co: 621 DATA_INVALID_FAULT / 19 IMPRECISE_FAULT / 9 JOB_BUS_FAULT / 2 JOB_READ_FAULT / 12 "not heap type" trong 90 s.

  2. Kiem tra ap luc bo nho (kiem chung truc tiep chan doan):

    dmesg | grep -iE 'page allocation failure|oom|order-[0-9]'
    free -m ; swapon --show
    

    Neu co, bat zram la bien phap giam nhe that su.

  3. Bien moi truong Mesa 25.0 — danh sach PAN_MESA_DEBUG day du doc tu src/gallium/drivers/panfrost/pan_screen.c: perf, trace, dirty, sync, nofp16, gl3, noafbc, nocrc, msaa16, linear, nocache, dump, overflow, yuv, forcepack, cs (norast va gofaster khong ton tai trong panfrost — do la cua Asahi.)

    • PAN_MESA_DEBUG=nocache — tat BO cache cua Mesa. Neu loi giam manh/bien mat => xac nhan van de vong doi/map BO. Cung giam han luu luong MADV_DONTNEED/shrinker vao dung duong code bi loi.
    • PAN_MESA_DEBUG=sync — Mesa cho tung job, quy trach nhiem loi ve dung draw call.
  4. Ep renderer phan mem de khoanh vung:

    WLR_RENDERER=pixman WLR_NO_HARDWARE_CURSORS=1 phoc ...
    

    Het treo + het glitch => chac chan goc nam o duong GPU.

  5. Neu van con loi: nang Mesa len >= 25.2 (cho mesa#13650), va/hoac backport tiep f45f73c68c59, hoac chuyen han sang kernel >= 6.19.