svn commit: r203094 - head/sys/sparc64/pci

Marius Strobl marius at FreeBSD.org
Wed Jan 27 20:30:14 UTC 2010


Author: marius
Date: Wed Jan 27 20:30:14 2010
New Revision: 203094
URL: http://svn.freebsd.org/changeset/base/203094

Log:
  - Zero the MSI/MSI-X queue argument, otherwise mtx_init(9) can panic
    indicating an already initialized lock.
  - Check for an empty MSI/MSI-X queue entry before asserting that we have
    received a MSI/MSI-X message in order to not panic in case of stray MSI/
    MSI-X queue interrupts which may happen in case of using an interrupt
    handler rather than a filter.
  
  MFC after:	3 days

Modified:
  head/sys/sparc64/pci/fire.c

Modified: head/sys/sparc64/pci/fire.c
==============================================================================
--- head/sys/sparc64/pci/fire.c	Wed Jan 27 20:25:46 2010	(r203093)
+++ head/sys/sparc64/pci/fire.c	Wed Jan 27 20:30:14 2010	(r203094)
@@ -852,7 +852,7 @@ fire_intr_register(struct fire_softc *sc
 		return (ENXIO);
 	fica = malloc((ino >= FO_EQ_FIRST_INO && ino <= FO_EQ_LAST_INO) ?
 	    sizeof(struct fire_msiqarg) : sizeof(struct fire_icarg), M_DEVBUF,
-	    M_NOWAIT);
+	    M_NOWAIT | M_ZERO);
 	if (fica == NULL)
 		return (ENOMEM);
 	fica->fica_sc = sc;
@@ -1838,13 +1838,13 @@ fire_msiq_common(struct intr_vector *iv,
 	qrec = &fmqa->fmqa_base[head];
 	word0 = qrec->fomqr_word0;
 	for (;;) {
+		if (__predict_false((word0 & FO_MQR_WORD0_FMT_TYPE_MASK) == 0))
+			break;
 		KASSERT((word0 & FO_MQR_WORD0_FMT_TYPE_MSI64) != 0 ||
 		    (word0 & FO_MQR_WORD0_FMT_TYPE_MSI32) != 0,
 		    ("%s: received non-MSI/MSI-X message in event queue %d "
 		    "(word0 %#llx)", device_get_nameunit(dev), msiq,
 		    (unsigned long long)word0));
-		if (__predict_false((word0 & FO_MQR_WORD0_FMT_TYPE_MASK) == 0))
-			break;
 		msi = (word0 & FO_MQR_WORD0_DATA0_MASK) >>
 		    FO_MQR_WORD0_DATA0_SHFT;
 		/*


More information about the svn-src-head mailing list