lkml.org 
[lkml]   [1999]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] for people with problems with time accounting
Hi!

Here's patch for you. Let me know if it works - due to ftime() not
working on my system I can not do adequate tests...

Pavel
PS: Roggier, this one is for you ;-). BTW try to put your name into
credits file so I can find your email address next time ;-))).

--- clean/kernel/sched.c Fri Mar 26 17:46:31 1999
+++ linux/kernel/sched.c Fri Mar 26 17:31:12 1999
@@ -78,6 +78,7 @@
long time_adjust = 0;
long time_adjust_step = 0;

+int need_update_times = 0;
unsigned long event = 0;

extern int do_setitimer(int, struct itimerval *, struct itimerval *);
@@ -98,6 +99,8 @@

struct kernel_stat kstat = { 0 };

+static void update_process_times(struct task_struct *p, unsigned long ticks, unsigned long system);
+
void scheduling_functions_start_here(void) { }

#ifdef __SMP__
@@ -767,17 +772,22 @@
next->has_cpu = 1;
spin_unlock(&scheduler_lock);
#endif /* __SMP__ */
- if (prev != next) {
+
+ if (need_update_times)
+ update_process_times( next, 1, 1 );
+
+ if (prev != next) {
#ifdef __SMP__
sched_data->prev = prev;
#endif
- kstat.context_swtch++;
+ kstat.context_swtch++;
+
get_mmu_context(next);
switch_to(prev,next);

__schedule_tail();
}
-
+
reacquire_kernel_lock(current);
return;

@@ -1357,14 +1367,15 @@
do_it_prof(p, ticks);
}

-static void update_process_times(unsigned long ticks, unsigned long system)
+static void update_process_times(struct task_struct *p, unsigned long ticks, unsigned long system)
{
/*
* SMP does this on a per-CPU basis elsewhere
*/
#ifndef __SMP__
- struct task_struct * p = current;
unsigned long user = ticks - system;
+ need_update_times = 0;
+
if (p->pid) {
p->counter -= ticks;
if (p->counter < 0) {
@@ -1410,8 +1421,11 @@
calc_load(ticks);
update_wall_time(ticks);
write_unlock_irq(&xtime_lock);
-
- update_process_times(ticks, system);
+
+ if (current->pid || (!current->need_resched))
+ update_process_times(current, ticks, system);
+ else
+ need_update_times = 1;

} else
write_unlock_irq(&xtime_lock);
@@ -1419,20 +1433,20 @@

static void timer_bh(void)
{
- update_times();
run_old_timers();
run_timer_list();
+ update_times();
}

void do_timer(struct pt_regs * regs)
{
- (*(unsigned long *)&jiffies)++;
+ (*(unsigned long *)&jiffies)++; /* Otherwise gcc will generate ugly code */
lost_ticks++;
- mark_bh(TIMER_BH);
if (!user_mode(regs))
lost_ticks_system++;
if (tq_timer)
mark_bh(TQUEUE_BH);
+ mark_bh(TIMER_BH);
}

#ifndef __alpha__
--
I'm really pavel@ucw.cz. Look at http://195.113.31.123/~pavel. Pavel
Hi! I'm a .signature virus! Copy me into your ~/.signature to help me spread!

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:51    [from the cache]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and my Meterkast|Read the blog