diff --git a/docs/dev/debt/libSceJobManager.md b/docs/dev/debt/libSceJobManager.md index 3eb7e814ed..721009e610 100644 --- a/docs/dev/debt/libSceJobManager.md +++ b/docs/dev/debt/libSceJobManager.md @@ -5,3 +5,5 @@ - [Compute sequences](../../../core/libs/prx/libSceJobManager/Export.cpp) use explicit release packets instead of native rewind and completion-packet patching across GPU barriers. The bounded command area throws when exhausted; the original traps. Maximum register lists and markers can exhaust it before the logical dispatch limit. Compute dispatch on a CPU sequence throws. - [Scheduling](../../../core/libs/prx/libSceJobManager/Export.cpp) uses host mutexes and condition variables instead of native atomic queues and semaphores; spin intervals deliberately use unscaled host TSC. Blocks below 0x2d8 bytes, factory priorities above one, use of destroyed sequences and shutdown from a worker throw. New calls concurrent with shutdown are unverified. - [Pool allocation](../../../core/libs/prx/libSceJobManager/Export.cpp) reuses freed nodes in a different order; profiler dispatch IDs can differ from native allocation. The fallback Wait deliberately allocates no pool node; native Wait can stall on global pool exhaustion. Resource-creation failures throw after cleanup, where the original does not check every return. Vtable order was checked, but no calling title or PS5 timing equivalence has been tested. + +- Console behavior for [worker waits](../../../core/libs/prx/libSceJobManager/Export.cpp) is unverified. The owned original module stalls on the zero-spin, zero-persistence `worker_wait` fixture with native Windows and Linux host kernel services; the fallback wakes a spare worker and completes the child. The reference runner keeps this case selectable but excludes it from the shared-behavior parity suite. diff --git a/tools/run_job_manager_reference.py b/tools/run_job_manager_reference.py index 29509e4b79..49a19e6fff 100644 --- a/tools/run_job_manager_reference.py +++ b/tools/run_job_manager_reference.py @@ -17,7 +17,7 @@ sys.path.insert(0, str(ROOT / "core/relinker/relinker/tests")) from guest_import_fixtures import executable CASES = ("memory", "owned_state", "concurrent_wait", "validation", "dispatch", "ordering", "nested", "limits", "node_pool", "priority", "shutdown", "worker_policy", "worker_wake", "worker_wait", "worker_count", "worker_spin") -PARITY_CASES = tuple(case for case in CASES if case != "node_pool") +PARITY_CASES = tuple(case for case in CASES if case not in ("node_pool", "worker_wait")) def stage_libraries(directory, build, toolchain, dependencies): @@ -122,7 +122,7 @@ def main(): parser.add_argument("--output", type=Path, help="New directory for staged modules, per-case logs and results.json; defaults to a temporary directory") selection = parser.add_mutually_exclusive_group() selection.add_argument("--cases", nargs="+", choices=CASES) - selection.add_argument("--suite", choices=("all", "parity"), help="all runs every case (default); parity excludes the known native node_pool Wait stall") + selection.add_argument("--suite", choices=("all", "parity"), help="all runs every case (default); parity excludes original-module node_pool and worker_wait stalls with host kernel services") parser.add_argument("--timeout", type=float, default=20) args = parser.parse_args() if args.cases is None: