https://bugs.kde.org/show_bug.cgi?id=524046

            Bug ID: 524046
           Summary: kwin_wayland main thread stuck at ~90% CPU
                    re-importing dma-bufs every frame
                    (EglDisplay::importDmaBufAsImage →
                    amdgpu_va_range_alloc2), causing severe input lag
                    after ~17h session uptime
    Classification: Plasma
           Product: kwin
      Version First 6.7.4
       Reported In:
          Platform: Other
                OS: Linux
            Status: REPORTED
          Severity: normal
          Priority: NOR
         Component: performance
          Assignee: [email protected]
          Reporter: [email protected]
  Target Milestone: ---

SUMMARY

After roughly 17 hours of session uptime, kwin_wayland's main thread
spontaneously
ramped up to a sustained 85–97% of one CPU core and stayed there. Keyboard and
mouse
input became visibly laggy across the whole desktop, and the journal filled
with:

    kwin_wayland_wrapper: Key repeat discarded, Wayland compositor doesn't seem
to be processing events fast enough!

(339 occurrences in one boot). Overall system load was low — only kwin's main
thread was busy, and GPU utilization (amdgpu gpu_busy_percent) stayed at ~4%,
so the time was spent on the CPU side of the render path, not in actual GPU
work.

A stack sample of the busy main thread (eu-stack, taken repeatedly with the
thread
at ~93% CPU) consistently landed in the dma-buf import path, called from
SurfaceItem::preprocess during compositing — i.e. the import was happening on
(seemingly) every frame instead of once per buffer:

    #0  0x00007f8bc1ec15f9
    #1  amdgpu_va_range_alloc2                          (libdrm_amdgpu)
    #2  0x00007f8bb03f635a
    #3  0x00007f8bb0359344
    #4  dri2_from_dma_bufs                              (Mesa)
    #5  0x00007f8bc20f4ff6
    #6  0x00007f8bc20f13f4
    #7  0x00007f8bc20e25fd
    #8  KWin::EglDisplay::importDmaBufAsImage(KWin::DmaBufAttributes const&)
const
    #9  KWin::EglDisplay::importBufferAsImage(KWin::GraphicsBuffer*)
    #10 0x00007f8bcd9a39b6
    #11 KWin::SurfaceItem::preprocess()
    #12 KWin::ItemRendererOpenGL::createRenderNode(...)
    #13 KWin::ItemRendererOpenGL::createRenderNode(...)
    #14 KWin::ItemRendererOpenGL::createRenderNode(...)
    #15 KWin::ItemRendererOpenGL::createRenderNode(...)
    #16 KWin::ItemRendererOpenGL::renderItem(...)
    #17 KWin::WorkspaceScene::finalDrawWindow(...)
    #18 KWin::EffectsHandler::drawWindow(...)
    #19 KWin::EffectsHandler::paintWindow(...)
    #20 KWin::WorkspaceScene::paintWindow(...)
    #21 KWin::WorkspaceScene::paintSimpleScreen(...)
    #22 KWin::EffectsHandler::paintScreen(...)
    #23 KWin::WorkspaceScene::paint(...)
    #24 0x00007f8bcd7a4fc2
    #25 KWin::Compositor::composite(KWin::RenderLoop*)
    #26 0x00007f8bcabf081b
    #27 KWin::RenderLoop::frameRequested(KWin::RenderLoop*)
    #28 QObject::event(QEvent*)
    ... (Qt event loop / QCoreApplication::exec)

All other kwin threads were idle (pthread_cond_wait / ppoll).

Since importBufferAsImage hitting amdgpu_va_range_alloc2 every frame suggests
the
per-buffer EGLImage cache was not being hit (or GPU VA space had become heavily
fragmented / leaked so each allocation became expensive), and the problem
appeared
only after ~17h of uptime and then persisted, this looks like a slow resource
leak or cache-invalidation bug rather than a client misbehaving in the moment.

Things I ruled out before taking the stack trace:

- Not client-driven: I SIGSTOPped every plausible client one at a time and then
  in bulk (all 44 Chromium processes at once, Opera, plasmashell, a Wine app,
  wezterm, fcitx5, kded6, krunner, kaccess, and Xwayland itself). kwin stayed
at
  85–97% in every case.
- Not effects: unloading all effects at runtime (activeEffects empty, blur
  unloaded) made no difference.
- Not input events: /proc/interrupts deltas for i8042/xhci/touchpad were zero
  over a 3s window while kwin was still at ~90%.
- Not screencasting: no PipeWire screencast streams existed.
- kwin reconfigure and a DPMS off/on cycle did not clear it.
- Voluntary context switches were ~130/s, i.e. kwin was doing ~7–14ms of CPU
  work per wakeup at roughly frame-rate cadence — not a tight spin loop.

Restarting the session (new kwin_wayland process) immediately returned kwin to
~5% CPU under the identical workload, which supports state accumulated inside
the kwin process (EGLImage / GPU VA bookkeeping) being the problem.

STEPS TO REPRODUCE
1. Long-running Plasma Wayland session (~17h in my case) on AMD iGPU with an
   external HDMI monitor as the only enabled output, typical desktop workload
   (Chromium with many windows, terminals, a Wine app).
2. Wait. The issue starts spontaneously; journal shows "Key repeat discarded"
   bursts from the onset, becoming continuous within ~10 minutes.

OBSERVED RESULT
kwin_wayland main thread at 85–97% of one core indefinitely; system-wide
keyboard/mouse lag; dma-buf import path hot on every frame per stack samples.

EXPECTED RESULT
Client dma-bufs are imported once per buffer and cached; kwin main-thread CPU
stays in the single digits; no input lag.

SOFTWARE/OS VERSIONS
Operating System: Arch Linux
KDE Plasma Version: 6.7.4
KDE Frameworks Version: 6.28.0
Qt Version: 6.11.1
Graphics Platform: Wayland
Kernel: 7.1.6-arch1-1

ADDITIONAL INFORMATION
- Hybrid-GPU laptop (Lenovo 82L5): AMD Cezanne/Renoir iGPU (renders the
session)
  + NVIDIA GA107M (RTX 3050 Mobile, idle). OpenGL renderer: AMD Radeon Graphics
  (radeonsi, renoir, ACO), Mesa 26.1.6, libdrm 2.4.134.
- Outputs: internal eDP-1 disabled; single external HDMI-A-1 [email protected],
  scale 1, VRR incapable.
- kwin support information from the affected session available on request.
- The affected kwin process had accumulated ~95 min of CPU time over the 17h
  session, most of it in the final ~50 minutes.
- Phenomenologically this resembles bug 485425 (effect keeping a stale
  reference to a closed window → constant fullscreen repaints for the rest of
  the session, fixed in 6.1.3 in the glide effect). Glide is not in use here —
  enabled window animations were scale/squash — but the failure mode (repaint
  loop surviving every client-side intervention, cleared only by a session
  restart) is the same, so this may be a similar stale-reference regression in
  a different code path. A Wine/XWayland application (KakaoTalk) was running
  in the affected session, as in several reports on that bug.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to