diff options
author | jimharris <jimharris@FreeBSD.org> | 2012-10-18 00:38:28 +0000 |
---|---|---|
committer | jimharris <jimharris@FreeBSD.org> | 2012-10-18 00:38:28 +0000 |
commit | 2e5a6d8f161627fd51fe1bc5551ba988c49cb06f (patch) | |
tree | 6e4babbf121961b775eeb792c0f536be4bfc2a5a /sys/dev/nvme/nvme_qpair.c | |
parent | 3d2744150b6626e65971d96f6cd57f799b0b55d2 (diff) | |
download | FreeBSD-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.c | 18 |
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; |