Use real-time scheduling policy for kwin_wayland
ClosedPublic

Authored by graesslin on Sep 10 2017, 10:11 AM.

Details

Summary

The base idea behind this change is to keep the system responsive no
matter what other processes do. All input and rendering needs to go
through the windowing system, so keeping it responsive is important.

Currently KWin competes with all other processes for resources and this
can render the system unusable. Consider some processes running amok. In
this case the user might not be able to easily close the applications as
KWin does not get the cpu time to perform the input tasks requested by
the user.

Or in the case of playing a demanding game it is important that KWin
gets scheduled to forward the pointer input events. The user doesn't
want that the game (or another process) wins against the windowing
sytem.

The disadvantage is that KWin always wins against other processes with
real time scheduling. This could result in KWin running amok stalling
the system. On the other hand this is no change to the current situation
as if KWin runs amok the sytem is unusable.

The change uses libcap to set CAP_SYS_NICE on kwin_wayland executable.
KWin_wayland on start sets the scheduling policy to SCHED_RR with the
lowest possible priority. Thus any other SCHED_RR process will win
against KWin. So real time processes are not affected by this change!

After adjusting the scheduling (which requires CAP_SYS_NICE) KWin drops
this capability again.

Test Plan

Verified that KWin adjusts the scheduler, that it is not passed
to child processes, that the capability gets dropped and not passed to
child processes.

Diff Detail

Repository
R108 KWin
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.
graesslin created this revision.Sep 10 2017, 10:11 AM
Restricted Application added a project: KWin. · View Herald TranscriptSep 10 2017, 10:11 AM
Restricted Application added subscribers: kwin, plasma-devel. · View Herald Transcript

@tcberner could you please try to compile this change on FreeBSD? I just want to be sure that it doesn't introduce a linux-ism. The most prominent dangerous part could be SCHED_RESET_ON_FORK where I'm not sure whether it is linux specific.

                 ^
/home/Tobias/git/kwin/main_wayland.cpp:452:38: error: use of undeclared identifier 'SCHED_RESET_ON_FORK'
    sched_setscheduler(0, SCHED_RR | SCHED_RESET_ON_FORK, &sp);
                                     ^

Yes, SCHED_RESET_ON_FORK is linux only:
https://www.freebsd.org/cgi/man.cgi?query=sched_setscheduler

                 ^
/home/Tobias/git/kwin/main_wayland.cpp:452:38: error: use of undeclared identifier 'SCHED_RESET_ON_FORK'
    sched_setscheduler(0, SCHED_RR | SCHED_RESET_ON_FORK, &sp);
                                     ^

Yes, SCHED_RESET_ON_FORK is linux only:
https://www.freebsd.org/cgi/man.cgi?query=sched_setscheduler

do you know whether there is an alternative for BSD? If not, I'll have to disable that feature on BSDs to not leak the real time scheduler to all child processes.

I could not find anything similar. So that's probably the way to go.

graesslin updated this revision to Diff 19375.Sep 10 2017, 5:48 PM

Check whether we have SCHED_RESET_ON_FORK and ifdef accordingly

Restricted Application edited projects, added Plasma; removed KWin. · View Herald TranscriptSep 10 2017, 5:48 PM
tcberner accepted this revision.Sep 19 2017, 5:18 PM

Looks good to me. Sorry for the timeout :)

This revision is now accepted and ready to land.Sep 19 2017, 5:18 PM

Looks good to me. Sorry for the timeout :)

The ping was more meant to other (Linux) developers on whether there is agreement that we should try making KWin a real time process ;-)

cfeck added a subscriber: cfeck.Sep 19 2017, 10:17 PM

I was about to suggest that it should queue lower than "real" realtime processes, but reading the description, this was actually taken care of using the lowest priority.

+1 to this feature. I think Windows also favors GUI processes over background processes, so having the main GUI process a higher schedule priority is a step in the right direction.

Cannot comment on the actual code changes, though.

This revision was automatically updated to reflect the committed changes.