Messages in this thread | | | Date | Thu, 9 Dec 2010 14:21:33 -0800 | Subject | Re: [BUG] 2.6.37-rc3 massive interactivity regression on ARM | From | Venkatesh Pallipadi <> |
| |
On Thu, Dec 9, 2010 at 10:55 AM, Peter Zijlstra <peterz@infradead.org> wrote: > On Thu, 2010-12-09 at 10:11 -0800, Venkatesh Pallipadi wrote: >> On Thu, Dec 9, 2010 at 9:55 AM, Peter Zijlstra <peterz@infradead.org> wrote: >> > On Thu, 2010-12-09 at 09:43 -0800, Venkatesh Pallipadi wrote: >> >> >> >> The same problem will be there with below code, with irq_delta > >> >> delta, clock_task can go backwards which is not good. >> >> + delta -= irq_delta; >> >> + rq->clock_task += delta; >> >> >> >> The reason for this is rq->clock and irqtime updates kind of happen >> >> independently and specifically, if a rq->clock update happens while we >> >> are in a softirq, we may have this case of going backwards on the next >> >> update. >> > >> > But how can irq_delta > delta?, we measure it using the same clock. >> > >> >> This would be mostly a corner case like: >> - softirq start time t1 >> - rq->clock updated at t2 and rq->clock_task updated at t2 without >> accounting for current softirq >> - softirq end time t3 >> - cpu spends most time here in softirq or hardirq >> - next rq->clock update at t4 and rq->clock_task update, with delta = >> t4-t2 and irq_delta ~= t4 - t1 > > Ah, something like that would happen when we do a wakeup from > soft/hard-irq context, not an altogether uncommon occurrence. > > Wouldn't that be cured by updating the irq-time when asking for it, > something like the below? (on top of my earlier patch)
This should mostly work. There would be a small window there on rq->clock=sched_clock_cpu() and system_vtime doing sched_clock_cpu() and also the overhead of doing this everytime when this going backwards may happen rarely.
Thanks, Venki
> > --- > Index: linux-2.6/kernel/sched.c > =================================================================== > --- linux-2.6.orig/kernel/sched.c > +++ linux-2.6/kernel/sched.c > @@ -1843,8 +1843,9 @@ void account_system_vtime(struct task_st > } > EXPORT_SYMBOL_GPL(account_system_vtime); > > -static inline u64 irq_time_cpu(int cpu) > +static u64 irq_time_cpu(int cpu) > { > + account_system_vtime(current); > return per_cpu(cpu_softirq_time, cpu) + per_cpu(cpu_hardirq_time, cpu); > } > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |