6788613 px: WARNING: px1: ino 0x18 blocked and disk warnings during high stress test
authorDaniel Ice <Daniel.Ice@Sun.COM>
Mon, 21 Sep 2009 15:56:41 -0700
changeset 10596 ebad9a25355a
parent 10595 1df9a0df7a0b
child 10597 67b207a9aeb8
6788613 px: WARNING: px1: ino 0x18 blocked and disk warnings during high stress test
usr/src/uts/sun4/io/px/px_ib.h
usr/src/uts/sun4/io/px/px_intr.c
--- a/usr/src/uts/sun4/io/px/px_ib.h	Mon Sep 21 13:34:48 2009 -0700
+++ b/usr/src/uts/sun4/io/px/px_ib.h	Mon Sep 21 15:56:41 2009 -0700
@@ -111,6 +111,7 @@
 	px_msiq_t	*ino_msiq_p;	/* pointer to MSIQ used */
 	px_ino_pil_t	*ino_ipil_p;	/* pointer to first px_ino_pil_t */
 	px_ino_t	*ino_next_p;	/* pointer to next px_ino_t */
+	ushort_t	ino_ipil_cntr;	/* counter for pil sharing ino */
 };
 
 #define	IB_INTR_WAIT	1		/* wait for interrupt completion */
--- a/usr/src/uts/sun4/io/px/px_intr.c	Mon Sep 21 13:34:48 2009 -0700
+++ b/usr/src/uts/sun4/io/px/px_intr.c	Mon Sep 21 15:56:41 2009 -0700
@@ -72,7 +72,7 @@
 px_spurintr(px_ino_pil_t *ipil_p)
 {
 	px_ino_t	*ino_p = ipil_p->ipil_ino_p;
-	px_ih_t		*ih_p = ipil_p->ipil_ih_start;
+	px_ih_t		*ih_p;
 	px_t		*px_p = ino_p->ino_ib_p->ib_px_p;
 	char		*err_fmt_str;
 	boolean_t	blocked = B_FALSE;
@@ -101,9 +101,13 @@
 	err_fmt_str = "!%s%d: spurious interrupt from ino 0x%x";
 warn:
 	cmn_err(CE_WARN, err_fmt_str, NAMEINST(px_p->px_dip), ino_p->ino_ino);
-	for (i = 0; i < ipil_p->ipil_ih_size; i++, ih_p = ih_p->ih_next)
-		cmn_err(CE_CONT, "!%s-%d#%x ", NAMEINST(ih_p->ih_dip),
-		    ih_p->ih_inum);
+	for (ipil_p = ino_p->ino_ipil_p; ipil_p;
+	    ipil_p = ipil_p->ipil_next_p) {
+		for (i = 0, ih_p = ipil_p->ipil_ih_start;
+		    i < ipil_p->ipil_ih_size; i++, ih_p = ih_p->ih_next)
+			cmn_err(CE_CONT, "!%s-%d#%x ", NAMEINST(ih_p->ih_dip),
+			    ih_p->ih_inum);
+	}
 	cmn_err(CE_CONT, "!\n");
 
 	/* Clear the pending state */
@@ -269,6 +273,9 @@
 	 * records or will just return immediately.
 	 */
 	if (msiq_p->msiq_recs2process == 0) {
+		ASSERT(ino_p->ino_ipil_cntr == 0);
+		ino_p->ino_ipil_cntr = ino_p->ino_ipil_size;
+
 		/* Read current MSIQ tail index */
 		px_lib_msiq_gettail(dip, msiq_p->msiq_id, &curr_tail_index);
 		msiq_p->msiq_new_head_index = msiq_p->msiq_curr_head_index;
@@ -424,7 +431,7 @@
 
 intr_done:
 	/* Interrupt can only be cleared after all pil levels are handled */
-	if (pil != ino_p->ino_lopil)
+	if (--ino_p->ino_ipil_cntr != 0)
 		return (DDI_INTR_CLAIMED);
 
 	if (msiq_p->msiq_new_head_index <= msiq_p->msiq_curr_head_index)  {