Re: start_kernel / local_irq_enable() can be very slow

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > You could do something like:
> > 
> > int trace_irqs;
> > 
> > 	trace_irqs = 1;
> > 	local_irq_enble();
> > 	trace_irqs = 0;
> 
> Do "trace_irqs = 10" first.
> 
> > then, over in handle_IRQ_event():
> > 
> > 	if (trace_irqs)
> > 		print_symbol("calling %s\n", (unsigned long)action->handler);
> 
> And decrement it here somewhere.
> 
> If it's delayed by up to three seconds, it sounds like there's a _lot_ of 
> interrupts happening, and I don't think there's any point in showing all 
> of them.

Well, after using tons of printk's I found that the following is 
happening:
 - irqs get enabled, and the timer interrupt gets handled,
 - arch/i386/kernel/timer.c::timer_interrupt gets called,
 - which in turn calls cur_timer->mark_offset(), which is
 - arch/i386/kernel/timers/timer_pm.c::mark_offset_pmtmr(), where we 
   finally arrive to:
        /* compensate for lost ticks */
        if (lost >= 2)
                jiffies_64 += lost - 1;

So no irq storm here, everything works as it should, the jiffies gets 
updated as it should, that's why it _seems_ from printk's that it takes 
long. (And only 1 irq happens.)


The main question though remains: what takes up seconds on the kernel 
boot, and why is it so undeterministic how long it takes (sometimes just 
0.3s, sometimes even 3s)? (Something before timers get enabled.)


-- 
pozsy
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux