Mercurial > illumos > illumos-gate
changeset 10596:ebad9a25355a
6788613 px: WARNING: px1: ino 0x18 blocked and disk warnings during high stress test
author | Daniel Ice <Daniel.Ice@Sun.COM> |
---|---|
date | Mon, 21 Sep 2009 15:56:41 -0700 |
parents | 1df9a0df7a0b |
children | 67b207a9aeb8 |
files | usr/src/uts/sun4/io/px/px_ib.h usr/src/uts/sun4/io/px/px_intr.c |
diffstat | 2 files changed, 13 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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) {