6788613 px: WARNING: px1: ino 0x18 blocked and disk warnings during high stress test
--- 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) {