What’s the exit condition of kwin_x11 and how to make it preemptive?
Sheng Mao
shngmao at gmail.com
Sun Nov 1 18:02:23 GMT 2020
Hi KDE developers,
My name is Sheng Mao and it is my first post here. Thank you for everyone for reading this!
I have a server running Fedora 33 with KDE session through Xrdp and I connect to it with RDP from Mac (Microsoft’s RDP) and another Fedora 33 (Remmina). For the past month, I noticed a symptom: if I click “logout” in KDE and RDP session ends. But kwin_x11 keeps running in getTimestamp(), occupying 100% of a core.
TL;DR: what’s the exit condition of kwin_x11 and how to make it preemptive?
I have found two other similar bugs on bugs.kde.org, but it seems that they are not different issues. So I did some investigation and here is my report.
1. How Xrdp works
Xrdp relies on Xrdp-sesman to launch Xvnc and start a X server. A basic process graph is as following:
xrdp-sesman(68415)───xrdp-sesman(70909)─┬─Xvnc(70915)─┬─{Xvnc}(70924)
│ ├─{Xvnc}(70925)
│ ├─{Xvnc}(70926)
│ ├─...
├─sh(70914)─┬─ssh-agent(71221)
│ └─startkde(71222)───{startkde}(71234)
└─xrdp-chansrv(70954)───{xrdp-chansrv}(70959)
xrdp-sesman waits for end of life of at least two processes: a display (Xvnc) and a window manager (startkde).
2. How startkde works
In my case, startkde is startplasma-x11.The call graph is:
startplasma-x11 -> plasma_session -> kwin_x11
startplasma-x11 calls plasma_session with QProcess and it ends execution based on unregistration of two dubs services: org.kde.ksmserver and org.kde.Shutdown.
plasma_session is more complicated, it runs the following eight jobs in sequence (refer to _second debug), kwin_x11 is one of them:
* kcminit_startup
* kded5
* kwin_x11
* ksmserver
* startup phase 0
* startup phase 1
* restore session jobs
* startup phase 2
3. What’s the exit condition of kwin_x11
It should be KSelectionOwner::lostOwnership. My understanding is that it is triggered by exiting of X server in this case.
4. What’s the problem
When I click logout in KDE, X server ends and display is closed. This _should_ trigger KSelectionOwner::lostOwnership to end kwin_x11. However, kwin_x11 calls getTimestamp from Qt and it is a *blocking* call. The getTimestamp() works by sending dummy message to X server to get a timestamp. But now the X server is _already dead_. This blocks the *main thread* and thus KSelectionOwner::lostOwnership will never be processed.
5. How to solve that?
Several ways to solve, I assume:
* KDE: use a preemptive method to handle exit condition; or find a way to delay ending X server
* Qt: provide a non-blocking getTimestamp() (may lead to many changes)
* Xrdp-sesman: delay ending Xvnc; or use systemd slice to find active processes
That’s all I find out and my thoughts. I am very new to KDE so my thoughts may be wrong. Your comments and advices are appreciated.
Thank you!
Sheng
More information about the kde-devel
mailing list