svn commit: r203061 - head/sys/kern

Andriy Gapon avg at FreeBSD.org
Wed Jan 27 09:59:08 UTC 2010


Author: avg
Date: Wed Jan 27 09:59:08 2010
New Revision: 203061
URL: http://svn.freebsd.org/changeset/base/203061

Log:
  KASSERT that return value of interrupt filter complies with contract
  
  For example a return value of zero could lead to a stuck level-triggered
  interrupt line.
  
  Reviewed by:	jhb (for INTR_FILTER case)
  MFC after:	3 weeks

Modified:
  head/sys/kern/kern_intr.c

Modified: head/sys/kern/kern_intr.c
==============================================================================
--- head/sys/kern/kern_intr.c	Wed Jan 27 09:45:07 2010	(r203060)
+++ head/sys/kern/kern_intr.c	Wed Jan 27 09:59:08 2010	(r203061)
@@ -1378,6 +1378,12 @@ intr_event_handle(struct intr_event *ie,
 			ret = ih->ih_filter(frame);
 		else
 			ret = ih->ih_filter(ih->ih_argument);
+		KASSERT(ret == FILTER_STRAY ||
+		    ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 &&
+		    (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0),
+		    ("%s: incorrect return value %#x from %s", __func__, ret,
+		    ih->ih_name));
+
 		/* 
 		 * Wrapper handler special handling:
 		 *
@@ -1546,7 +1552,11 @@ intr_filter_loop(struct intr_event *ie, 
 			thread_only = 1;
 			continue;
 		}
-
+		KASSERT(ret == FILTER_STRAY ||
+		    ((ret & (FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) != 0 &&
+		    (ret & ~(FILTER_SCHEDULE_THREAD | FILTER_HANDLED)) == 0),
+		    ("%s: incorrect return value %#x from %s", __func__, ret,
+		    ih->ih_name));
 		if (ret & FILTER_STRAY)
 			continue;
 		else { 


More information about the svn-src-all mailing list