Author: marius
Date: Sun Jan 31 22:21:08 2010
New Revision: 203327
URL: http://svn.freebsd.org/changeset/base/203327

Log:
  MFC: r203094
  
  - 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.
  
  Approved by:  re (kib)

Modified:
  stable/7/sys/sparc64/pci/fire.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/sparc64/pci/fire.c
==============================================================================
--- stable/7/sys/sparc64/pci/fire.c     Sun Jan 31 22:16:27 2010        
(r203326)
+++ stable/7/sys/sparc64/pci/fire.c     Sun Jan 31 22:21:08 2010        
(r203327)
@@ -851,7 +851,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;
@@ -1837,13 +1837,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;
                /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to