Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Aug 2018 04:44:30 +0000 (UTC)
From:      Marcelo Araujo <araujo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r338087 - head/usr.sbin/bhyve
Message-ID:  <201808200444.w7K4iUhf098910@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201808200444.w7K4iUhf098910>