Skip to content

feat(libkernel): cancel blocked POSIX reads with owned operations - #12682

Open
Felipebmaitan wants to merge 72 commits into
boykopovar:mainfrom
Felipebmaitan:feat/posix-read-cancellation-core
Open

Felipebmaitan wants to merge 72 commits into
boykopovar:mainfrom
Felipebmaitan:feat/posix-read-cancellation-core

Conversation

@Felipebmaitan

@Felipebmaitan Felipebmaitan commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

What

Head 32169af1dc395b182370cdf973687d313d33bfc4. Implement deferred cancellation of blocked POSIX reads/receives, retaining descriptor/native ownership through interruption and releasing it before cleanup/TSD or deferred delivery. Completed/partial results win; SCE/libSceNet gain no cancellation points.

42-file incremental comparison uses actual ancestor 97a5bb60799e85d8fff1cbbce061c15619c6ce12. Main-based Files changed remains cumulative while open prerequisites await merge. Source-neutral ancestry commits retain the small incremental comparisons while preserving published history.

All four layers integrate upstream main 4f41f4c375f5abb487dbd184fbc150f31994d762 through ordinary merges and preserve their previously published heads and maintainer commits. The manual debt resolutions retain main's checked getcontext/setcontext copy behavior and updated cpuset limits, plus the stack's opaque context identity and read/write cancellation limits. mc_spare identity survives checked context copies; restoration still retires abandoned I/O before switching contexts. SCE contracts, all four Apple empty-iovec guards, synchronous-write completion and deterministic stream-close hooks/barriers/exact data assertions remain. The previous macOS duplicate test-registration repair is retained.

#10552/#10817/#10755 are merged upstream, honoring #10552-first. #13950's checked-context-copy fix, #14885 affinity behavior and #9242 tcgetsid are now in main and retained. #12149 remains open at 88f89fc; embedded prerequisite 03c2195 and its current pure-integration head have identical JumpBuffer.cpp/GuestUnderscoreJumps.cpp. The underscore context repair still avoids guest signal-mask saving/restoring. Writes/accept retain exact #9019 1e6b694 under the maintainer-approved #9019-first order: IoWrite and WithIoDescriptor live inside the shared PosixPwrite_nid_no_patch body, with SCE separate and fixed-size clamps/metadata/offsets preserved.

Ownership lookup uses 64 shards and matching-entry final erasure, avoiding its former global mutex/full-map sweep. Per-descriptor admission and other metadata/mode locks remain; immediate-path cost is unmeasured. Close interrupt/predicate retries back off 1–16 ms and receive completion notifications. A single interrupt still misses the previously demonstrated pre-native-call gap; non-interruptible host calls have no total drain-time bound. Registry retries sleep with backoff instead of yielding in a tight scan. No speed, CPU-use or title-performance claim or paired same-scene trace_digest evidence.

The active-owner Windows callback-drain guard prevents a concrete pop/reinsert cycle, but has not established the cause or resolution of the intermittent Windows 22621 guest_io_context_sigjump hang. Accept stays draft. PR bases and archive #11625 were not changed; no merge/replacement is requested.

Tested

Current-head native CI selects 32169af1dc395b182370cdf973687d313d33bfc4 and merges it onto main 4f41f4c375f5abb487dbd184fbc150f31994d762. Windows Server 2025/GNU 15.2: 2,387 passed / 976 skipped / 0 failures, 3,363 scheduled, 125.46 s. Deferred-drain, underscore/manual-underscore context restoration, adopted/adopted-exit and swap/jump/signal/manual cases pass. One guest_io_context_sigjump sample passes in 0.03 s; this is Server 2025, not qualification or resolution of the Windows 22621 intermittent hang.

macOS x86-64 relinker CI, Apple Clang 21.0.0, passes 669/669 in 271.02 s, including guest_none_relocations in 16.01 s. The native-arm64 relinker, both macOS write-watch/edge-watch jobs, Debug/Release register-context jobs, other relinkers, portability and conventions are also successful. API check runs are 21 successful / 1 skipped (including repeated metadata runs); the full Linux job is skipped, not passed. These jobs do not qualify full macOS libkernel runtime. Different runners' timings neither establish the cause of writes/accept's guest_none_relocations timeouts nor provide paired same-machine/scene performance evidence.

Current composed accept code at 1574087191a4ec15cad31be7df32a521c0561280: Ubuntu 24.04.5 x86-64/GCC 13.3 Release through Apple Silicon translation. Production libraries and 17 focused executables explicitly rebuild after integration. 660/660 CTests pass (68.29 s), selected by executable: guest_kernel_sys_pwrite_tests, guest_io_write_cancel_tests, guest_io_write_sync_cancel_tests, guest_io_shared_write_cancel_tests, guest_io_context_tests, guest_accept_cancel_tests, guest_io_read_cancel_tests, guest_io_descriptor_access_tests, guest_pthread_cancel_tests, guest_user_context_tests, guest_stream_close_tests, guest_udp_tests, guest_raise_exception_tests, guest_file_vector_tests, guest_file_vector_memory_tests, guest_kernel_sys_aio_tests and guest_aio_tests. This covers checked context copies/nonlocal restoration, read/write/accept cancellation, descriptor ownership, stream close, UDP, vector writes and AIO.

Six additional composition CTests pass 6/6 (1.72 s), selected by guest_sce_net_tests, guest_socket_read_write_tests, guest_shm_open_tests, guest_dup_tests, guest_kernel_fcntl_tests and guest_append_writes_tests after rebuilding. These exercise main's socket forwarding alongside the stack, shared-memory and duplicate/status/append behavior. Production/context/stream-close/accept fixture hashes match the final committed code; the final debt shortening and comparison-ancestry commits change no runtime code. These are composed-stack results, not separate fresh local executions at every lower head.

Public-header audit: 406 libraries / 28,304 exports, unique declarations and umbrella coverage; no full compiler-batch run claimed. All four final heads pass python3 tools/check_conventions.py --base origin/main --head , using an isolated Git context with origin/main pinned to actual upstream 4f41f4c375f5abb487dbd184fbc150f31994d762. Reads has no findings; upper layers retain only the inherited SSL debt-length warning, zero errors. Whitespace checks against current upstream main pass. Fresh overlap scanning covers 1,724 open PRs and fails closed for uncomparable branches; selected source triage is not full overlap or combined-runtime clearance.

The reported workflow-approval failure at the previous reads head b0b8c21 was not reproducible in GitHub: 29 successful / 3 cancelled / 1 skipped check runs, 19 completed success/cancelled suites, 19 upstream workflow runs with no approval-required/failing/pending run, no fork run, no legacy status context, and GraphQL rollup SUCCESS. The actual live blocker was DIRTY main integration on all four PRs; this refresh resolves the conflict while retaining both sides. No unspecified run was approved. Full builds still require collaborator/admin dispatch when not provided by CI; the previous explicit dispatch attempt returned HTTP 403/admin rights. Current-head successful CI evidence and its limits are recorded above; previous green checks remain tied to their old heads. These checks do not qualify the unresolved Windows 22621 hang or full macOS libkernel runtime.

Selected overlap updates: #9938 at db41fa3 already declares reads-first; caller-stack/exit-jump integration must retain I/O retirement before cleanup/TSD and native stack restoration, with no combined run claimed. #13390 at 3992904 adds independent host-log preservation around freopen; keep its declarations/calls with FILE-before-descriptor locking and both stream-close controls. #13730 at 9056177 remains separately owned; shared-provider extraction is retained via #9019, but no combined #13730 runtime pass is claimed. #13953 at 99b413e adds semaphore failure/post-success tests; #15219 at bf4f7b7 merges main into the setter follow-up. Their debt/registration additions supply no helper used by this stack. Other prior compared pins are unchanged; broader branches remain unqualified.

Overlap report updated 2026-11-03 17:18:12 UTC: all four compared PR heads are unchanged. Its uncomparable table adds #8497 at 096bf08 and #10749 at dae55d9. Their manual patch audit applies here: Signals.cpp is identical across these stack heads. Preserve pending-signal/code consumption under pending.lock, wait/notify and checked-copy ordering; retain RegisteredForJumps when removing only RegisterSignalsOnLoad for the siginterrupt provider move; retain I/O context/cancellation paths and both existing signal test targets. Neither supplies a helper required by reads; no import, new dependency, merge-order agreement or combined runtime pass is inferred. Depends on stays #12149, which remains open. There are still 76 uncomparable branches, so selected patch review is not full overlap clearance. #14085 is no longer listed; its earlier source audit does not establish it merged.

Historical sys-provider misplaced-wrapper and accept leak/late-disposal negative controls remain documented in the write follow-up and accept follow-up. The previous accept native Server 2025 job at selected db09379 merged onto a4eca2a passed 2,651 tests / 957 skipped; its 15 accept cases and one sigjump sample pass. Those results do not qualify this refresh or Windows 22621, exclude earlier setup leaks or identify the four handles in the older failed fixture. Historical runtime totals and contributor AMD reports remain tied to their original head/base/machine, not fresh qualification here.

The Windows 22621 intermittent hang remains unresolved. Windows 22621 diagnosis/validation, remaining stack checks, maintainer title-scene bench and admin-only ordered full-build validation remain outstanding. Review remains COMMENTED, not approval. No fresh title/console, GPU, full macOS libkernel runtime or paired same-scene trace_digest qualification is claimed. Unblocks: none is intentional; no title cancellation unblock is claimed.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: feat(libc): export _setjmp and _longjmp #12149
  • Fixes: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

Published b0b8c21822418d49e9b1bf2a4484f50797f12bdb after integrating main b28bb772177768f99874ca38f6252cd0139acf2a bottom-up, preserving the previous remote head and maintainer history. Incremental comparison: 42 files. #10552/#10817/#10755 are now merged; the full PR template and remaining open dependencies have been refreshed. #12149 remains open. No base retarget or PR merge.

The main conflict was its new Windows exception-delivery drain coverage versus our existing test split; both are retained as separately registered scenarios. All four Apple empty-iovec guards, deterministic stream-close coverage and underscore context restoration remain.

The composed accept tree 5a3085a998201ef31881329d5a669609bcfab0f9 rebuilds and passes 499/499 focused Linux CTests. This is composed-stack validation, not separate local execution at this lower-layer head. Exact-head conventions and whitespace checks pass; new-head CI is pending. Parent Windows and both macOS write-watch checks succeeded before this integration. The body distinguishes those earlier heads from current evidence.

Accept Windows failure audit, fixture change and leak control: UDP is confirmed passing in the next parent run, while four accept count failures require new Windows confirmation after warming the separate transfer waker. Refreshed overlap/source triage and proposed composition orders. Uncomparable PRs remain unresolved; no clean-overlap claim or new dependency solely from shared files. Archive #11625 remains separately owned.

The Windows 22621 intermittent sigjump hang remains unresolved; accept stays draft. Immediate-path costs remain unmeasured, with no speed claim or paired trace_digest evidence. Native 22621 validation, maintainer scene bench and admin-only full-build dispatch remain external requirements.

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

Head-specific follow-up: the passing notification applies to 327cb8acb7273ec5abd902016603c82e2f8fa99d. Its Windows job, macOS Intel write-watch, macOS arm64 write-watch, relinker and register-context jobs succeeded. The full Linux job was skipped, not a pass. The API also retains older cancelled convention reruns; those are not new failures. These results qualify the old head, not current reads b0b8c21822418d49e9b1bf2a4484f50797f12bdb, whose fresh checks are queued/in progress after main integration.

Read the overlap comment at its latest 2026-11-02T16:29:10Z snapshot. Its two compared rows (#5021, #11831) and all 343 uncomparable PR/file rows are subsets of the already-read coordinated stack report discussed in the updated source/composition audit. There are no additional PR IDs or shared-file rows requiring a new dependency from this notification. This is report comparison, not clearance of the uncomparable branches or combined runtime qualification.

The existing dispositions remain: #5021's getdirentries export flag does not establish a second runtime implementation; the broader ARM64 composition remains unqualified. #11831's same-named stream-close fixture has distinct coverage; future composition must retain both suites, the deterministic hooks/barriers/content assertions, descriptor cleanup and stream/descriptor lock order. The recvfrom/getdirentries flags identify existing main exports; current incremental source does not introduce duplicate declarations/implementations for those flags.

Current main b28bb772177768f99874ca38f6252cd0139acf2a is integrated, with published history retained and no merge conflict reported. #10552/#10817/#10755 are now merged. #12149 is still open at 03c2195878367e871c28a258cb080f78896cc372 and is already the declared reads dependency. The 42-file current reads comparison remains available without retargeting the PR.

No new source change, push, dependency or repeated runtime test is indicated by this notification. Exact-head conventions and the composed-stack Linux evidence remain documented in the body. The Windows 22621 intermittent context hang remains unresolved; the separate accept layer stays draft. Existing watches continue while fresh CI and external validation remain outstanding.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 2, 2026
@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

@CnRJay Fresh exact-head CI is green at reads b0b8c21822418d49e9b1bf2a4484f50797f12bdb, against integrated main b28bb772177768f99874ca38f6252cd0139acf2a.

The native Windows job built successfully and scheduled 3,206 CTests: 2,252 passed, 954 explicitly skipped, zero failed (151.41 s). Skips are not passes. The scheduled guest_io_context_deferred_drain, guest_io_context_sigjump, guest_io_descriptor_close_before_native and retained guest_raise_exception_drain cases pass. This is Server 2025 evidence for this exact reads head; an individual sigjump sample does not explain or resolve the intermittent Windows 22621 hang, and this run does not qualify accept-specific resource disposal.

Both macOS arm64 write-watch and macOS Intel write-watch, both edge-watch jobs, relinker/register-context jobs, library portability and current conventions succeeded. The API records 20 successful check runs plus two retained cancelled convention reruns and one skipped full Linux job. The green notification does not represent a full Linux runtime CI pass.

GitHub reports the PR mergeable/clean. #12149 remains open at 03c2195878367e871c28a258cb080f78896cc372 and remains the declared dependency. Review is COMMENTED, not approval. The existing incremental comparison and overlap/composition audit remain applicable, with uncomparable branches still unqualified. No merge or replacement PR is requested.

Immediate-path locking costs remain unmeasured; no speed claim or paired same-scene trace_digest evidence. Native Windows 22621 diagnosis/validation, maintainer title-scene bench and admin-only full-build validation remain external requirements. Accept remains draft. The PR body now records these exact-head results; no source change or push is needed for this passing notification.

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

Reviewed the changed overlap snapshot, updated 2026-11-02T17:54:26Z, for reads b0b8c21822418d49e9b1bf2a4484f50797f12bdb. This supersedes the earlier snapshot's “no additional rows” observation.

The compared rows are now #12605, #13950 and #13953, all at debt-text intersections. Selected current source checks:

  • fix(libc): throw for __std_min/max ranges that fault on a device #12605 37e4fc00b7a38fd4b0024bbb8c0e6cc55f49004c: unchanged pinned head; its min/max fault-range debt updates do not supply an I/O implementation helper. Retain those entries alongside the underscore/context debt on future reconciliation.
  • fix(libkernel): return EFAULT from context operations for invalid memory pointers #13950 ab29fe1cc70d22feaffd79844c3eb7e0f3e9cdb8: inspected the updated context implementation and debt patch. It replaces direct output/input copies with checked copies, restores from a local UserUcontext and propagates capture failure during swapcontext. A later composition must retain this stack's identity capture in mcontext.spare and GuestIoStackRestore before register restoration; the checked local copy includes those spare bytes. The reported compared hunk is still the debt paragraph. No implementation prerequisite on its new code is established, and no combined runtime result is claimed.
  • fix(libkernel): return EFAULT from ksem_getvalue for invalid memory pointers #13953 a39571c96b9279f635fe17be58107ecd9d2d4ee8: the current debt patch appends the checked-copy EFAULT behavior of ksem_getvalue next to the context entry. Retain both statements when reconciling. Reads calls no helper introduced there; adjacency alone does not establish an ordering dependency.

The newly uncomparable #13486 is pinned at 0bde10d243b63a08556f9ceda6912cf5fef2b824. GitHub's file list against its supplied base 556547da71c5e25b742f17b1ed9b27253b6e9d4d contains only core/relinker/CMakeLists.txt, domain/include/domain/ImportModule.hpp and relinker/tests/ImportModuleTests.cpp. I read all three patches: they add module-provider alias mapping and its tests, with no guest I/O helper dependency.

There are two merge bases against current main; a plain triple-dot diff warns and selects one, yielding a broad historical file list. Recursive merge-tree against main a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8 fails in only ImportModule.hpp and ImportModuleTests.cpp; its resulting tree differs from main only in those two relinker files, with no net libkernel/libc changes. The actual reads-only increment makes no core/relinker change. This source/history evidence establishes no I/O dependency on #13486. It does not clear its own main conflicts, approve that PR, or qualify a combined runtime. Its branch was not modified.

Main advanced from the integrated b28bb77 baseline to a4eca2a. Fresh fetches and merge-tree checks show all four owned heads merge cleanly with a4eca2a; no conflict-driven branch update is required for this notification. Those merge results were not built/run in this read-only audit. The published exact-head CI evidence remains explicitly tied to the earlier integrated baseline, not newly qualified as an a4eca2a composition.

Depends on remains the actually required open #12149. The remaining uncomparable table is still unresolved; no clean-overlap claim, new owner agreement or dependency solely from shared paths. Deterministic close coverage and context restoration remain intact. No code edit, push, base retarget or additional runtime test was indicated. The intermittent Windows 22621 hang and separate accept validation remain open; accept stays draft.

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

Prerequisite-head audit after the refreshed overlap reports: #12149 remains open, now at 88f89fcdd64dfa80412f22562c331b8e29dee270, replacing the previously pinned 03c2195878367e871c28a258cb080f78896cc372.

The new commit has parents 03c2195 and main 1a5267fd3f39061594ebe6adc7df752dd43cecd2. Re-running merge-tree on those exact parents is clean and yields exactly the published 88f89fc tree. It is a pure upstream integration, with no extra merge-resolution/topic change. JumpBuffer.cpp is byte-identical (blob 187225c8f1b3e117bfa13300c640f6638c67317d), as is GuestUnderscoreJumps.cpp (9ea166d82a756f2a160bf2b25533ef467bbf2821).

The stack already contains the older prerequisite's topic implementation; reads' existing offset-92 context save/restore repair for _setjmp/_longjmp remains necessary above it and is retained. Its no-mask-saving behavior is unchanged. #12149-first remains the declared order, not a new agreement or a claim that the prerequisite merged. No prerequisite behavior change needs propagation from this pure-merge update.

Fresh remote fetches retain reads b0b8c21822418d49e9b1bf2a4484f50797f12bdb, transport 94b38c10838b39ff59203eb6845d41286320b5be, writes c9625605915173970a79f50fceb7e01800ae3420 and accept db093790df20c82996d9a7b75b43daa4e8764c6e. All four merge cleanly in local merge-tree checks against freshly fetched main 096c45570f516de76a43bbe1b97781381c84f55f. Those simulated compositions were not built/run; published runtime evidence is not relabelled as newer-main qualification. No branches were changed or pushed in this audit.

The transport overlap report's compared PR heads are unchanged; its changed row text replaces only main-source link hashes with b2627ce, with no new uncomparable PR/file rows. Existing selected-source dispositions remain, and the broader uncomparable table is still unqualified. PR bodies will distinguish the embedded prerequisite revision from its current live head. No additional runtime repetition or dependency change is indicated; the unresolved Windows 22621 issue and accept validation remain separate.

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

Reviewed the reads overlap snapshot, updated 2026-11-02T21:36:32Z, at reads b0b8c21822418d49e9b1bf2a4484f50797f12bdb. The new compared debt row is #7192, and the additional uncomparable rows are #11247, #14846 and #14902. I fetched their live metadata and read the relevant implementation/debt patches:

  • feat(libkernel): deliver host faults to sceKernelInstallExceptionHandler handlers #7192 396137d831ecd19aeb2756cc0a4794ff88bc42e1 adds title-only synchronous host-fault delivery. Windows uses a fault-entry trampoline outside the dispatcher and preserves vector state; Linux adds classified fault handlers. The compared hunk removes/replaces the obsolete host-fault debt entry. @Jev1337 I propose the cancellation stack first and fault-delivery integration afterward, retaining both the new trap-aware handler path and this stack's deferred-I/O callback queue, active-owner guard, retirement and nonlocal context restoration. The write-watch/SSE4a-before-title-fault ordering and both test suites must remain. This is a proposed order, not agreement or runtime qualification; reads does not call the new HostFault hook.
  • fix(libkernel): report a reset stream socket as hung up and keep POLLOUT on a half-closed one as measured on a PS5 #11247 e9177a54e92332a2a3de3653ca80ff598b1c0e97 changes ClosedStreamEvents and poll result mapping: reset streams become hangup plus requested read bits without POLLOUT/POLLERR, while half-close may retain requested POLLOUT. This changes readiness semantics, not the owned read/recv cancellation helpers. Future composition must retain those semantics and this stack's transport/native ownership. No combined run has been performed.
  • fix(libkernel): notice a socket closed during poll or select #14846 b18e89d8934666e37ff8652849ed773b614f551c adds socket-owner identity checks before/after poll slices and bounds socket slices to 10 ms, so close/replacement yields POLLNVAL or EBADF. @JJenkx this is distinct from the current read/recv cancellation wake path. A later composition must retain the identity check after the final wait, ensure invalid/closed-descriptor status wins over stale native readiness, and keep existing close/reuse/cancellation controls. It also needs reconciliation with fix(libkernel): report a reset stream socket as hung up and keep POLLOUT on a half-closed one as measured on a PS5 #11247's result remapping. The slice/check costs are unmeasured here; no combined runtime or improvement claim. Your Windows 22621 evidence is for that PR and does not qualify this stack's separate sigjump hang.
  • feat(libSceNet): return SO_PROTOCOL for raw sockets with an explicit protocol #14902 99f17f5d95b33d7b41b228084039e91a51e7a411 changes the libSceNet raw SO_PROTOCOL branch, with a RawProtocolEntry selector and the existing protocol-zero NotImplemented limit retained. The reads layer changes recv/read handling elsewhere in Export.cpp; it calls no new raw-protocol helper. Preserve both behaviors on textual composition. No raw-socket capability/IPv6 run is claimed here.

No current implementation dependency is established by these rows; no other branch was modified. The existing #12605/#13950/#13953 heads are unchanged and their prior pinned dispositions remain. Other uncomparable branches remain unresolved; this selected-source audit is not a full review, clean-overlap claim or successful pairwise integration.

#12149 remains open at the already-audited pure-main-merge head 88f89fcdd64dfa80412f22562c331b8e29dee270 and remains declared. Reads is still mergeable/clean, and its scheduled runtime/build checks remain successful at b0b8c21; retained cancelled reruns and the skipped full Linux job are not new runtime passes. Exact native counts and limits are already in the body. No source change, push, retarget or additional runtime repetition is indicated by this notification. Windows 22621/accept validation remain separate open work.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head b0b8c21 merged onto main a4eca2a · tested 2026-11-02 22:22 UTC · 32 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 3,808 passed · 15 failed (0 new, 13 also fail on main, 2 unstable on main) · 59 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 3,882 of 3,591 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (1312 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.4 s, ⚠️ agc_driver_graphics 120.4 s, ⚠️ agc_driver_graphics_maps_fallback 120.3 s, ⚠️ public_headers 64.3 s, ⚠️ agc_driver_bda_device 61.1 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_array_layer_target_cpu: failed in 1 of the last 6 main runs
agc_driver_pipeline_journal: failed in 4 of the last 6 main runs
Failing on main too (13, not counted against this PR)
agc_driver_guest_memory_lifetime_direct
agc_driver_image_table
agc_driver_job_manager_compute_capacity
agc_driver_native_depth_bda_clear
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_driver_native_multisample_depth
agc_driver_submit_progress
agc_idle_publish_wait
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Passed on retry (3, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_graphics: Timeout in the parallel run; also passed only on retry in 47 other runs in the last 7 days
agc_driver_graphics_maps_fallback: Timeout in the parallel run; also passed only on retry in 57 other runs in the last 7 days
agc_driver_recorder: Timeout in the parallel run; also passed only on retry in 1 other runs in the last 7 days
Validation IDs already present on main (4 IDs in 754 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (754 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, and 746 more
VUID-vkCmdCopyImage-srcImage-01548 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-vkCmdCopyImage-srcImage-01551 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (59)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_copied_writer_label_order_drain: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_driver_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWi
Reproduce
git fetch origin b0b8c21822418d49e9b1bf2a4484f50797f12bdb a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8
git checkout a4eca2a056bf3bbbec98ab42e9d28163e4ea9cb8 && git merge --no-ff b0b8c21822418d49e9b1bf2a4484f50797f12bdb
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 12 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 16 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 3, 2026
@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

@CnRJay refreshed reads at 32169af1dc395b182370cdf973687d313d33bfc4, integrating upstream main 4f41f4c375f5abb487dbd184fbc150f31994d762 and propagating the reads-owned conflict resolution bottom-up through the existing four PRs. Published heads and maintainer commits remain ancestors; this is a fast-forward update, with no replacement PR or base retarget.

Actual-ancestor 42-file reads comparison; main-based Files changed remains cumulative. Full-template body/dependency lines and historical evidence are refreshed.

The reported workflow approval failure at previous b0b8c21 was not reproducible: GitHub exposes 29 successful / 3 cancelled / 1 skipped check runs, 19 completed success/cancelled suites, no approval-required run among the 19 upstream workflow runs, no fork run/status context, and GraphQL rollup SUCCESS. Its actual merge state was DIRTY, as were all four PRs; those conflicts are now integrated. No unspecified run was approved.

Main's checked context copies and cpuset limits coexist with the stack's opaque I/O identity and cancellation debt. The checked local context retains mc_spare identity through restoration. Apple empty-iovec guards, shared pwrite cancellation/admission/flush completion and deterministic stream-close hooks/data comparisons remain. No archive #11625 change.

Current composed accept code 1574087191a4ec15cad31be7df32a521c0561280 explicitly rebuilds production and 17 focused executables: 660/660 CTests pass (68.29 s), including user/I/O contexts, read/write/accept cancellation, descriptor access, stream close, UDP, vector and AIO coverage. Six additional socket/shared-memory/dup/fcntl/append composition CTests pass 6/6 (1.72 s). Ubuntu 24.04.5 x86-64/GCC 13.3 Release through Apple Silicon translation; final production/fixture hashes match. This is composed-source evidence, not separate fresh local runs at every lower head or native Windows validation. Header audit passes 406 libraries / 28,304 exports. All four final-head conventions checks pass against actual upstream main in an isolated origin/main context: reads has no findings, upper layers only inherited SSL debt-length warning. Whitespace passes.

The overlap scan covers 1,724 open PRs and fails closed for uncomparable branches. #9938 at db41fa3 already declares #12682 first; its later caller-stack integration must retain I/O retirement before cleanup/TSD and native-stack restoration. #13390 at 3992904 adds independent logging preservation around freopen; retain both its calls/declarations and the FILE-before-descriptor close ordering. No combined runtime pass with either is claimed. #13950/#14885/#9242 are now retained through main, not new prerequisites. Other updated source pins and limits are in the body.

New-head checks/native qualification remain pending. Review is COMMENTED, not approval. Accept remains draft: the Windows 22621 intermittent sigjump hang is unresolved; one Server 2025 sample and Linux repetitions do not settle it. Admission/mode-lock costs are unmeasured, and no speed/CPU/title-performance or title-unblock claim is made. Maintainer bench and ordered admin-only full-build validation remain outstanding. Existing explicit dispatch was denied HTTP 403/admin rights.

AI-assisted: yes.

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

Recorded the new exact-head green evidence for 32169af, selected and merged onto main 4f41f4c:

  • Windows Server 2025/GNU 15.2: 2,387 passed / 976 skipped / 0 failures, 125.46 s. Deferred drain, underscore/manual-underscore restoration, adopted/adopted-exit and other context cases pass. One sigjump sample passes in 0.03 s. This does not resolve or qualify the intermittent Windows 22621 hang.
  • macOS x86-64 relinker: 669/669, 271.02 s, Apple Clang 21.0.0; guest_none_relocations passes in 16.01 s. Other relinkers, both macOS write-watch/edge-watch jobs, register-context Debug/Release, conventions and portability checks are successful. API totals are 21 successful / 1 skipped including repeated metadata runs. Full Linux is skipped; full macOS libkernel runtime is not qualified. These different-runner results do not clear writes/accept's failed jobs or establish their timeout cause, and are not paired same-machine/scene performance evidence.

The overlap report updated 2026-11-03 17:18:12 UTC leaves all four compared PR heads unchanged and adds #8497 096bf08 and #10749 dae55d9 to the uncomparable table. Their manual composition audit applies: reads and accept have identical Signals.cpp. Preserve locked signal/code consumption, wait/notify and checked-copy ordering, RegisteredForJumps when removing only RegisterSignalsOnLoad, I/O context/cancellation paths, and both signal test targets. Neither supplies a helper required by reads, so no import/new dependency is warranted; Depends on remains #12149 (still open). No order agreement or combined runtime pass is inferred. 76 branches remain uncomparable; no full overlap clearance. #14085 disappeared from the report without implying it merged.

Updated the full PR template. The branch is mergeable/CLEAN; review remains COMMENTED, not approval. No source change or push; Windows 22621 diagnosis and maintainer/admin validation requirements remain external/outstanding.

@XairRrR XairRrR left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed — approved

The merged tree builds and every test in its suite passes. Two production-only negative controls make the new read-cancel and close tests fail. I found nothing blocking. The non-blocking notes below cover the per-read cost of the signal layer and how scePthreadCancel waits on I/O.

What I ran

Head 32169af1dc395b182370cdf973687d313d33bfc4, main 1e658521a0a599872612bb91949311e2956b5283, merged tree 9efdf6fa7f958f4c65380ddb06c776629a3058fd, all in a clean worktree. Release, GCC 14.2.0, Ninja, on Debian 13 (32 vCPU Xeon Gold 6136).

git diff --check 1e658521a0a599872612bb91949311e2956b5283...32169af1dc395b182370cdf973687d313d33bfc4
python3 tools/check_conventions.py --base 1e658521a0a599872612bb91949311e2956b5283
ctest --test-dir build -j8 --test-load 32 --output-on-failure -R "guest_io_|guest_underscore_jumps|guest_raise_exception|guest_stream_close|guest_socket_read_write|net_dont_wait|guest_user_context|guest_signal_sets|host_thread_local"
ctest --test-dir build --repeat until-fail:20 -j8 --test-load 32 -R "^guest_io_(read_pipe_read_cancel|descriptor_close_before_native|context_sigjump|descriptor_registry_lifetime)$"
# negative controls (see below), each followed by
ninja -C build -j32 -l32 guest_io_read_cancel_tests guest_io_descriptor_access_tests libkernel libs
ctest --test-dir build -j8 --test-load 32 -R "^guest_io_(close_|descriptor_|read_pipe)"
git status --porcelain

Results

Check Result
Merge into main clean
git diff --check clean
check_conventions.py All conventions checks passed
Configure / build / libs (build job) ok
Selected tests (build job) 4071 run, 0 new failures, 0 timeouts. The 9 known failures (agc_driver_* denormal/division, guest_interfaces, guest_socket_options_multicast, unwrap_self_…, vector_constant_factor_tininess) also fail on main.
check_skips.py guest_net_ctl skipped unexpectedly, which also happens on main
Focused tests touched by the PR 334/334 passed, 22.7 s wall. Each test runs well under its 15–25 s limit.
20 repeats of four of the new cancel/context tests (incl. guest_io_context_sigjump) 4/4 passed
Vulkan validation not applicable: no AGC, shader recompiler or VideoOut file changed
Focused run tail
332/334 Test #3511: guest_io_read_pending_preadv ..............................   Passed    0.01 sec
333/334 Test #3301: guest_io_signal_fault_signal_unregistered_jump ............   Passed    0.01 sec
334/334 Test #3513: guest_io_read_zero_recvmsg_empty_complete .................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 334

Negative control

The new tests call new APIs (GuestDescriptorAccess, JumpBuffer::GuestContext*), so restoring every production file from main would only break the build. I made two targeted production-only reverts instead:

  1. No interruptible native read. In core/libs/prx/libkernel/File/src/Open.cpp:156, I replaced ThreadCancel::Native([&] { return ::read(fd, buf, n); }) with a plain ::read. Then guest_io_read_pipe_read_cancel, guest_io_read_pipe_read_complete, guest_io_read_pipe_alias_cancel and guest_io_read_pipe_alias_complete failed, each in about 2 s. The pending and disabled cases still passed, as they should.
  2. No close admission. In core/libs/prx/libkernel/File/src/Stdio.cpp:971, I removed the GuestDescriptorAccess … Mode::Close guard in close_nid_postfix. Then guest_io_close_readers_0, guest_io_close_0_0_0 and guest_io_descriptor_close_before_native failed. The socket variants close through other paths and passed.

After both controls I restored the merged files from 9efdf6fa… and rebuilt. All 60 guest_io_(close_|descriptor_|read_pipe) tests passed again, and git status --porcelain was empty. The author also reports a negative control on _longjmp's restore call; I did not repeat it.

Findings

Blocking

None.

Non-blocking

  1. A process-wide mutex and about 14 extra signal-mask syscalls on every POSIX read on Linux. This is new evidence for point 1 of CnRJay's review. The descriptor registry is now sharded, but the signal layer still serialises every POSIX read/recv in the process:

    • BeginIoSignals pushes onto manager.entries under the single SignalManager::mutex (core/libs/prx/libkernel/Pthread/src/IoSignals.cpp:260-263).
    • EndIoSignals runs std::erase over that vector under the same lock (IoSignals.cpp:288-291).
    • The manager thread holds that lock while it scans every entry (IoSignals.cpp:188-194).

    Counting from the source, each such read also pays for a large number of signal-mask syscalls:

    • SetupBlock runs in the IoRestart constructor and destructor, in BeginIoSignals, and twice in EndIoSignals: 10 pthread_sigmask calls.
    • NativeIo::State adds an unblock, a block, a sigpending and a final setmask (core/libs/prx/libkernel/Pthread/src/NativeIo.cpp:57-60, 82-88).
    • On top of that come three heap allocations (IoRestart::State, SignalState, NativeIo::State).

    The description says this cost is unmeasured and makes no speed claim, so no rule is broken. Still, this path is hotter than the descriptor admission it was asked about. Suggested fix:

    • Register the thread's SignalState once per guest thread rather than per call.
    • Skip the SetupBlock pairs when no deferred delivery is pending.
    • Or show a trace_digest comparison on a read-heavy scene before this lands.
  2. scePthreadCancel waits on a target's I/O with no time limit, re-signalling it on every pass of a yield loop. In the merged core/libs/prx/libkernel/Pthread/src/Thread.cpp:1450-1460, the canceller loops while thread->cancelIo is set, calling cancelIo->Wake() (pthread_kill(SIGUSR2) / CancelSynchronousIo) and scePthreadYield() each time. main already loops like this for condition waits (Thread.cpp:1406-1414 at 1e658521), but those always wake. A read stuck in a host call that ignores the interrupt keeps the calling thread spinning at full CPU, and pthread_cancel never returns. POSIX pthread_cancel only queues the request.

    The debt entry says that cancellation and close "may delay … indefinitely", but not that the caller of pthread_cancel blocks. Suggested fix: back off as the close path does (1–16 ms), or return after the request is queued and leave re-waking to a retry owner. At least state in the debt entry that the caller waits.

  3. Scope. The PR carries #12149's _setjmp/_longjmp (declared under Depends on: #12149, which is still open). It also splits guest_raise_exception into per-case tests, adds descriptor admission to dup/dup2/fcntl/stdio close, and adds deferred async-signal delivery. Each piece is tied to read cancellation, but together they make a +4.2k-line review unit. If maintainers prefer smaller units, the deferred-delivery layer (IoSignals.cpp, Signals.cpp/Exception.cpp hooks, context identity) could stand on its own.

Not verified

  • Windows and macOS: not built or run here. That includes _longjmp's GuestStackSwitch_nid_no_patch path, the CancelSynchronousIo path, and the Windows-only tests (deferred_drain, close_progress, position_cancel, append_*).
  • On macOS, FileStream::Close now calls std::fclose while the same thread holds flockfile (core/libs/prx/libc/include/FileStream.hpp:131-139, 493-501). This is fine on glibc. I did not check Apple libc, which releases and reinitialises the FILE lock inside fclose.
  • The intermittent Windows 22621 sigjump hang the author mentions.
  • Any performance effect: I had no strace/perf, so the syscall count above comes from reading the source, not from a trace.
  • Console behaviour of close interrupting an admitted read. The debt entry records that it differs from the reported console behaviour.
  • Combined behaviour with the overlapping PRs listed by the overlap bot.

@Felipebmaitan

Copy link
Copy Markdown
Contributor Author

@XairRrR read the full approval at 32169af and the non-blocking notes. The source-derived signal-mask count remains an estimate, not measured trace evidence; no speed claim. Your native Debian results and production-only negative controls are independent evidence for that reviewed head.

I prepared local follow-ups: sharded signal-registration ownership with direct unlinking; queued I/O cancellation whose existing worker owns 1–16 ms retries; explicit remaining mask/allocation and condition-wait caller debt. A gated cancellation test checks requester return while the target ignores interrupts, independent retry, and exactly-once cleanup/TSD. Production-only controls fail as intended: old caller loop blocks the requester; dropping worker notification loses retries; restored code passes.

These changes are not pushed. The wider translated Linux selection gives 252/334 passes and 82 failures (79 native-syscall observation failures, three starting fault-signal delivery failures); rebuilding published production sources produces the same 82 failing names. Those cases remain unqualified here. The final composed rebuild was interrupted twice by Docker daemon loss, so I cannot report its success. Conventions pass on all four local candidates (reads clean; upper layers only inherited SSL debt warning); whitespace/main composition pass, and overlap scan of 1,757 PRs fails closed. Windows syntax checks cover IoSignals and the fixture; Thread.cpp hits unchanged SDK declarations. No fresh Windows/macOS runtime or Windows 22621 resolution is claimed.

The approval and published heads remain unchanged while verification is incomplete. Local candidates are retained for continuation; I have not marked the new follow-ups published/addressed or requested a merge. No branch base/history replacement or archive-owner branch changes.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head 32169af merged onto main 1e65852 · tested 2026-11-03 21:27 UTC · 27 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 4,033 passed · 16 failed (0 new, 15 also fail on main, 1 unstable on main) · 61 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 4,110 of 3,818 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (1340 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_graphics_maps_fallback 85.1 s, ⚠️ agc_driver_graphics 81.8 s, ⚠️ public_headers 63.8 s, ⚠️ agc_driver_image_sample_unnormalized 50.8 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 7 of the last 9 main runs
Failing on main too (15, not counted against this PR)
agc_driver_alpha_to_coverage_sample_mask_export
agc_driver_guest_memory_lifetime_direct
agc_driver_image_table
agc_driver_job_manager_compute_capacity
agc_driver_native_depth_bda_clear
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_driver_native_multisample_depth
agc_driver_store_over_untracked
agc_driver_submit_progress
agc_driver_two_sample_alpha_to_coverage_sample_mask_export
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (4 IDs in 769 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (769 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_alpha_to_coverage_sample_mask_export, and 761 more
VUID-vkCmdCopyImage-srcImage-01548 (9 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store_image_copy, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, and 1 more
VUID-vkCmdCopyImage-srcImage-01551 (9 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store_image_copy, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, and 1 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (61)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_copied_writer_label_order_drain: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_driver_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_idle_publish_wait: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a forced watch of the import reads its submissions as CPU stores
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_storage_pending_key_refresh: skipped, refreshes over a pending key store are not testable here
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platfo
Reproduce
git fetch origin 32169af1dc395b182370cdf973687d313d33bfc4 1e658521a0a599872612bb91949311e2956b5283
git checkout 1e658521a0a599872612bb91949311e2956b5283 && git merge --no-ff 32169af1dc395b182370cdf973687d313d33bfc4
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 12 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 16 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants