lkml.org 
[lkml]   [2007]   [Oct]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectInterrupt Latency test for intel machine
Hello all,

On my Intel Pentium 4 CPU 2.40 GHz machine by using attached file, I
am getting Interrupt latency as follows :-

Configuration MAX (us) MIN (us) AVG (us)
Samples
------------- -------- --------
-------- -------------
PREEMPT-NONE 43.576 4.190 4.190 119343

Voluntary PREEMPT 44.414 4.190 4.190 108694

PREEMPT low-latency 39.398 4.190 5.028 112717

Thank you,

Jaswinder Singh.
/*
* Interrupt latency test module
*
* (C) 2007 Jaswinder Singh <jaswinderlinux@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public Licence Version
* 2 as published by the Free Software Foundation.
*
*/

#include <linux/module.h>
#include <linux/init.h>
#include <linux/bcd.h>
#include <asm/time.h>

//#define DBG_IRQ_LAT /* debug interrupt latency test */

/* getting global time from 8254 */
#define READ_CNT0(var) do {var = inb(0x40); var |= (inb(0x40) << 8);} while (0)

#ifdef DBG_IRQ_LAT
#define TEST_CNT 1000
static long lat_val[TEST_CNT + 1];
static long lat_val_num;
#endif

static volatile long count_c0;

static long lat_max = 0;
static long lat_min = 100000000;
static unsigned long irq_cnt = 0;
static unsigned long lat_avg = 0;

static void irq_lat_hdr(void)
{
READ_CNT0(count_c0);
count_c0 = (LATCH - count_c0);
if (count_c0 > lat_max)
lat_max = count_c0;
if (count_c0 < lat_min)
lat_min = count_c0;
lat_avg = lat_avg + count_c0;
irq_cnt++;

#ifdef DBG_IRQ_LAT
if (irq_cnt <= TEST_CNT)
{
lat_val[irq_cnt] = count_c0;
}
#endif
}

static int __init irq_lat_init(void)
{
printk("*************************************\n");
printk("* Interrupt Latency module loaded *\n");
printk("* When you remove this module you *\n");
printk("* will get interrupt latency result *\n");
printk("*************************************\n");

irq_lat_ptr = irq_lat_hdr; /* Install interrupt handler */

return 0;
}

static void __exit irq_lat_exit(void)
{
unsigned long nanosecs = 1000000000;

irq_lat_ptr = NULL; /* Uninstall interrupt handler */

nanosecs = (nanosecs/CLOCK_TICK_RATE);

printk("Interrupt Latency result\n");
printk("------------------------\n");

if (lat_avg)
lat_avg = lat_avg/irq_cnt;
else
{
printk("Interrupt Latency test Failed\n");
printk("send info to <jaswinderlinux@gmail.com>\n");
return;
}

#ifdef DBG_IRQ_LAT
if (irq_cnt < TEST_CNT)
lat_val_num = irq_cnt;
else
lat_val_num = TEST_CNT;
for (count_c0 = 1; count_c0 <= lat_val_num; count_c0++)
{
printk("%4lu: %6lu ", count_c0, lat_val[count_c0]);
if ((count_c0 % 5) == 0)
printk("\n");
}

printk("\nCLOCK_TICK_RATE: %d TICK: %lu LATCH: %d\n", CLOCK_TICK_RATE, nanosecs, LATCH);
printk("MAX latency : %lu ticks\n", lat_max);
printk("MIN latency : %lu ticks\n", lat_min);
printk("AVG latency : %lu ticks\n", lat_avg);
#endif
printk("MAX latency : %5lu.%03lu micro-seconds\n", (nanosecs * lat_max)/1000, (nanosecs * lat_max) % 1000);
printk("MIN latency : %5lu.%03lu micro-seconds\n", (nanosecs * lat_min)/1000, (nanosecs * lat_min) % 1000);
printk("AVG latency : %5lu.%03lu micro-seconds\n", (nanosecs * lat_avg)/1000, (nanosecs * lat_avg) % 1000);
printk("Total Samples : %lu\n", irq_cnt);
}

module_init(irq_lat_init);
module_exit(irq_lat_exit);

MODULE_LICENSE("GPL");
diff -Naur linux-2.3.23-org/arch/i386/kernel/time.c linux-2.3.23/arch/i386/kernel/time.c
--- linux-2.3.23-org/arch/i386/kernel/time.c 2007-10-26 19:16:38.000000000 +0530
+++ linux-2.3.23/arch/i386/kernel/time.c 2007-10-26 19:17:49.000000000 +0530
@@ -150,6 +150,10 @@
}
EXPORT_SYMBOL(profile_pc);

+/* Interrupt latency pointer */
+irqlatptr irq_lat_ptr = NULL;
+EXPORT_SYMBOL(irq_lat_ptr);
+
/*
* This is the same as the above, except we _also_ save the current
* Time Stamp Counter value at the time of the timer interrupt, so that
@@ -173,6 +177,10 @@
}
#endif

+ /* Interrupt latency pointer */
+ if (irq_lat_ptr)
+ irq_lat_ptr();
+
do_timer_interrupt_hook();

if (MCA_bus) {
diff -Naur linux-2.3.23-org/include/asm-i386/time.h linux-2.3.23/include/asm-i386/time.h
--- linux-2.3.23-org/include/asm-i386/time.h 2007-10-26 19:16:38.000000000 +0530
+++ linux-2.3.23/include/asm-i386/time.h 2007-10-26 19:18:10.000000000 +0530
@@ -28,6 +28,10 @@
return retval;
}

+/* interrupt latency pointer */
+typedef void (*irqlatptr)(void);
+extern irqlatptr irq_lat_ptr;
+
extern void (*late_time_init)(void);
extern void hpet_time_init(void);
[unhandled content-type:application/octet-stream]
\
 
 \ /
  Last update: 2007-10-26 16:17    [W:0.217 / U:0.188 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site