On Fri, 2008-05-02 at 21:27 +0200, Mike Galbraith wrote: That's a quite horrible patch for some of us, but I think I know why you did that, and I think your fancy Q6600 has a stable enough TSC to pull it off. Let me try and come up with something slightly less horribleOk, the the below would need something that relates tick_timestamp's to one another.. probably sucks without it.. OTOH, Andi said he was working on a fastish global sched_clock() thingy, Andi got a link to that code? Index: linux-2.6-2/kernel/sched.c =================================================================== --- linux-2.6-2.orig/kernel/sched.c +++ linux-2.6-2/kernel/sched.c @@ -560,6 +560,7 @@ struct rq { unsigned long next_balance; struct mm_struct *prev_mm; + spinlock_t clock_lock; u64 clock, prev_clock_raw; s64 clock_max_delta; @@ -657,20 +658,25 @@ static inline void update_last_tick_seen } #endif +#define cpu_rq(cpu) (&per_cpu(runqueues, (cpu))) +#define this_rq() (&__get_cpu_var(runqueues)) +#define task_rq(p) cpu_rq(task_cpu(p)) +#define cpu_curr(cpu) (cpu_rq(cpu)->curr) + /* * Update the per-runqueue clock, as finegrained as the platform can give * us, but without assuming monotonicity, etc.: */ -static void __update_rq_clock(struct rq *rq) +static void ___update_rq_clock(struct rq *rq, u64 now) { u64 prev_raw = rq->prev_clock_raw; - u64 now = sched_clock(); s64 delta = now - prev_raw; u64 clock = rq->clock; #ifdef CONFIG_SCHED_DEBUG WARN_ON_ONCE(cpu_of(rq) != smp_processor_id()); #endif + spin_lock(&rq->clock_lock); /* * Protect against sched_clock() occasionally going backwards: */ @@ -699,12 +705,31 @@ static void __update_rq_clock(struct rq rq->prev_clock_raw = now; rq->clock = clock; + spin_unlock(&rq->clock_lock); +} + +static void __update_rq_clock(struct rq *rq) +{ + ___update_rq_clock(rq, sched_clock()); +} + +static void __update_remote_rq_clock(struct rq *rq) +{ + u64 now = sched_clock(); + struct rq *this_rq = this_rq(); + + now -= this_rq->tick_timestamp; + now += rq->tick_timestamp; + + ___update_rq_clock(rq, now); } static void update_rq_clock(struct rq *rq) { if (likely(smp_processor_id() == cpu_of(rq))) __update_rq_clock(rq); + else + __update_remote_rq_clock(rq); } /* @@ -717,11 +742,6 @@ static void update_rq_clock(struct rq *r #define for_each_domain(cpu, __sd) \ for (__sd = rcu_dereference(cpu_rq(cpu)->sd); __sd; __sd = __sd->parent) -#define cpu_rq(cpu) (&per_cpu(runqueues, (cpu))) -#define this_rq() (&__get_cpu_var(runqueues)) -#define task_rq(p) cpu_rq(task_cpu(p)) -#define cpu_curr(cpu) (cpu_rq(cpu)->curr) - /* * Tunables that become constants when CONFIG_SCHED_DEBUG is off: */ @@ -8147,6 +8167,7 @@ void __init sched_init(void) rq = cpu_rq(i); spin_lock_init(&rq->lock); + spin_lock_init(&rq->clock_lock); lockdep_set_class(&rq->lock, &rq->rq_lock_key); rq->nr_running = 0; rq->clock = 1; --
| Joe Perches | [PATCH 010/148] include/asm-x86/bitops.h: checkpatch cleanups - formatting only |
| Con Kolivas | Re: [REPORT] cfs-v4 vs sd-0.44 |
| Randy Dunlap | Re: 2.6.25-rc2-mm1 (wakeup) |
| Greg Kroah-Hartman | [PATCH 006/196] Chinese: add translation of oops-tracing.txt |
git: | |
| Kevin Ballard | Re: git on MacOSX and files with decomposed utf-8 file names |
| Ingo Molnar | [OT] Your branch is ahead of the tracked remote branch 'origin/master' by 50 commi... |
| Mark Levedahl | rc4 - make quick-install-doc is broken |
| Dmitry Potapov | Re: I'm a total push-over.. |
| Richard Stallman | Real men don't attack straw men |
| GVG GVG | ssh_exchange_identification: Connection closed by remote host |
| Richard Stallman | Re: Real men don't attack straw men |
| David Newman | setting dscp or tos bits |
| Radu Rendec | Endianness problem with u32 classifier hash masks |
| Bruno Randolf | [PATCH] add macro for printing mac addresses |
| Jeff Kirsher | [NET-NEXT PATCH 0/9] e1000: update and cleanups |
| Andrew Morton | Re: [BUG] New Kernel Bugs |
