From: Con Kolivas <kernel@kolivas.org>
To: linux kernel mailing list <linux-kernel@vger.kernel.org>
Subject: [PATCH] patch-O1int-0306302317 for 2.5.73 interactivity
Date: Tue, 1 Jul 2003 00:29:19 +1000 [thread overview]
Message-ID: <200307010029.19423.kernel@kolivas.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 599 bytes --]
Buried deep in another mail thread was the latest implementation of my O1int
patch so I've brought it to the surface to make it clear this one is
significantly different from past iterations.
Summary:
Decreases audio skipping with loads.
Smooths out X performance with load.
I've also made it available here:
http://kernel.kolivas.org/2.5
along with a patch called granularity that is a modified version of Ingo's
timeslice_granularity patch. It is no longer necessary and may slightly
decrease throughput in non-desktop settings but put on top of my O1int patch
makes X even smoother.
Con
[-- Attachment #2: patch-O1int-0306302317 --]
[-- Type: text/x-diff, Size: 3532 bytes --]
--- linux-2.5.73/kernel/sched.c 2003-06-30 10:06:40.000000000 +1000
+++ linux-2.5.73-test/kernel/sched.c 2003-06-30 23:16:42.000000000 +1000
@@ -314,11 +314,23 @@ static inline void enqueue_task(struct t
static int effective_prio(task_t *p)
{
int bonus, prio;
+ long sleep_period;
if (rt_task(p))
return p->prio;
- bonus = MAX_USER_PRIO*PRIO_BONUS_RATIO*p->sleep_avg/MAX_SLEEP_AVG/100 -
+ sleep_period = jiffies - p->avg_start;
+
+ if (!sleep_period)
+ return p->static_prio;
+
+ if (sleep_period > MAX_SLEEP_AVG)
+ sleep_period = MAX_SLEEP_AVG;
+
+ if (p->sleep_avg > sleep_period)
+ sleep_period = p->sleep_avg;
+
+ bonus = MAX_USER_PRIO*PRIO_BONUS_RATIO*p->sleep_avg/sleep_period/100 -
MAX_USER_PRIO*PRIO_BONUS_RATIO/100/2;
prio = p->static_prio - bonus;
@@ -348,9 +360,19 @@ static inline void activate_task(task_t
{
long sleep_time = jiffies - p->last_run - 1;
- if (sleep_time > 0) {
- int sleep_avg;
+ if (p->avg_start == 0){
+ p->avg_start = jiffies;
+ p->sleep_avg = 0;
+ sleep_time = 0;
+ }
+ if (sleep_time >= 0) {
+
+ if (sleep_time > HZ){
+ p->avg_start = jiffies;
+ p->sleep_avg = 0;
+ }
+ else {
/*
* This code gives a bonus to interactive tasks.
*
@@ -359,7 +381,7 @@ static inline void activate_task(task_t
* spends sleeping, the higher the average gets - and the
* higher the priority boost gets as well.
*/
- sleep_avg = p->sleep_avg + sleep_time;
+ p->sleep_avg += sleep_time;
/*
* 'Overflow' bonus ticks go to the waker as well, so the
@@ -367,12 +389,14 @@ static inline void activate_task(task_t
* boosting tasks that are related to maximum-interactive
* tasks.
*/
- if (sleep_avg > MAX_SLEEP_AVG)
- sleep_avg = MAX_SLEEP_AVG;
- if (p->sleep_avg != sleep_avg) {
- p->sleep_avg = sleep_avg;
- p->prio = effective_prio(p);
+ if (p->sleep_avg > MAX_SLEEP_AVG * 12/10)
+ p->sleep_avg = MAX_SLEEP_AVG * 11/10;
+ }
+ if (unlikely(p->avg_start > jiffies)){
+ p->avg_start = jiffies;
+ p->sleep_avg = 0;
}
+ p->prio = effective_prio(p);
}
__activate_task(p, rq);
}
@@ -549,8 +573,6 @@ void wake_up_forked_process(task_t * p)
* and children as well, to keep max-interactive tasks
* from forking tasks that are max-interactive.
*/
- current->sleep_avg = current->sleep_avg * PARENT_PENALTY / 100;
- p->sleep_avg = p->sleep_avg * CHILD_PENALTY / 100;
p->prio = effective_prio(p);
set_task_cpu(p, smp_processor_id());
@@ -586,13 +608,6 @@ void sched_exit(task_t * p)
p->parent->time_slice = MAX_TIMESLICE;
}
local_irq_restore(flags);
- /*
- * If the child was a (relative-) CPU hog then decrease
- * the sleep_avg of the parent as well.
- */
- if (p->sleep_avg < p->parent->sleep_avg)
- p->parent->sleep_avg = (p->parent->sleep_avg * EXIT_WEIGHT +
- p->sleep_avg) / (EXIT_WEIGHT + 1);
}
/**
--- linux-2.5.73/kernel/fork.c 2003-06-30 10:06:40.000000000 +1000
+++ linux-2.5.73-test/kernel/fork.c 2003-06-30 23:06:26.000000000 +1000
@@ -863,6 +863,7 @@ struct task_struct *copy_process(unsigne
p->array = NULL;
p->lock_depth = -1; /* -1 = no lock */
p->start_time = get_jiffies_64();
+ p->avg_start = 0;
p->security = NULL;
retval = -ENOMEM;
--- linux-2.5.73/include/linux/sched.h 2003-06-30 10:06:40.000000000 +1000
+++ linux-2.5.73-test/include/linux/sched.h 2003-06-30 13:23:46.000000000 +1000
@@ -336,6 +336,7 @@ struct task_struct {
prio_array_t *array;
unsigned long sleep_avg;
+ unsigned long avg_start;
unsigned long last_run;
unsigned long policy;
next reply other threads:[~2003-06-30 14:11 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-06-30 14:29 Con Kolivas [this message]
2003-06-30 18:27 ` [PATCH] patch-O1int-0306302317 for 2.5.73 interactivity Zwane Mwaikambo
2003-06-30 22:50 ` Con Kolivas
2003-06-30 21:21 ` Felipe Alfaro Solana
2003-06-30 21:54 ` Con Kolivas
2003-07-01 8:59 ` Felipe Alfaro Solana
2003-07-01 9:31 ` Con Kolivas
2003-07-01 12:00 ` Felipe Alfaro Solana
2003-07-01 12:04 ` Con Kolivas
2003-07-01 13:17 ` Felipe Alfaro Solana
2003-07-01 13:29 ` Con Kolivas
2003-07-01 16:31 ` Mike Galbraith
2003-06-30 22:03 ` Wiktor Wodecki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200307010029.19423.kernel@kolivas.org \
--to=kernel@kolivas.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox