public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH]O15int for interactivity
@ 2003-08-12 12:26 Con Kolivas
  2003-08-12 12:36 ` Måns Rullgård
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Con Kolivas @ 2003-08-12 12:26 UTC (permalink / raw)
  To: linux kernel mailing list; +Cc: Andrew Morton

This patch addresses the problem of tasks that preempt their children when 
they're forking, wasting cpu cycles until they get demoted to a priority where 
they no longer preempt their child. Although this has been said to be a design 
flaw in the applications, it can cause sustained periods of starvation due to 
this coding problem, and the more I looked, the more examples I found of this 
happening.

Tasks now cannot preempt their own children. This speeds up the startup of 
child applications (eg pgp signed email).

This change has allowed tasks to stay at higher priority for much longer so 
the sleep avg decay of high credit tasks has been changed to match the rate of 
rise during periods of sleep (which I wanted to do originally but was limited 
by the first problem). This makes for much more sustained interactivity at 
extreme loads, and much less X jerkiness.

Con

Patch against 2.6.0-test3-mm1:

--- linux-2.6.0-test3-mm1-O14.1/kernel/sched.c	2003-08-12 22:04:13.000000000 +1000
+++ linux-2.6.0-test3-mm1/kernel/sched.c	2003-08-12 22:03:47.000000000 +1000
@@ -620,8 +620,13 @@ repeat_lock_task:
 				__activate_task(p, rq);
 			else {
 				activate_task(p, rq);
-				if (TASK_PREEMPTS_CURR(p, rq))
-					resched_task(rq->curr);
+				/*
+				 * Parents are not allowed to preempt their
+				 * children
+				 */
+				if (TASK_PREEMPTS_CURR(p, rq) &&
+					p != rq->curr->parent)
+						resched_task(rq->curr);
 			}
 			success = 1;
 		}
@@ -1124,7 +1129,7 @@ static inline void pull_task(runqueue_t 
 	 * Note that idle threads have a prio of MAX_PRIO, for this test
 	 * to be always true for them.
 	 */
-	if (TASK_PREEMPTS_CURR(p, this_rq))
+	if (TASK_PREEMPTS_CURR(p, this_rq) && p != this_rq->curr->parent)
 		set_need_resched();
 }
 
@@ -1493,9 +1498,8 @@ need_resched:
 	 * priority bonus
 	 */
 	if (HIGH_CREDIT(prev))
-		run_time /= (MAX_BONUS + 1 -
-			(NS_TO_JIFFIES(prev->sleep_avg) * MAX_BONUS /
-			MAX_SLEEP_AVG));
+		run_time /= ((NS_TO_JIFFIES(prev->sleep_avg) * MAX_BONUS /
+				MAX_SLEEP_AVG) ? : 1);
 
 	spin_lock_irq(&rq->lock);
 


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2003-08-16  4:10 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-12 12:26 [PATCH]O15int for interactivity Con Kolivas
2003-08-12 12:36 ` Måns Rullgård
2003-08-12 14:00   ` Felipe Alfaro Solana
2003-08-12 14:04   ` Con Kolivas
2003-08-14  2:44 ` Wes Janzen
2003-08-14  2:54   ` Con Kolivas
2003-08-16  4:10 ` Martin Schlemmer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox