From: Con Kolivas <kernel@kolivas.org>
To: Joshua Kwan <joshk@triplehelix.org>
Cc: linux-kernel mailing list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] O1int 0307010922 for 2.5.73 interactivity
Date: Tue, 1 Jul 2003 12:10:31 +1000 [thread overview]
Message-ID: <200307011210.31612.kernel@kolivas.org> (raw)
In-Reply-To: <20030701010412.GA21496@triplehelix.org>
[-- Attachment #1: Type: text/plain, Size: 1104 bytes --]
On Tue, 1 Jul 2003 11:04, Joshua Kwan wrote:
> On Tue, 1 Jul 2003 09:44, Con Kolivas wrote:
> > Here is an evolution of the O1int design to minimise audio skips/smooth
> > X. I've been forced to work with even less sleep than usual because of
> > this but I'm getting quite happy with it now.
>
> [snip]
>
> > More thrashing please. I know these had been coming out frequently but I
> > needed to assess every small increment. I hope not to need to do too much
> > from here.
>
> Well, this doesn't quite work. It initially seemed to prevent audio
> skips, but now I can't launch a new Eterm (with translucency) with the
> music not skipping, no change from stock -mm. It seems to work better
> under heavy load (extracting a chroot tarball for example) than when
> nothing is happening, which kind of puzzles me. In both cases I launch
> a new Eterm while music is playing.
>
> Inexplicably, it sometimes prevents skipping entirely.
Well we're on the way. Sing with me... a tweaking we will go..
Here is a tweaked patch with small changes otherwise which should help.
P.S. Were you running 100Hz?
Con
[-- Attachment #2: patch-O1int-0307011154 --]
[-- Type: text/x-diff, Size: 3473 bytes --]
--- 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-07-01 11:53:11.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;
--- linux-2.5.73/kernel/sched.c 2003-06-30 10:06:40.000000000 +1000
+++ linux-2.5.73-test/kernel/sched.c 2003-07-01 11:54:22.000000000 +1000
@@ -73,6 +73,7 @@
#define PRIO_BONUS_RATIO 25
#define INTERACTIVE_DELTA 2
#define MAX_SLEEP_AVG (10*HZ)
+#define SLEEP_TAU (MAX_SLEEP_AVG / 5)
#define STARVATION_LIMIT (10*HZ)
#define NODE_THRESHOLD 125
@@ -297,6 +298,17 @@ static inline void enqueue_task(struct t
p->array = array;
}
+static inline void normalise_sleep(task_t *p)
+{
+ int old_avg_time, new_avg_time;
+ new_avg_time = SLEEP_TAU;
+ old_avg_time = jiffies - p->avg_start;
+
+ if (old_avg_time < new_avg_time) return;
+ p->sleep_avg = p->sleep_avg * new_avg_time / old_avg_time;
+ p->avg_start = jiffies - new_avg_time;
+}
+
/*
* effective_prio - return the priority that is based on the static
* priority but is modified by bonuses/penalties.
@@ -314,11 +326,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;
@@ -349,7 +373,6 @@ static inline void activate_task(task_t
long sleep_time = jiffies - p->last_run - 1;
if (sleep_time > 0) {
- int sleep_avg;
/*
* This code gives a bonus to interactive tasks.
@@ -359,7 +382,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 +390,17 @@ 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 (sleep_time > SLEEP_TAU / 2){
+ p->avg_start = jiffies - SLEEP_TAU;
+ p->sleep_avg = SLEEP_TAU / 2;
}
+ if (unlikely(p->avg_start > jiffies)){
+ p->avg_start = jiffies;
+ p->sleep_avg = 0;
+ }
+ p->prio = effective_prio(p);
}
__activate_task(p, rq);
}
@@ -550,6 +578,10 @@ void wake_up_forked_process(task_t * p)
* from forking tasks that are max-interactive.
*/
current->sleep_avg = current->sleep_avg * PARENT_PENALTY / 100;
+ p->avg_start = current->avg_start;
+ if (p->sleep_avg > MAX_SLEEP_AVG)
+ p->sleep_avg = MAX_SLEEP_AVG;
+ normalise_sleep(p);
p->sleep_avg = p->sleep_avg * CHILD_PENALTY / 100;
p->prio = effective_prio(p);
set_task_cpu(p, smp_processor_id());
next prev parent reply other threads:[~2003-07-01 1:52 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-06-30 23:44 [PATCH] O1int 0307010922 for 2.5.73 interactivity Con Kolivas
2003-06-30 23:52 ` Con Kolivas
2003-07-01 1:04 ` Joshua Kwan
2003-07-01 1:58 ` Joshua Kwan
2003-07-01 2:10 ` Con Kolivas [this message]
2003-07-01 4:41 ` Joshua Kwan
2003-07-01 6:07 ` Con Kolivas
2003-07-01 10:12 ` Wiktor Wodecki
2003-07-01 10:32 ` Con Kolivas
-- strict thread matches above, loose matches on Subject: below --
2003-07-01 11:32 Luis Miguel Garcia
2003-07-01 10:48 ` Con Kolivas
2003-07-01 10:51 ` Wiktor Wodecki
2003-07-01 10:56 ` Luis Miguel Garcia
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=200307011210.31612.kernel@kolivas.org \
--to=kernel@kolivas.org \
--cc=joshk@triplehelix.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