Implement THREAD_PRIORITY_TIME_CRITICAL

Con Kolivas kernel at kolivas.org
Mon Apr 3 21:14:37 CDT 2006


On Tue, 4 Apr 2006 01:47 am, Andreas Mohr wrote:
> Hi,
>
> [sneaked in another CC, JFYI ;]

Oh hi! This is the first time this thread has been brought to my attention.

> On Mon, Apr 03, 2006 at 04:29:43PM +0100, Mike Hearn wrote:
> > And even then, SCHED_ISO is a long way off and may never be merged.
> > Waiting for it wouldn't be helping users today, which is a bad thing
> > IMHO.
>
> I don't think SCHED_ISO is necessarily a long way off. Recently there has
> been more activity in getting scheduler improvements into mainline, so some
> form of SCHED_ISO class might appear soon.

I've had a whole read of this thread online now that I've found it and there 
are a number of things that I should mention since people seem quite happy to 
talk around my code :)

SCHED_ISO is a stable, mostly realtime solution for normal users. The one 
scenario that SCHED_FIFO was required _over_ the capabilities of SCHED_ISO is 
only professional audio sampling/capture work where one process may require 
almost 100% cpu for bursts of many seconds. Therefore for audio playback, 
SCHED_ISO is more than qualified.

While I'm pleased that SCHED_ISO fixes the problem for many people on this 
thread, I have to tell you that it is _not_ the solution to your problem for 
a number of reasons. My motivation for creating this scheduling class was for 
transparent realtime performance to be attainable for an ordinary desktop 
user without their knowledge or previous setup. The reason is that the 
current system for giving realtime privileges to ordinary users is 
complicated and not set up properly by hardly any distributions. This is the 
real time rlimits capabilites which is already in the kernel.

I'm disappointed yet again that there is no simple way for something as low 
cpu using as audio on wine cannot get low enough latency for ordinary 
playback without realtime scheduling. I've mentioned this on the mailing list 
before. The fact that the cpu scheduler is going to completely reorder 
processes in the order it sees fit, based mostly on cpu usage and wakeups 
means that unless there is some form of blocking between audio and the heavy 
cpu using game, there will be no guarantee that audio will be scheduled in 
preference to the game. This is obviously what you're seeing.

What strikes me is that people are very happy to think that the kernel is 
going to fix this problem. I have to tell you there will be no more 
infrastructure put into the kernel anytime soon to help you here. Since I 
have the displeasure of having to reiterate this to you I should probably 
offer some useful suggestions if I could think of some...

I do not believe you are going to need real time scheduling to get audio to 
work properly. This really is overkill in my opinion. However if you really 
want to go down this path you need to use the kernel infrastructure that is 
already in place. The realtime rlimits is there and works. Getting modern 
distributions to have it set up by default properly is the first challenge. I 
have not investigated to see who has done this, but if they are not then 
pinging the distribution maintainers or even helping them set it up is the 
thing to do here. Providing walk-throughs on setting it up (until the distros 
catch up) and using the system from within wine seems appropriate.

Audio playback and decoding should not really use much cpu. Processes that do 
not use much cpu are given preferential low latency in the kernel without 
changing scheduling class. The way to ensure that audio playback therefore 
always "wins" over cpu intensive games is to have a separate audio playback 
thread that uses as _little cpu_ as possible. This means it should do just 
the audio playback and do nothing else. Last time I checked the alsa code it 
does queueing/blocking without needing any extra polling. The practice, for 
example, of xmms(1) of checking to see if there's room in the queue every 
10ms is ancient and the wrong way to code audio.

Lastly, and this is not a comment about wine but all programming in general, 
multithreading cannot be left up to chance. More than ever with multiple cpu 
cores, logical cores, threads and an out-of-queued-order cpu scheduler, 
threads _must_ block on each other as much as possible. It cannot be left up 
to chance if they depend on each other. Use of sched_yield for example which 
just gives up the cpu for a random duration in the hope another thread gets 
scheduled meantime is basically wrong for anything but realtime tasks of the 
same priority. It has no place in modern code. All that will end up happening 
is processes will wake up and use cpu (spinning) for nothing decreasing 
throughput, and latencies will blow out. Again I'm not saying wine does this, 
but feel obliged to say this whenever the cpu scheduler is blamed for wrong 
"ordering" of tasks.

Hope this helps

Cheers,
Con



More information about the wine-devel mailing list