DragonFly kernel List (threaded) for 2007-05
DragonFly BSD
DragonFly kernel List (threaded) for 2007-05
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: vmspace changes to use sysref


From: Matthew Dillon <dillon@xxxxxxxxxxxxxxxxxxxx>
Date: Tue, 1 May 2007 11:19:15 -0700 (PDT)

    Here's a patch I'd like people getting tons of stray interrupt
    messages to try.  All it does is limit the number and frequency
    of reports so the screen doesn't fill up with spam.

						-Matt

Index: kern/kern_intr.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_intr.c,v
retrieving revision 1.48
diff -u -r1.48 kern_intr.c
--- kern/kern_intr.c	30 Apr 2007 16:45:53 -0000	1.48
+++ kern/kern_intr.c	1 May 2007 17:59:07 -0000
@@ -69,6 +69,8 @@
 	int		i_fast;
 	int		i_slow;
 	int		i_state;
+	int		i_errorticks;
+	unsigned long	i_straycount;
 } intr_info_ary[MAX_INTS];
 
 int max_installed_hard_intr;
@@ -81,6 +83,7 @@
 static void emergency_intr_timer_callback(systimer_t, struct intrframe *);
 static void ithread_handler(void *arg);
 static void ithread_emergency(void *arg);
+static void report_stray_interrupt(int intr, struct intr_info *info);
 
 int intr_info_size = sizeof(intr_info_ary) / sizeof(intr_info_ary[0]);
 
@@ -487,8 +490,7 @@
     ++info->i_count;
     if (info->i_state != ISTATE_NOTHREAD) {
 	if (info->i_reclist == NULL) {
-	    kprintf("sched_ithd: stray interrupt %d on cpu %d\n",
-		    intr, mycpuid);
+	    report_stray_interrupt(intr, info);
 	} else {
 #ifdef SMP
 	    if (info->i_thread.td_gd == mycpu) {
@@ -510,11 +512,33 @@
 #endif
 	}
     } else {
-	kprintf("sched_ithd: stray interrupt %d on cpu %d\n",
-		intr, mycpuid);
+	report_stray_interrupt(intr, info);
     }
 }
 
+static void
+report_stray_interrupt(int intr, struct intr_info *info)
+{
+	++info->i_straycount;
+	if (info->i_straycount < 10) {
+		if (info->i_errorticks == ticks)
+			return;
+		info->i_errorticks = ticks;
+		kprintf("sched_ithd: stray interrupt %d on cpu %d\n",
+			intr, mycpuid);
+	} else if (info->i_straycount < 100) {
+		if (info->i_errorticks == ticks)
+			return;
+		info->i_errorticks = ticks;
+		kprintf("sched_ithd: %ld stray interrupts %d on cpu %d\n",
+			info->i_straycount, intr, mycpuid);
+	} else if (info->i_straycount == 100) {
+		kprintf("sched_ithd: %ld stray interrupts %d on cpu %d - "
+			"there will be no further reports\n",
+			info->i_straycount, intr, mycpuid);
+	}
+}
+
 /*
  * This is run from a periodic SYSTIMER (and thus must be MP safe, the BGL
  * might not be held).
@@ -759,6 +783,9 @@
 	    ++ill_count;
 	    info->i_running = 0;
 
+	    if (*list == NULL)
+		report_stray_interrupt(intr, info);
+
 	    for (rec = *list; rec; rec = nrec) {
 		nrec = rec->next;
 		if (rec->serializer) {



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