Re: [patch] voluntary-preempt-2.6.8.1-P2

Thomas Charbonnel
2004-08-16T14:52:26Z

I wrote :
> I wrote :
> > Ingo Molnar wrote :
> > > here's -P2:
> > >
> > > http://redhat.com/~mingo/voluntary-preempt/voluntary-preempt-2.6.8.1-P2
> > >
> > > Changes since -P1:
> > >
> > > - trace interrupted kernel code (via hardirqs, NMIs and pagefaults)
> > >
> > > - yet another shot at trying to fix the IO-APIC/USB issues.
> > >
> > > - mcount speedups - tracing should be faster
> > >
> > > Ingo
> >
> > Same do_IRQ problem with P2, trace is here :
> > http://www.undata.org/~thomas/swapper-P2.trace
> >
> > Thomas
> >
(...)
> There still are weird things happening with irq handling, though. how
> can generic_redirect_hardirq eat half a millisecond :
>
(...)
> Is there any source of interruption not covered by your P2 patch ?
(...)

More on this :

preemption latency trace v1.0
-----------------------------
latency: 611 us, entries: 21 (21)
process: ksoftirqd/0/2, uid: 0
nice: -10, policy: 0, rt_priority: 0
=======>
0.000ms (+0.000ms): sched_clock (schedule)
0.000ms (+0.000ms): dequeue_task (schedule)
0.000ms (+0.000ms): recalc_task_prio (schedule)
0.590ms (+0.589ms): effective_prio (recalc_task_prio)
0.590ms (+0.000ms): enqueue_task (schedule)
0.590ms (+0.000ms): __switch_to (schedule)
0.590ms (+0.000ms): finish_task_switch (schedule)
0.591ms (+0.001ms): do_IRQ (finish_task_switch)
(...)

and

preemption latency trace v1.0
-----------------------------
latency: 481 us, entries: 32 (32)
process: swapper/0, uid: 0
nice: 0, policy: 0, rt_priority: 0
=======>
0.000ms (+0.000ms): do_IRQ (default_idle)
0.000ms (+0.000ms): mask_and_ack_8259A (do_IRQ)
0.459ms (+0.459ms): generic_redirect_hardirq (do_IRQ)
0.459ms (+0.000ms): generic_handle_IRQ_event (do_IRQ)
0.459ms (+0.000ms): timer_interrupt (generic_handle_IRQ_event)
0.459ms (+0.000ms): mark_offset_tsc (timer_interrupt)
0.465ms (+0.005ms): do_timer (timer_interrupt)
0.465ms (+0.000ms): update_process_times (do_timer)
0.465ms (+0.000ms): update_one_process (update_process_times)
0.465ms (+0.000ms): run_local_timers (update_process_times)
0.465ms (+0.000ms): raise_softirq (update_process_times)
0.466ms (+0.000ms): scheduler_tick (update_process_times)
0.466ms (+0.000ms): sched_clock (scheduler_tick)
0.466ms (+0.000ms): update_wall_time (do_timer)
0.466ms (+0.000ms): update_wall_time_one_tick (update_wall_time)
0.466ms (+0.000ms): profile_hook (timer_interrupt)
0.466ms (+0.000ms): notifier_call_chain (profile_hook)
0.467ms (+0.000ms): generic_note_interrupt (do_IRQ)
0.467ms (+0.000ms): end_8259A_irq (do_IRQ)
0.467ms (+0.000ms): enable_8259A_irq (do_IRQ)
0.468ms (+0.000ms): do_softirq (do_IRQ)
0.468ms (+0.000ms): __do_softirq (do_softirq)
0.468ms (+0.000ms): wake_up_process (do_softirq)
0.468ms (+0.000ms): try_to_wake_up (wake_up_process)
0.468ms (+0.000ms): task_rq_lock (try_to_wake_up)
0.468ms (+0.000ms): activate_task (try_to_wake_up)
0.469ms (+0.000ms): sched_clock (activate_task)
0.469ms (+0.000ms): recalc_task_prio (activate_task)
0.469ms (+0.000ms): effective_prio (recalc_task_prio)
0.469ms (+0.000ms): enqueue_task (activate_task)
0.469ms (+0.000ms): preempt_schedule (try_to_wake_up)
0.469ms (+0.000ms): check_preempt_timing (sub_preempt_count)

It definitely looks like the kernel is interrupted by some interrupt
source not covered by the patch.

Thomas