#1146343 amdgpu: RustDesk triggers VCE ring timeout and GPU reset on Polaris RX 480 since 6.12.105

Package:
src:linux
Source:
src:linux
Submitter:
Manuel R. Buffa
Date:
2026-09-14 19:31:01 UTC
Severity:
normal
Tags:
#1146343#5
Date:
2026-08-31 15:41:47 UTC
From:
To:
Dear Maintainer,

I am reporting a reproducible amdgpu/VCE regression on Debian 13 (trixie)
with an AMD Radeon RX 480 / Polaris10 GPU. Active RustDesk remote-control
sessions are stable on Debian kernel 6.12.101-1 but trigger a VCE ring timeout
and GPU reset on 6.12.105-1 and 6.12.107-1.

Expected behavior
=================

Active RustDesk screen-capture and remote-control sessions should not wedge
the VCE engine, reset the GPU, or terminate the graphical desktop.

Actual behavior
===============

On 6.12.105 and 6.12.107, an active RustDesk session reproducibly reaches:

  RustDesk active session -> amdgpu ring vce0 timeout naming rustdesk
  -> GPU reset

The severe 6.12.105 runs additionally reached:

  -> VCE suspension failure -> VRAM loss -> X11/GNOME session teardown
  -> GDM

The controlled 6.12.107 run was stopped at the predetermined failure
boundary after the RustDesk connection froze, the vce0 timeout named
RustDesk, and GPU reset began. That particular run did not record VRAM loss
or full X11 teardown.

System and userspace
====================

* Debian GNU/Linux 13.6 (trixie), amd64
* AMD Radeon RX 480 / Polaris10, PCI ID 1002:67df, amdgpu
* GNOME/GDM X11
* RustDesk 1.4.9
* Official native RustDesk Debian package and package-provided system service
  are the primary reproducer
* firmware-amd-graphics 20250410-2
* Mesa 25.0.7-2+deb13u1
* No NVIDIA hardware, installed NVIDIA userspace, or loaded NVIDIA module
  participates in the final reproducer

The native RustDesk package came from the official rustdesk/rustdesk 1.4.9
release. The Debian asset was rustdesk-1.4.9-x86_64.deb, SHA-256:
7244ba47c40e804172044bfbe659467c54ce46554c98e78c8c0406f1d612fda3.

Regression matrix
=================

* linux-image-6.12.101+deb13-amd64 6.12.101-1: PASS / stable
* linux-image-6.12.105+deb13-amd64 6.12.105-1: FAIL
* linux-image-6.12.107+deb13-amd64 6.12.107-1: FAIL

6.12.105 repeatedly failed during RustDesk sessions. Flatpak RustDesk 1.4.9
independently reproduced the failure, and the official native RustDesk 1.4.9
package/system service reproduced it in a controlled test after approximately
30 seconds.

The official native RustDesk 1.4.9 service reproduced on 6.12.107 after
approximately 15 seconds of active remote use.

On the same hardware and substantially the same userspace and RustDesk
configuration, native RustDesk repeatedly passes on 6.12.101. Successful
tests include interactive use, control at GDM, GDM-to-GNOME transitions,
logout/login, sustained sessions, disconnect/reconnect cycles, and a final
7,201-second unattended monitor (1,355 samples) with zero VCE timeout, GPU
reset, VRAM-loss, or graphical-session teardown events.

This packaging-independent result shows that the observed regression is not
specific to the Flatpak sandbox or packaging. I am not claiming that RustDesk
itself is conclusively innocent or that a particular upstream commit is
responsible. The evidence establishes a kernel/AMDGPU/VCE regression, or a
kernel-specific interaction, triggered by this workload; source-level cause
has not yet been isolated.

Representative 6.12.105 native-service failure
================================================

  amdgpu: ring vce0 timeout, signaled seq=63, emitted seq=64
  amdgpu: Process information: process rustdesk pid 4790 thread rustdesk:cs0 pid 7411
  amdgpu: GPU reset begin!
  amdgpu: failed to suspend display audio
  suspend of IP block <vce_v3_0> failed -22
  amdgpu: GPU reset succeeded, trying to resume
  [drm] VRAM is lost due to GPU reset!
  amdgpu: GPU reset(1) succeeded!
  gnome-shell: X connection to :0 broken (explicit kill or server shutdown).

Representative 6.12.107 native-service failure
================================================

  amdgpu: ring vce0 timeout, signaled seq=127, emitted seq=128
  amdgpu: Process information: process rustdesk pid 4670 thread rustdesk:cs0 pid 21229
  amdgpu: GPU reset begin!
  amdgpu: failed to suspend display audio
  amdgpu: GPU reset(1) succeeded!

Reproducer
==========

1. Boot the affected Debian kernel with the RX 480 bound to amdgpu.
2. Start the normal GNOME/GDM X11 graphical session.
3. Use RustDesk 1.4.9 through its native package/system service to establish
   an active remote-control session.
4. Interact normally with the desktop while monitoring the kernel journal.
5. Within roughly 15-30 seconds in the controlled failing runs, the remote
   session freezes and the vce0 timeout/reset sequence appears.

I did not intentionally reproduce the reset again while collecting this
reportbug metadata under 6.12.107.

Workaround
==========

Persistent GRUB selection currently boots 6.12.101, which restores stable
RustDesk operation. No kernel packages are held, so future candidate kernels
can continue to be installed and explicitly tested.

SSH survives the GPU-reset event, so this should not be characterized as a
full-system crash. It is nevertheless a repeatable regression capable of
resetting the GPU and, on 6.12.105, terminating the graphical session.

The reportbug-generated kernel and package information follows.

#1146343#14
Date:
2026-09-01 04:52:55 UTC
From:
To:
Hi,
[...]

As you can reproduce your issue reliably, please bisect the changes
between 6.12.101 and 6.12.105 to identify the breaking commit. That
given we can have a look if it is a known regression already or needs
to be reported upstream yet.

Let me know if you need instructions for the bisecting steps!

Regards,
Salvatore

#1146343#21
Date:
2026-09-01 21:00:07 UTC
From:
To:
Hi Manuel, all

Manuel asked off-bug about the instructions, so here we go. To bisect
between 6.12.101 and 6.12.105 proceed as follows (once you have the
my_config, compilation could be as well on a more powerful machine).

    git clone --single-branch -b linux-6.12.y https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
    cd linux-stable
    git checkout v6.12.101
    cp /boot/config-$(uname -r) .config
    yes '' | make localmodconfig
    make savedefconfig
    mv defconfig arch/x86/configs/my_defconfig

    # test 6.12.101 to ensure this is "good"
    make my_defconfig
    make -j $(nproc) bindeb-pkg
    ... install the resulting .deb package and confirm problem does not exist

    # test 6.12.105 to ensure this is "bad"
    git checkout v6.12.105
    make my_defconfig
    make -j $(nproc) bindeb-pkg
    ... install the resulting .deb package and confirm problem exists

With that confirmed, the bisection can start:

    git bisect start
    git bisect good v6.12.101
    git bisect bad v6.12.105

In each bisection step git checks out a state between the oldest
known-bad and the newest known-good commit. In each step test using:

    make my_defconfig
    make -j $(nproc) bindeb-pkg
    ... install, verify if problem exists

and if the problem is hit run:

    git bisect bad

and if the problem doesn't trigger run:

    git bisect good

. Please pay attention to always select the just built kernel for
booting, it won't always be the default kernel picked up by grub.

Iterate until git announces to have identified the first bad commit.

Then provide the output of

    git bisect log

In the course of the bisection you might have to uninstall previous
kernels again to not exhaust the disk space in /boot. Also in the end
uninstall all self-built kernels again.

Regards,
Salvatore

#1146343#24
Date:
2026-09-01 21:00:07 UTC
From:
To:
Hi Manuel, all

Manuel asked off-bug about the instructions, so here we go. To bisect
between 6.12.101 and 6.12.105 proceed as follows (once you have the
my_config, compilation could be as well on a more powerful machine).

    git clone --single-branch -b linux-6.12.y https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
    cd linux-stable
    git checkout v6.12.101
    cp /boot/config-$(uname -r) .config
    yes '' | make localmodconfig
    make savedefconfig
    mv defconfig arch/x86/configs/my_defconfig

    # test 6.12.101 to ensure this is "good"
    make my_defconfig
    make -j $(nproc) bindeb-pkg
    ... install the resulting .deb package and confirm problem does not exist

    # test 6.12.105 to ensure this is "bad"
    git checkout v6.12.105
    make my_defconfig
    make -j $(nproc) bindeb-pkg
    ... install the resulting .deb package and confirm problem exists

With that confirmed, the bisection can start:

    git bisect start
    git bisect good v6.12.101
    git bisect bad v6.12.105

In each bisection step git checks out a state between the oldest
known-bad and the newest known-good commit. In each step test using:

    make my_defconfig
    make -j $(nproc) bindeb-pkg
    ... install, verify if problem exists

and if the problem is hit run:

    git bisect bad

and if the problem doesn't trigger run:

    git bisect good

. Please pay attention to always select the just built kernel for
booting, it won't always be the default kernel picked up by grub.

Iterate until git announces to have identified the first bad commit.

Then provide the output of

    git bisect log

In the course of the bisection you might have to uninstall previous
kernels again to not exhaust the disk space in /boot. Also in the end
uninstall all self-built kernels again.

Regards,
Salvatore

#1146343#29
Date:
2026-09-05 23:44:58 UTC
From:
To:
Hi Salvatore,

I completed the requested bisection between stable v6.12.101 and
v6.12.105 on the affected machine.

The kernel configuration was derived on the affected work-box while it
was running Debian 6.12.101 using the requested localmodconfig /
savedefconfig procedure. I froze that my_defconfig and used it for every
build. Compilation and packaging occurred on a separate amd64 builder;
every GOOD/BAD classification came only from the work-box with its
RX480/Polaris10 GPU under real RustDesk H.264 VAAPI use.

The endpoints reproduced as follows:

   v6.12.101  GOOD
   v6.12.105  BAD

The complete git bisect log is attached. Git mechanically identified:

   52566c150cadb1a17df840dd25862a61dcf84bed is the first bad commit
   drm/amdgpu: check ASPM on the dGPU host link

Its immediate parent, fa9624ad4d6d4b25e448dbc550ddc69e6f849640, tested
GOOD during the bisection. I subsequently qualified that exact parent in
two real RustDesk H.264 VAAPI sessions totalling about 43 minutes,
including a deliberate disconnect/reconnect. All 288 periodic samples
and the complete kernel journal were free of the characteristic
timeout/reset signatures. It is now the pinned operational kernel on
this work-box, and two consecutive normal boots plus a further 10-minute
H.264 VAAPI canary were clean.

There is an important causal qualification. I also built a clean
v6.12.105 tree with only 52566c150cad... reverted. That kernel remained
BAD: after about 79 seconds of real RustDesk H.264 VAAPI activity, the
work-box reproduced the same sequence:

   ring vce0 timeout
   GPU reset begin!
   VRAM is lost due to GPU reset!

Therefore, the mechanical bisection boundary is established, but this
single revert did not establish that 52566c... alone is sufficient for
the full v6.12.105 regression. There may be an interaction with other
changes in the later tree, or the isolated revert may be insufficient; I
do not want to overstate the mechanism.

The captured PCI topology appears to place the RX480 directly behind
Intel root port 0000:00:01.0; I did not observe an AMD internal PCIe
switch in the path. That seems relevant to reviewing the patch's effect
on this hardware. I have not run the optional one-shot amdgpu.aspm=0
mechanism probe.

For operational containment, I also directly qualified exact stable
v6.12.103 with the same frozen work-box-derived configuration. It
completed about 26 minutes of real RustDesk H.264 VAAPI activity across
three sessions with two reconnects, 174/174 clean samples, a clean
complete journal and stable visuals. Exact v6.12.103 is retained as the
emergency fallback and Debian 6.12.101 as a secondary rescue.

For the initial review I have included the complete bisect log, frozen
defconfig, the full first-bad commit metadata/diff, compact PCI
topology, a concise result summary, and short characteristic-signature
extracts from both the v6.12.105 BAD endpoint and the v6.12.105
single-revert BAD test. Full journals, package/build hashes, detailed
topology, and complete evidence manifests are available if useful.

Regards,
Manuel

#1146343#36
Date:
2026-09-06 16:41:36 UTC
From:
To:
Salvatore,
I am following up on the bisection results I previously submitted for
Debian bug #1146343.
After that report, the previously heavily qualified immediate-parent
custom kernel, commit
`fa9624ad4d6d4b25e448dbc550ddc69e6f849640`(`6.12.104-hnv2-b1146343-gfa9624ad4d6d`),
showed a GPU-related operational failure during normal use while a
RustDesk-related problem was observed.
The preserved journal does **not**reproduce the original bisection's
characteristic lead signature. There is no `ring vce0 timeout`and no
`amdgpu_job_timedout`. Instead, the event begins with GPU VM protection
faults attributed to `totem`, followed by a `ring gfx timeout`attributed
to Xorg, GPU reset, and VRAM loss. The VCE block appears only as a
failed suspend step during recovery.
Representative sequence:
```text
amdgpu: GPU fault detected ... for process totem
amdgpu: VM fault ...
amdgpu: ring gfx timeout ...
amdgpu: GPU reset begin!
[drm:amdgpu_device_ip_suspend_phase2 [amdgpu]] *ERROR* suspend of IP
block <vce_v3_0> failed -22
amdgpu: GPU reset succeeded, trying to resume
[drm] VRAM is lost due to GPU reset!
```
I therefore classify this later event as **DIFFERENT-SIGNATURE**, not as
a reproduction of the RustDesk H.264 VAAPI `ring vce0 timeout`used to
classify the BAD bisection kernels. It is a separate operational
observation and does not by itself invalidate the mechanical first-bad
result. I am not claiming that RustDesk, Totem, or the bisected change
caused this event.
For operational safety I have nevertheless withdrawn `fa9624...`as the
preferred default. Exact stable `v6.12.103`, commit
`25c09b42358e73e1476e517b296edb6344f2e4bd`, remains directly qualified
GOOD and is now the work-box default. After promotion it booted normally
twice and completed a further 21m06s real RustDesk H.264 VAAPI canary
with multiple connections/reconnects, 126/126 clean samples, and no VM
fault, VCE/GFX timeout, GPU reset, VRAM loss, or
`amdgpu_job_timedout`line. Manuel confirmed that the visuals were stable
throughout, with no freeze, disconnect anomaly, or visible degradation
attributable to work-box.
Given that the full v6.12.105 tree remained BAD after reverting the
mechanically first-bad commit, and that a later operational event on its
immediate GOOD parent showed a distinct AMDGPU gfx/VM-reset failure
path, it is possible that more than one nearby stable-tree change
contributes to the broader instability seen in the later kernels. I have
not isolated or proven such an interaction.
The original interpretation remains conservative:
-mechanical first bad: `52566c150cadb1a17df840dd25862a61dcf84bed`;
-immediate parent: `fa9624ad4d6d4b25e448dbc550ddc69e6f849640`, strongly 
qualified GOOD in the bounded bisection trials but now withdrawn as the
operational default because of this distinct later event;
-v6.12.105 with only `52566c...`reverted remained BAD;
-the mechanical boundary is established, while single-commit causal 
sufficiency is not established.
I can provide the complete affected-boot journal and the exact
`.103`post-promotion evidence if useful.
Regards,
Manuel

#1146343#41
Date:
2026-09-13 06:49:45 UTC
From:
To:
Hello Manuel,

Thanks for going through that!

:-(. So 52566c150cad wasn't the real (or single) reason for the
regression you see. If I understand correctly the symptoms on
52566c150cad were also slightly different.

Can you please test 5f46322e0b84af29e10eb951ff45bd6ea40640de,
869eb255e499112f9ffb42e7fa96ff2fca0df54b and
81b5af1fb0f14cace6c3b3130a05e5602a597820 with 52566c150cad reverted?

(That is

	git checkout 5f46322e0b84af29e10eb951ff45bd6ea40640de,
	git revert 52566c150cad
	... build and test according to Salvatore's instructions

and the same for the other two commits.)

I think with these results we can report upstream and let the amdgpu
experts work out the rest (or ask smarter questions).

Best regards
Uwe