From c2e83b404febf0842b263865fe76144495d95e43 Mon Sep 17 00:00:00 2001 From: Jim Harris Date: Thu, 18 Oct 2012 00:41:31 +0000 Subject: [PATCH] Simplify how the qpair lock is acquired and released. Sponsored by: Intel --- sys/dev/nvme/nvme_ctrlr.c | 8 ++++++++ sys/dev/nvme/nvme_qpair.c | 11 ++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c index 2987aec52d4..369df7f1751 100644 --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -802,6 +802,8 @@ nvme_ctrlr_submit_admin_request(struct nvme_controller *ctrlr, qpair = &ctrlr->adminq; + mtx_lock(&qpair->lock); + tr = nvme_qpair_allocate_tracker(qpair); tr->req = req; @@ -814,6 +816,8 @@ nvme_ctrlr_submit_admin_request(struct nvme_controller *ctrlr, panic("bus_dmamap_load returned non-zero!\n"); } else nvme_qpair_submit_cmd(tr->qpair, tr); + + mtx_unlock(&qpair->lock); } void @@ -829,6 +833,8 @@ nvme_ctrlr_submit_io_request(struct nvme_controller *ctrlr, else qpair = &ctrlr->ioq[0]; + mtx_lock(&qpair->lock); + tr = nvme_qpair_allocate_tracker(qpair); tr->req = req; @@ -850,4 +856,6 @@ nvme_ctrlr_submit_io_request(struct nvme_controller *ctrlr, if (err != 0) panic("bus_dmamap_load returned non-zero!\n"); } + + mtx_unlock(&qpair->lock); } diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c index 5298f1758ac..bd16ccd7042 100644 --- a/sys/dev/nvme/nvme_qpair.c +++ b/sys/dev/nvme/nvme_qpair.c @@ -79,8 +79,6 @@ nvme_qpair_allocate_tracker(struct nvme_qpair *qpair) { struct nvme_tracker *tr; - mtx_lock(&qpair->lock); - tr = SLIST_FIRST(&qpair->free_tr); if (tr == NULL) { /* @@ -89,7 +87,6 @@ nvme_qpair_allocate_tracker(struct nvme_qpair *qpair) * into the qpair's active tracker array. */ if (qpair->num_tr == qpair->num_entries) { - mtx_unlock(&qpair->lock); return (NULL); } @@ -97,7 +94,6 @@ nvme_qpair_allocate_tracker(struct nvme_qpair *qpair) M_ZERO | M_NOWAIT); if (tr == NULL) { - mtx_unlock(&qpair->lock); return (NULL); } @@ -160,7 +156,6 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair) callout_stop(&tr->timer); if (retry) - /* nvme_qpair_submit_cmd() will release the lock. */ nvme_qpair_submit_cmd(qpair, tr); else { if (req->payload_size > 0 || req->uio != NULL) @@ -169,10 +164,10 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair) nvme_free_request(req); SLIST_INSERT_HEAD(&qpair->free_tr, tr, slist); - - mtx_unlock(&qpair->lock); } + mtx_unlock(&qpair->lock); + if (++qpair->cq_head == qpair->num_entries) { qpair->cq_head = 0; qpair->phase = !qpair->phase; @@ -410,6 +405,4 @@ nvme_qpair_submit_cmd(struct nvme_qpair *qpair, struct nvme_tracker *tr) qpair->sq_tail); qpair->num_cmds++; - - mtx_unlock(&qpair->lock); }