[haiku-development] Proposing kernel patch: mutexes/priorities
- From: Julian Harnath <julian.harnath@xxxxxxxxxxxxxx>
- To: haiku-development@xxxxxxxxxxxxx
- Date: Thu, 01 Mar 2012 17:43:09 +0100
This is a multipart message in MIME format.
Hey!
In relation to bug ticket 8007 [1] I propose a kernel patch (attached
to this mail) which implements:
* Kernel mutex waiting lists sorted by waiter priority (as opposed to
strict FIFO before)
* Priority boosting for kernel mutexes
* For the boosting to work, the thread struct keeps a list of mutexes
held by the thread
The priority boosting works as follows: if a thread A with priority X
holds a mutex and another thread B with priority Y tries to acquire it,
and Y > X, then the priority of A gets temporarily boosted to Y+1. As
soon as A releases the mutex it gets back its old priority X. (except A
still holds more mutexes with higher-priority threads waiting.. then it
gets the priority of the next-highest-priority waiter plus one).
In the discussion of the bugticket, axeld comments that "why should a
low priority thread be able to preempt a high priority thread just
because it acquired a mutex?". While I understand the reasoning, I
think one also has to see the other side: it already happens
implicitly. When a low-priority threads holds a mutex needed by a high-
priority thread it effectively blocks the high-priority thread from
working... it gets scheduled more often, but all it can do is stall and
waste CPU cycles. Even though there is no explicit priority change, it
happens implicitly and causes freezing. So IMO it makes sense to boost
the low-priority thread so it can finish whatever it does quickly and
release the lock again.
This patch does not solve the issues in ticket #8007, only partially.
It does resolve the excessive mutex-wait-times (at least on one of my
systems) seen in the scheduling_recorder output attached to the bug
ticket. However, now the problem is shifted to the second part: waiting
for port read cvar. The system can still freeze for a while with just
StyledEdit, but now it's not due to waiting for mutexes, but waiting
for ports. This needs to be solved as well...
Also, there is still one known problem with the patch: sometimes the
system deadlocks when booting (in the last stage, the rocket icon
already lighted), it always happens in the net_server thread, which got
its priority boosted and then freezes the rest of the boot process. I
have not yet investigated why that is, whether it is a problem in
net_server that just gets uncovered by this patch or if it's a problem
with the functionality of this patch itself. I will look into that.
Would be nice if some Haiku kernel developer could take a closer look
at the patch to see if it's alright. It's the first time I've worked on
something inside the Haiku kernel, I hope I didn't break things :)
Greetings,
Julian
[1] http://dev.haiku-os.org/ticket/8007
Other related posts: