aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAndriy Gapon <avg@FreeBSD.org>2017-06-09 15:16:39 +0000
committerAndriy Gapon <avg@FreeBSD.org>2017-06-09 15:16:39 +0000
commitad2b1a296f3ba8754a64fa84177c8dd4c65c30b2 (patch)
treef0fa14735d3ccb3e073c73a08bd13968c777cd4b /sys
parent40373cf5b87fe5ac39830b31f28994b6729b3215 (diff)
parentacb89578f10093c6b98f2e1ea03e4f1f97138be7 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/aacraid/aacraid.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/dev/aacraid/aacraid.c b/sys/dev/aacraid/aacraid.c
index 42a16c420393..bce644e56657 100644
--- a/sys/dev/aacraid/aacraid.c
+++ b/sys/dev/aacraid/aacraid.c
@@ -670,12 +670,10 @@ aac_alloc(struct aac_softc *sc)
TAILQ_INIT(&sc->aac_fibmap_tqh);
sc->aac_commands = malloc(sc->aac_max_fibs * sizeof(struct aac_command),
M_AACRAIDBUF, M_WAITOK|M_ZERO);
- mtx_lock(&sc->aac_io_lock);
while (sc->total_fibs < sc->aac_max_fibs) {
if (aac_alloc_commands(sc) != 0)
break;
}
- mtx_unlock(&sc->aac_io_lock);
if (sc->total_fibs == 0)
return (ENOMEM);
@@ -1046,7 +1044,9 @@ aac_command_thread(struct aac_softc *sc)
* will grab Giant, and would result in an LOR.
*/
if ((sc->aifflags & AAC_AIFFLAGS_ALLOCFIBS) != 0) {
+ mtx_unlock(&sc->aac_io_lock);
aac_alloc_commands(sc);
+ mtx_lock(&sc->aac_io_lock);
sc->aifflags &= ~AAC_AIFFLAGS_ALLOCFIBS;
aacraid_startio(sc);
}
@@ -1193,7 +1193,6 @@ aac_alloc_commands(struct aac_softc *sc)
u_int32_t maxsize;
fwprintf(sc, HBA_FLAGS_DBG_FUNCTION_ENTRY_B, "");
- mtx_assert(&sc->aac_io_lock, MA_OWNED);
if (sc->total_fibs + sc->aac_max_fibs_alloc > sc->aac_max_fibs)
return (ENOMEM);
@@ -1202,7 +1201,6 @@ aac_alloc_commands(struct aac_softc *sc)
if (fm == NULL)
return (ENOMEM);
- mtx_unlock(&sc->aac_io_lock);
/* allocate the FIBs in DMAable memory and load them */
if (bus_dmamem_alloc(sc->aac_fib_dmat, (void **)&fm->aac_fibs,
BUS_DMA_NOWAIT, &fm->aac_fibmap)) {
@@ -1220,7 +1218,6 @@ aac_alloc_commands(struct aac_softc *sc)
(void)bus_dmamap_load(sc->aac_fib_dmat, fm->aac_fibmap, fm->aac_fibs,
sc->aac_max_fibs_alloc * maxsize,
aac_map_command_helper, &fibphys, 0);
- mtx_lock(&sc->aac_io_lock);
/* initialize constant fields in the command structure */
bzero(fm->aac_fibs, sc->aac_max_fibs_alloc * maxsize);
@@ -1250,8 +1247,12 @@ aac_alloc_commands(struct aac_softc *sc)
if ((error = bus_dmamap_create(sc->aac_buffer_dmat, 0,
&cm->cm_datamap)) != 0)
break;
- if (sc->aac_max_fibs <= 1 || sc->aac_max_fibs - sc->total_fibs > 1)
+ if (sc->aac_max_fibs <= 1 ||
+ sc->aac_max_fibs - sc->total_fibs > 1) {
+ mtx_lock(&sc->aac_io_lock);
aacraid_release_command(cm);
+ mtx_unlock(&sc->aac_io_lock);
+ }
sc->total_fibs++;
}
@@ -1500,6 +1501,7 @@ aac_unmap_command(struct aac_command *cm)
if (!(cm->cm_flags & AAC_CMD_MAPPED))
return;
+ mtx_assert(&sc->aac_io_lock, MA_OWNED);
if (cm->cm_datalen != 0 && cm->cm_passthr_dmat == 0) {
if (cm->cm_flags & AAC_CMD_DATAIN)
bus_dmamap_sync(sc->aac_buffer_dmat, cm->cm_datamap,