Subject: Re: isp(4) with Q-Logic 2340 suffers "stray interrupts" under load
To: NetBSD Kernel Technical Discussion List <tech-kern@NetBSD.org>
From: Jason Thorpe <thorpej@shagadelic.org>
List: tech-kern
Date: 03/28/2005 20:08:26
--Apple-Mail-1-618120671
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=US-ASCII;
delsp=yes;
format=flowed
On Mar 28, 2005, at 3:48 PM, Greg A. Woods wrote:
> I guess if there really is some tangible benefit to disabling IRQs
> that
> generate a lot of strays and never get handled then this change
> could be
> propogated to the pci_6600 code (and wherever else it's missing)
> instead
> of just commenting out the disabling code as I've done for now.....
I just checked in the attached (minimally invasive) patch, and will
request pullups to the netbsd-2 and netbsd-3 branches.
-- thorpej
--Apple-Mail-1-618120671
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
x-mac-type=54455854;
x-unix-mode=0755;
x-mac-creator=74747874;
name="alpha-strays-patch.txt"
Content-Disposition: attachment;
filename=alpha-strays-patch.txt
Index: common/shared_intr.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/common/shared_intr.c,v
retrieving revision 1.16
diff -u -p -r1.16 shared_intr.c
--- common/shared_intr.c 27 Jul 2001 00:25:19 -0000 1.16
+++ common/shared_intr.c 29 Mar 2005 04:03:18 -0000
@@ -245,6 +245,18 @@ alpha_shared_intr_set_maxstrays(struct a
}
void
+alpha_shared_intr_reset_strays(struct alpha_shared_intr *intr,
+ unsigned int num)
+{
+
+ /*
+ * Don't bother blocking interrupts; this doesn't have to be
+ * precise, but it does need to be fast.
+ */
+ intr[num].intr_nstrays = 0;
+}
+
+void
alpha_shared_intr_stray(struct alpha_shared_intr *intr, unsigned int num,
const char *basename)
{
Index: include/intr.h
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/include/intr.h,v
retrieving revision 1.49
diff -u -p -r1.49 intr.h
--- include/intr.h 27 Jul 2001 00:25:19 -0000 1.49
+++ include/intr.h 29 Mar 2005 04:03:19 -0000
@@ -300,6 +300,8 @@ void alpha_shared_intr_set_dfltsharetype
unsigned int, int);
void alpha_shared_intr_set_maxstrays(struct alpha_shared_intr *,
unsigned int, int);
+void alpha_shared_intr_reset_strays(struct alpha_shared_intr *,
+ unsigned int);
void alpha_shared_intr_stray(struct alpha_shared_intr *, unsigned int,
const char *);
void alpha_shared_intr_set_private(struct alpha_shared_intr *,
Index: pci/pci_1000.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_1000.c,v
retrieving revision 1.14
diff -u -p -r1.14 pci_1000.c
--- pci/pci_1000.c 27 Sep 2002 15:35:37 -0000 1.14
+++ pci/pci_1000.c 29 Mar 2005 04:03:19 -0000
@@ -275,7 +275,8 @@ dec_1000_iointr(arg, vec)
"dec_1000 irq");
if (ALPHA_SHARED_INTR_DISABLE(dec_1000_pci_intr, irq))
dec_1000_disable_intr(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(dec_1000_pci_intr, irq);
}
/*
Index: pci/pci_1000a.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_1000a.c,v
retrieving revision 1.16
diff -u -p -r1.16 pci_1000a.c
--- pci/pci_1000a.c 27 Sep 2002 15:35:37 -0000 1.16
+++ pci/pci_1000a.c 29 Mar 2005 04:03:19 -0000
@@ -296,7 +296,8 @@ dec_1000a_iointr(framep, vec)
"dec_1000a irq");
if (ALPHA_SHARED_INTR_DISABLE(dec_1000a_pci_intr, irq))
dec_1000a_disable_intr(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(dec_1000a_pci_intr, irq);
}
/*
Index: pci/pci_2100_a500.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_2100_a500.c,v
retrieving revision 1.5
diff -u -p -r1.5 pci_2100_a500.c
--- pci/pci_2100_a500.c 27 Sep 2002 15:35:37 -0000 1.5
+++ pci/pci_2100_a500.c 29 Mar 2005 04:03:20 -0000
@@ -662,7 +662,8 @@ dec_2100_a500_iointr(void *arg, u_long v
alpha_shared_intr_stray(tcp->tc_intrtab, irq, "T2 irq");
if (ALPHA_SHARED_INTR_DISABLE(tcp->tc_intrtab, irq))
(*tcp->tc_enable_intr)(tcp, irq, 0);
- }
+ } else
+ alpha_shared_intr_reset_strays(tcp->tc_intrtab, irq);
}
void
Index: pci/pci_550.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_550.c,v
retrieving revision 1.24
diff -u -p -r1.24 pci_550.c
--- pci/pci_550.c 27 Sep 2002 15:35:37 -0000 1.24
+++ pci/pci_550.c 29 Mar 2005 04:03:20 -0000
@@ -419,7 +419,8 @@ dec_550_iointr(arg, vec)
"dec 550 irq");
if (ALPHA_SHARED_INTR_DISABLE(dec_550_pci_intr, irq))
dec_550_intr_disable(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(dec_550_pci_intr, irq);
}
void
Index: pci/pci_6600.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_6600.c,v
retrieving revision 1.10
diff -u -p -r1.10 pci_6600.c
--- pci/pci_6600.c 27 Sep 2002 15:35:38 -0000 1.10
+++ pci/pci_6600.c 29 Mar 2005 04:03:20 -0000
@@ -301,7 +301,8 @@ dec_6600_iointr(arg, vec)
irqtype);
if (ALPHA_SHARED_INTR_DISABLE(dec_6600_pci_intr, irq))
dec_6600_intr_disable(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(dec_6600_pci_intr, irq);
}
void
Index: pci/pci_eb164.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_eb164.c,v
retrieving revision 1.32
diff -u -p -r1.32 pci_eb164.c
--- pci/pci_eb164.c 27 Sep 2002 15:35:38 -0000 1.32
+++ pci/pci_eb164.c 29 Mar 2005 04:03:21 -0000
@@ -371,7 +371,8 @@ eb164_iointr(arg, vec)
"eb164 irq");
if (ALPHA_SHARED_INTR_DISABLE(eb164_pci_intr, irq))
eb164_intr_disable(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(eb164_pci_intr, irq);
}
#if 0 /* THIS DOES NOT WORK! see pci_eb164_intr.S. */
Index: pci/pci_eb64plus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_eb64plus.c,v
retrieving revision 1.12
diff -u -p -r1.12 pci_eb64plus.c
--- pci/pci_eb64plus.c 27 Sep 2002 15:35:38 -0000 1.12
+++ pci/pci_eb64plus.c 29 Mar 2005 04:03:21 -0000
@@ -280,7 +280,8 @@ eb64plus_iointr(arg, vec)
"eb64+ irq");
if (ALPHA_SHARED_INTR_DISABLE(eb64plus_pci_intr, irq))
eb64plus_intr_disable(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(eb64plus_pci_intr, irq);
}
#if 0 /* THIS DOES NOT WORK! see pci_eb64plus_intr.S. */
Index: pci/pci_eb66.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_eb66.c,v
retrieving revision 1.12
diff -u -p -r1.12 pci_eb66.c
--- pci/pci_eb66.c 27 Sep 2002 15:35:38 -0000 1.12
+++ pci/pci_eb66.c 29 Mar 2005 04:03:21 -0000
@@ -279,7 +279,8 @@ eb66_iointr(arg, vec)
"eb66 irq");
if (ALPHA_SHARED_INTR_DISABLE(eb66_pci_intr, irq))
eb66_intr_disable(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(eb66_pci_intr, irq);
}
#if 0 /* THIS DOES NOT WORK! see pci_eb66_intr.S. */
Index: pci/pci_kn20aa.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_kn20aa.c,v
retrieving revision 1.44
diff -u -p -r1.44 pci_kn20aa.c
--- pci/pci_kn20aa.c 27 Sep 2002 15:35:38 -0000 1.44
+++ pci/pci_kn20aa.c 29 Mar 2005 04:03:21 -0000
@@ -277,7 +277,8 @@ kn20aa_iointr(arg, vec)
"kn20aa irq");
if (ALPHA_SHARED_INTR_DISABLE(kn20aa_pci_intr, irq))
kn20aa_disable_intr(irq);
- }
+ } else
+ alpha_shared_intr_reset_strays(kn20aa_pci_intr, irq);
}
void
Index: pci/pci_kn300.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_kn300.c,v
retrieving revision 1.26
diff -u -p -r1.26 pci_kn300.c
--- pci/pci_kn300.c 6 Jul 2004 13:36:19 -0000 1.26
+++ pci/pci_kn300.c 29 Mar 2005 04:03:21 -0000
@@ -252,7 +252,7 @@ kn300_iointr(arg, vec)
* reset the stray interrupt count- elsewise a slow leak
* over time will cause this level to be shutdown.
*/
- alpha_shared_intr_set_maxstrays(kn300_pci_intr, irq, 25);
+ alpha_shared_intr_reset_strays(kn300_pci_intr, irq);
return;
}
Index: pci/sio_pic.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/sio_pic.c,v
retrieving revision 1.32
diff -u -p -r1.32 sio_pic.c
--- pci/sio_pic.c 1 Jul 2004 18:46:49 -0000 1.32
+++ pci/sio_pic.c 29 Mar 2005 04:03:22 -0000
@@ -548,6 +548,8 @@ sio_iointr(arg, vec)
if (!alpha_shared_intr_dispatch(sio_intr, irq))
alpha_shared_intr_stray(sio_intr, irq, "isa irq");
+ else
+ alpha_shared_intr_reset_strays(sio_intr, irq);
/*
* Some versions of the machines which use the SIO
--Apple-Mail-1-618120671--