Author: araujo
Date: Mon Aug 20 04:44:29 2018
New Revision: 338087
URL: https://svnweb.freebsd.org/changeset/base/338087

Log:
  Fix double mutex lock.
  
  Reported by:  Coverity
  CID:          1394833
  Discussed with:       Leon Dang
  Sponsored by: iXsystems Inc.

Modified:
  head/usr.sbin/bhyve/pci_nvme.c

Modified: head/usr.sbin/bhyve/pci_nvme.c
==============================================================================
--- head/usr.sbin/bhyve/pci_nvme.c      Mon Aug 20 02:40:10 2018        
(r338086)
+++ head/usr.sbin/bhyve/pci_nvme.c      Mon Aug 20 04:44:29 2018        
(r338087)
@@ -358,7 +358,7 @@ pci_nvme_init_nsdata(struct pci_nvme_softc *sc)
 }
 
 static void
-pci_nvme_reset(struct pci_nvme_softc *sc)
+pci_nvme_reset_locked(struct pci_nvme_softc *sc)
 {
        DPRINTF(("%s\r\n", __func__));
 
@@ -374,7 +374,6 @@ pci_nvme_reset(struct pci_nvme_softc *sc)
        sc->regs.csts = 0;
 
        if (sc->submit_queues != NULL) {
-               pthread_mutex_lock(&sc->mtx);
                sc->num_cqueues = sc->num_squeues = sc->max_queues;
 
                for (int i = 0; i <= sc->max_queues; i++) {
@@ -398,8 +397,6 @@ pci_nvme_reset(struct pci_nvme_softc *sc)
                        sc->compl_queues[i].tail = 0;
                        sc->compl_queues[i].head = 0;
                }
-
-               pthread_mutex_unlock(&sc->mtx);
        } else
                sc->submit_queues = calloc(sc->max_queues + 1,
                                        sizeof(struct nvme_submission_queue));
@@ -414,6 +411,14 @@ pci_nvme_reset(struct pci_nvme_softc *sc)
 }
 
 static void
+pci_nvme_reset(struct pci_nvme_softc *sc)
+{
+       pthread_mutex_lock(&sc->mtx);
+       pci_nvme_reset_locked(sc);
+       pthread_mutex_unlock(&sc->mtx);
+}
+
+static void
 pci_nvme_init_controller(struct vmctx *ctx, struct pci_nvme_softc *sc)
 {
        uint16_t acqs, asqs;
@@ -1537,7 +1542,7 @@ pci_nvme_write_bar_0(struct vmctx *ctx, struct pci_nvm
                if (NVME_CC_GET_EN(ccreg) != NVME_CC_GET_EN(sc->regs.cc)) {
                        if (NVME_CC_GET_EN(ccreg) == 0)
                                /* transition 1-> causes controller reset */
-                               pci_nvme_reset(sc);
+                               pci_nvme_reset_locked(sc);
                        else
                                pci_nvme_init_controller(ctx, sc);
                }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to