Re: [RFC] [PATCH] Pre-emption control for userspace

From: Khalid Aziz
Date: Wed Mar 05 2014 - 20:23:44 EST


On 03/05/2014 05:36 PM, David Lang wrote:
Yes, you pay for two context switches, but you don't pay for threads
B..ZZZ all running (and potentially spinning) trying to aquire the lock
before thread A is able to complete it's work.


Ah, great. We are converging now.

As soon as a second thread hits the contention, thread A gets time to
finish.

Only as long as thread A could be scheduled immediately which may or may not be the case depending upon what else is running on the core thread A last ran on and if thread A needs to be migrated to another core.


It's not as 'good' [1] as thread A just working longer,

and that is the exact spot where I am trying to improve performance.

but it's FAR
better than thread A sleeping while every other thread runs and
potentially tries to get the lock

Absolutely. I agree with that.


[1] it wastes the context switches, but it avoids the overhead of
figuring out if the thread needs to extend it's time, and if it's time
was actually extended, and what penalty it should suffer the next time
it runs....

All of it can be done by setting and checking couple of flags in task_struct. That is not insignificant, but hardly expensive. Logic is quite simple:

resched()
{
........
if (immmunity) {
if (!penalty) {
immunity = 0;
penalty = 1;
-- skip context switch --
}
else {
immunity = penalty = 0;
-- do the context switch --
}
}
.........
}

sched_yield()
{
......
penalty = 0;
......
}

This simple logic will also work to defeat the obnoxius threads that keep setting immunity request flag repeatedly within the same critical section to give themselves multiple extensions.

Thanks,
Khalid
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/