Author: np
Date: Mon Aug 28 03:13:16 2017
New Revision: 322960
URL: https://svnweb.freebsd.org/changeset/base/322960

Log:
  cxgbe(4): Verify that the driver accesses the firmware mailbox in a
  thread-safe manner.
  
  MFC after:    3 days

Modified:
  head/sys/dev/cxgbe/adapter.h
  head/sys/dev/cxgbe/common/t4_hw.c
  head/sys/dev/cxgbe/t4_main.c

Modified: head/sys/dev/cxgbe/adapter.h
==============================================================================
--- head/sys/dev/cxgbe/adapter.h        Mon Aug 28 02:42:20 2017        
(r322959)
+++ head/sys/dev/cxgbe/adapter.h        Mon Aug 28 03:13:16 2017        
(r322960)
@@ -151,7 +151,7 @@ enum {
        /* adapter flags */
        FULL_INIT_DONE  = (1 << 0),
        FW_OK           = (1 << 1),
-       /* INTR_DIRECT  = (1 << 2),     No longer used. */
+       CHK_MBOX_ACCESS = (1 << 2),
        MASTER_PF       = (1 << 3),
        ADAP_SYSCTL_CTX = (1 << 4),
        /* TOM_INIT_DONE= (1 << 5),     No longer used */

Modified: head/sys/dev/cxgbe/common/t4_hw.c
==============================================================================
--- head/sys/dev/cxgbe/common/t4_hw.c   Mon Aug 28 02:42:20 2017        
(r322959)
+++ head/sys/dev/cxgbe/common/t4_hw.c   Mon Aug 28 03:13:16 2017        
(r322960)
@@ -286,6 +286,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int 
        __be64 cmd_rpl[MBOX_LEN/8];
        u32 pcie_fw;
 
+       if (adap->flags & CHK_MBOX_ACCESS)
+               ASSERT_SYNCHRONIZED_OP(adap);
+
        if ((size & 15) || size > MBOX_LEN)
                return -EINVAL;
 

Modified: head/sys/dev/cxgbe/t4_main.c
==============================================================================
--- head/sys/dev/cxgbe/t4_main.c        Mon Aug 28 02:42:20 2017        
(r322959)
+++ head/sys/dev/cxgbe/t4_main.c        Mon Aug 28 03:13:16 2017        
(r322960)
@@ -1221,6 +1221,15 @@ t4_attach(device_t dev)
                goto done;
        }
 
+       /*
+        * Ensure thread-safe mailbox access (in debug builds).
+        *
+        * So far this was the only thread accessing the mailbox but various
+        * ifnets and sysctls are about to be created and their handlers/ioctls
+        * will access the mailbox from different threads.
+        */
+       sc->flags |= CHK_MBOX_ACCESS;
+
        rc = bus_generic_attach(dev);
        if (rc != 0) {
                device_printf(dev,
@@ -1336,6 +1345,7 @@ t4_detach_common(device_t dev)
 
        sc = device_get_softc(dev);
 
+       sc->flags &= ~CHK_MBOX_ACCESS;
        if (sc->flags & FULL_INIT_DONE) {
                if (!(sc->flags & IS_VF))
                        t4_intr_disable(sc);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to