Repository navigation
Conversation
On Linux the 2 MiB AGC driver memory at 0xfe0000000 is a plain mapping in the arena's system-reserved hole, outside the write watch, while Windows commits it inside the write-watched arena. Every address-based build maps the registered ranges, so when the host import budget refuses the range it gets no heap mirror and is copied on the CPU for every build. The range is now registered with the write watch, so a refused import is served from a mirror refreshed by the blocks the CPU writes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.
|
|
First AMD-on-Linux (RADV) run of this PR. Head AMD Radeon RX 7900 XT (RADV NAVI31, gfx1100), Mesa 25.2.8, Linux Mint 22.3 (Ubuntu 24.04 base), kernel 7.0.0-38, GCC 13.3, Release. Full suite ( Comparing the JUnit output with GPUs tested: AMD Radeon RX 7900 XT (RADV NAVI31, gfx1100), Mesa 25.2.8, Linux Mint 22.3 / kernel 7.0.0-38 AI-assisted: yes |
What
#6160 maps 2 MiB of AGC driver memory at
0xfe0000000(the FS table and its routine) and registers it as a guest allocation. On Windows it is committed inside the guest arena, which is write-watched. On Linux the address is in the arena's system-reserved hole, so it is a plainmmapoutside the write watch.Every address-based build maps the registered ranges, so it includes this range. When the host import budget refuses its import, a range normally gets a heap mirror refreshed by the blocks the CPU writes. This range is not watched, so it gets no mirror (
unwatched heapson the[buffers]line) and is copied on the CPU, all 2 MiB, on every build.PPSA36082
Whether the import is refused depends on whether the first build that maps the range comes before the import budget fills, so it varies by run. With
APS5_HOST_IMPORT_MIB=6784,APS5_PROFILE_DRAW=1, level UI standing still, about 84 s from launch, onmain1e774a3 with #5656 and #6946:19964 imports (39908 MiB) refused so far, last 0xfe0000000+0x200000, and96000 completed CPU-copy operations ... 96000 outside imports (192000 MiB): 0xfe0000000:96000/192000MiB1 imports (2 MiB) refused so far, ... last 0xfe0000000+0x200000 by build): nocompleted CPU-copyreport in 60 s from launch, in the menu, onmaina700809 with perf(agc): data-only draw hits compare only the user words a stage reads #5656 and perf(agc): draw finisher pipeline (APS5_DRAW_PIPELINE) #6946. Without the change, runs that refuse this import report CPU copies of it within 45 s, in the menu.The frame rate did not change in that scene (72.2 against 71.6 fps), since the copies are not what limits it there. With the default import budget the range was imported in the runs I made, so nothing was copied before or after.
Tested
Linux (CachyOS), x86-64, GCC, 7800X3D / RTX 4090, NVIDIA 615.78.08, on
main0929be5, rebased without conflicts onto 0d8c51a, whose new commits do not touch these files.agc_driver_compute_fs_table_callsalso checks that the driver memory is write-watched when the write watch is available. It fails without the change ("the AGC driver memory at 0xfe0000000 is not write-watched") and passes with it.build.ymlrun locally: configure with SPIRV tools on, test registration check, build, libs, the whole ctest and conventions, onmain0929be5: 1662/1662 pass, 16 expected skips, conventions OK.Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)