<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Postmortems%2F2026-05-05_Jellyfin_XE_GPU_Hang</id>
	<title>Postmortems/2026-05-05 Jellyfin XE GPU Hang - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Postmortems%2F2026-05-05_Jellyfin_XE_GPU_Hang"/>
	<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Postmortems/2026-05-05_Jellyfin_XE_GPU_Hang&amp;action=history"/>
	<updated>2026-07-06T04:38:25Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.wilsoz.com/index.php?title=Postmortems/2026-05-05_Jellyfin_XE_GPU_Hang&amp;diff=20&amp;oldid=prev</id>
		<title>Wikibot: Migrated from postmortems/2026-05-05-jellyfin-xe-gpu-hang.md</title>
		<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Postmortems/2026-05-05_Jellyfin_XE_GPU_Hang&amp;diff=20&amp;oldid=prev"/>
		<updated>2026-07-05T18:17:36Z</updated>

		<summary type="html">&lt;p&gt;Migrated from postmortems/2026-05-05-jellyfin-xe-gpu-hang.md&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;As of: 2026-07-05 — migrated from `postmortems/2026-05-05-jellyfin-xe-gpu-hang.md`&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Postmortem: Jellyfin AV1 Transcoding Causes System Hard Hang =&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-05-05  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Duration:&amp;#039;&amp;#039;&amp;#039; ~2 minutes (20:28 → hard reset → 20:31 back online)  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Severity:&amp;#039;&amp;#039;&amp;#039; High — full system halt, required physical hard reset  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Mitigated (HW transcoding disabled)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
Pressing play on a video in Jellyfin triggered hardware-accelerated AV1 encoding via Intel QuickSync (QSV) on the Intel Arc B580 (Battlemage). The xe kernel driver entered a GPU execution queue timeout loop (&amp;lt;code&amp;gt;guc_exec_queue_timedout_job&amp;lt;/code&amp;gt;) on both GT0 and GT1, could not recover, and the system hard-locked. Required a physical power reset to recover.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Time (CST)&lt;br /&gt;
! Event&lt;br /&gt;
|-&lt;br /&gt;
| 20:28:53&lt;br /&gt;
| Jellyfin starts ffmpeg transcoding &amp;lt;code&amp;gt;Omega Doom (1996).mp4&amp;lt;/code&amp;gt; using &amp;lt;code&amp;gt;av1_qsv&amp;lt;/code&amp;gt; encoder via VAAPI/QSV&lt;br /&gt;
|-&lt;br /&gt;
| 20:30:09&lt;br /&gt;
| Kernel floods journal with &amp;lt;code&amp;gt;sysrq: HELP&amp;lt;/code&amp;gt; messages — system in distress&lt;br /&gt;
|-&lt;br /&gt;
| 20:30:40&lt;br /&gt;
| xe driver reports &amp;lt;code&amp;gt;guc_exec_queue_timedout_job&amp;lt;/code&amp;gt; resets on GT0 and GT1 repeatedly (dozens of attempts, all failing)&lt;br /&gt;
|-&lt;br /&gt;
| ~20:30:45&lt;br /&gt;
| System hard-locks. No response to input.&lt;br /&gt;
|-&lt;br /&gt;
| ~20:31:28&lt;br /&gt;
| Hard reset performed. System boots. All services recover normally.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Root Cause ==&lt;br /&gt;
&lt;br /&gt;
Jellyfin was configured to use Intel QuickSync (QSV) hardware acceleration. When transcoding the H.264 source file, ffmpeg selected &amp;lt;code&amp;gt;av1_qsv&amp;lt;/code&amp;gt; as the output encoder. AV1 encoding on the Arc B580 via the &amp;lt;code&amp;gt;xe&amp;lt;/code&amp;gt; kernel driver is unstable — the GPU execution queues time out, the driver attempts repeated resets, fails to recover, and the kernel hangs.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;xe&amp;lt;/code&amp;gt; driver (Intel&amp;#039;s replacement for &amp;lt;code&amp;gt;i915&amp;lt;/code&amp;gt; for Arc/Battlemage GPUs) is still maturing. AV1 hardware encoding is the newest and least-tested codec path on this driver. The system has no watchdog capable of recovering from this class of GPU hang.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ffmpeg command at crash:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/usr/lib/jellyfin-ffmpeg/ffmpeg&lt;br /&gt;
  -init_hw_device vaapi=va:/dev/dri/renderD128,driver=iHD&lt;br /&gt;
  -init_hw_device qsv=qs@va&lt;br /&gt;
  -hwaccel vaapi -hwaccel_output_format vaapi&lt;br /&gt;
  -codec:v:0 av1_qsv&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kernel error (repeated ~50+ times):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
xe 0000:0b:00.0: [drm] Tile0: GT0: trying reset from guc_exec_queue_timedout_job [xe]&lt;br /&gt;
xe 0000:0b:00.0: [drm] Tile0: GT1: trying reset from guc_exec_queue_timedout_job [xe]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== What Was NOT the Cause ==&lt;br /&gt;
&lt;br /&gt;
* This is unrelated to the previous &amp;lt;code&amp;gt;enable_dc=0&amp;lt;/code&amp;gt; fix (that addressed display C-state timeouts on monitor switch, a separate xe instability)&lt;br /&gt;
* Not an OOM event — 62GB RAM, only 13GB used&lt;br /&gt;
* Not a filesystem or RAID issue&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Fix Applied ==&lt;br /&gt;
&lt;br /&gt;
Disabled hardware transcoding in Jellyfin:&lt;br /&gt;
* Dashboard → Admin → Playback → Transcoding → Hardware acceleration → &amp;#039;&amp;#039;&amp;#039;None&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
ffmpeg now uses software (CPU) encoding. The Ryzen 5 3600X (12 threads) is capable of handling typical transcoding load in software.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Diagnostic Commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Check previous boot&amp;#039;s GPU errors&lt;br /&gt;
journalctl -b -1 | grep &amp;quot;xe\|guc\|drm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Check current boot for xe issues&lt;br /&gt;
dmesg -T | grep -i &amp;quot;xe\|guc\|drm\|hang\|reset&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# See what Jellyfin&amp;#039;s ffmpeg was doing at crash time&lt;br /&gt;
journalctl -u jellyfin --since &amp;quot;2026-05-05 20:25&amp;quot; --until &amp;quot;2026-05-05 20:32&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Hardware Context ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Component&lt;br /&gt;
! Detail&lt;br /&gt;
|-&lt;br /&gt;
| GPU&lt;br /&gt;
| Intel Arc B580 (Battlemage), PCI 0b:00.0, device e20b&lt;br /&gt;
|-&lt;br /&gt;
| Kernel driver&lt;br /&gt;
| xe (replacing i915 for Battlemage)&lt;br /&gt;
|-&lt;br /&gt;
| Kernel&lt;br /&gt;
| 6.18.1-061801-generic&lt;br /&gt;
|-&lt;br /&gt;
| CPU&lt;br /&gt;
| AMD Ryzen 5 3600X (6c/12t)&lt;br /&gt;
|-&lt;br /&gt;
| RAM&lt;br /&gt;
| 62GB&lt;br /&gt;
|-&lt;br /&gt;
| Existing xe fix&lt;br /&gt;
| &amp;lt;code&amp;gt;options xe enable_dc=0&amp;lt;/code&amp;gt; in modprobe.d (display C-state fix, unrelated)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Options for Restoring Hardware Transcoding ==&lt;br /&gt;
&lt;br /&gt;
=== Option A: Replace GPU with NVIDIA RTX 3060/4060 ===&lt;br /&gt;
* NVENC/NVDEC drivers are rock-solid on Linux&lt;br /&gt;
* RTX 3060: AV1 decode only (no AV1 encode)&lt;br /&gt;
* RTX 4060: AV1 encode + decode, ~$300&lt;br /&gt;
* Drop-in PCIe x16, works with AM4/X570 platform&lt;br /&gt;
* No driver instability issues for media workloads&lt;br /&gt;
&lt;br /&gt;
=== Option B: Replace GPU with Intel Arc A770 (Alchemist gen) ===&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;i915&amp;lt;/code&amp;gt; driver (mature, not &amp;lt;code&amp;gt;xe&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Full AV1 encode + decode&lt;br /&gt;
* ~$200–250&lt;br /&gt;
* Lower risk than Battlemage on xe&lt;br /&gt;
&lt;br /&gt;
=== Option C: Wait for xe driver to mature / upgrade kernel ===&lt;br /&gt;
* xe driver improves rapidly; a future kernel may handle this gracefully&lt;br /&gt;
* No cost, but timeline is unknown&lt;br /&gt;
* Risky — hangs are full system halts, not graceful crashes&lt;br /&gt;
&lt;br /&gt;
=== Option D: Keep B580, disable AV1 encode in Jellyfin only ===&lt;br /&gt;
* Keep VAAPI HW accel but force output codec to H.264 or H.265&lt;br /&gt;
* H.264/H.265 VAAPI paths on xe are more stable (but not guaranteed crash-free)&lt;br /&gt;
* Still some risk of xe driver hang on other codec paths&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Recommendation:&amp;#039;&amp;#039;&amp;#039; Option A (RTX 4060) if budget allows — eliminates the entire class of xe driver instability and gives better AV1 support. Option B (Arc A770) is the budget pick if you want to stay Intel.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Follow-up Actions ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Action&lt;br /&gt;
! Priority&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Disable HW transcoding in Jellyfin&lt;br /&gt;
| Critical&lt;br /&gt;
| Done&lt;br /&gt;
|-&lt;br /&gt;
| Decide on GPU replacement&lt;br /&gt;
| Medium&lt;br /&gt;
| Pending&lt;br /&gt;
|-&lt;br /&gt;
| Add stronghold hardware specs to INFRASTRUCTURE_INVENTORY.md&lt;br /&gt;
| Low&lt;br /&gt;
| Pending&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Wikibot</name></author>
	</entry>
</feed>