lkml.org 
[lkml]   [1999]   [Mar]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [patch] recover losed timer interrupt using the TSC [Re: [patch] kstat change to see how much Linux SMP really scale well]
On Sun, 14 Mar 1999, Ingo Molnar wrote:

>+ prev_high = last_tsc_high;
>+ prev_low = last_tsc_low;
>
> /*
>- * Interrupts are just disabled locally since the timer irq
>- * has the SA_INTERRUPT flag set. -arca
>+ * It is important that these two operations happen almost at
>+ * the same time. We do the RDTSC stuff first, since it's
>+ * faster.
> */
>-
>- /* read Pentium cycle counter */
>- __asm__("rdtsc" : "=a" (last_tsc_low) : : "edx");
>-
>- outb_p(0x00, 0x43); /* latch the count ASAP */
>-
>- count = inb_p(0x40); /* read the latched count */
>- count |= inb(0x40) << 8;
>+ __asm__("rdtsc" : "=a" (last_tsc_low), "=d" (last_tsc_high));
^^^^^^^ this is a bug: it has to be declared __volatile__


>+ count = get_8254_timer_count();
>
> count = ((LATCH-1) - count) * TICK_SIZE;
> delay_at_last_interrupt = (count + LATCH/2) / LATCH;
>+
>+ delta_low = last_tsc_low - prev_low;
>+ delta_high = last_tsc_high - prev_high;
>+ if (last_tsc_low < prev_low)
>+ delta_high--;
>+
>+ /*
>+ * did we have a too big timer IRQ delay? The limit is
>+ * 1.5*1/HZ. This detects big delays too, not just
>+ * max 4G*1cycle ones, but breaks together with cpu_hz
>+ * at the 4GHz barrier.
>+ */
>+ if (delta_high || (delta_low > cpu_hz/HZ*3/2))
>+ printk("bug: %08x%08x cycles timer IRQ delay from %p\n",
>+ delta_high, delta_low, (void *)regs->eip);

Agreed, printing regs->eip is a good idea. I'll do that here too.

>+extern inline unsigned int get_8254_timer_count(void)

I' don't like this because I want to do other useful things between the
two inb_p. If you look at my patches you'll notice I am doing things in
the middle.

And btw I am _far_ from silenty recover the system time. If you look
closely at my last and current patch (-B) you'll notice that I printk
always how many irqs are been lost.

Andrea Arcangeli


-
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:50    [from the cache]
©2003-2011 Jasper Spaans