summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_qpair.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2012-10-18 00:38:28 +0000
committerjimharris <jimharris@FreeBSD.org>2012-10-18 00:38:28 +0000
commit2e5a6d8f161627fd51fe1bc5551ba988c49cb06f (patch)
tree6e4babbf121961b775eeb792c0f536be4bfc2a5a /sys/dev/nvme/nvme_qpair.c
parent3d2744150b6626e65971d96f6cd57f799b0b55d2 (diff)
downloadFreeBSD-src-2e5a6d8f161627fd51fe1bc5551ba988c49cb06f.zip
FreeBSD-src-2e5a6d8f161627fd51fe1bc5551ba988c49cb06f.tar.gz
Add struct nvme_request object which contains all of the parameters passed
from an NVMe consumer. This allows us to mostly build NVMe command buffers without holding the qpair lock, and also allows for future queueing of nvme_request objects in cases where the submission queue is full and no nvme_tracker objects are available. Sponsored by: Intel
Diffstat (limited to 'sys/dev/nvme/nvme_qpair.c')
-rw-r--r--sys/dev/nvme/nvme_qpair.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 8d416e3..18eaed4a 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -119,6 +119,7 @@ void
nvme_qpair_process_completions(struct nvme_qpair *qpair)
{
struct nvme_tracker *tr;
+ struct nvme_request *req;
struct nvme_completion *cpl;
boolean_t retry, error;
@@ -131,6 +132,8 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair)
break;
tr = qpair->act_tr[cpl->cid];
+ req = tr->req;
+
KASSERT(tr,
("completion queue has entries but no active trackers\n"));
@@ -139,7 +142,7 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair)
if (error) {
nvme_dump_completion(cpl);
- nvme_dump_command(&tr->cmd);
+ nvme_dump_command(&tr->req->cmd);
}
qpair->act_tr[cpl->cid] = NULL;
@@ -147,8 +150,8 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair)
KASSERT(cpl->cid == tr->cmd.cid,
("cpl cid does not match cmd cid\n"));
- if (tr->cb_fn && !retry)
- tr->cb_fn(tr->cb_arg, cpl);
+ if (req->cb_fn && !retry)
+ req->cb_fn(req->cb_arg, cpl);
qpair->sq_head = cpl->sqhd;
@@ -159,10 +162,11 @@ nvme_qpair_process_completions(struct nvme_qpair *qpair)
/* nvme_qpair_submit_cmd() will release the lock. */
nvme_qpair_submit_cmd(qpair, tr);
else {
- if (tr->payload_size > 0)
+ if (req->payload_size > 0)
bus_dmamap_unload(qpair->dma_tag,
tr->payload_dma_map);
+ nvme_free_request(req);
SLIST_INSERT_HEAD(&qpair->free_tr, tr, slist);
mtx_unlock(&qpair->lock);
@@ -373,8 +377,10 @@ nvme_timeout(void *arg)
void
nvme_qpair_submit_cmd(struct nvme_qpair *qpair, struct nvme_tracker *tr)
{
+ struct nvme_request *req;
- tr->cmd.cid = tr->cid;
+ req = tr->req;
+ req->cmd.cid = tr->cid;
qpair->act_tr[tr->cid] = tr;
/*
@@ -393,7 +399,7 @@ nvme_qpair_submit_cmd(struct nvme_qpair *qpair, struct nvme_tracker *tr)
callout_reset(&tr->timer, NVME_TIMEOUT_IN_SEC * hz, nvme_timeout, tr);
/* Copy the command from the tracker to the submission queue. */
- memcpy(&qpair->cmd[qpair->sq_tail], &tr->cmd, sizeof(tr->cmd));
+ memcpy(&qpair->cmd[qpair->sq_tail], &req->cmd, sizeof(req->cmd));
if (++qpair->sq_tail == qpair->num_entries)
qpair->sq_tail = 0;
OpenPOWER on IntegriCloud