summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_ns_cmd.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_ns_cmd.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_ns_cmd.c')
-rw-r--r--sys/dev/nvme/nvme_ns_cmd.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/sys/dev/nvme/nvme_ns_cmd.c b/sys/dev/nvme/nvme_ns_cmd.c
index cba9032..ecc8cc5 100644
--- a/sys/dev/nvme/nvme_ns_cmd.c
+++ b/sys/dev/nvme/nvme_ns_cmd.c
@@ -33,17 +33,19 @@ int
nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
{
+ struct nvme_request *req;
struct nvme_tracker *tr;
struct nvme_command *cmd;
int err;
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg,
- lba_count*512, payload);
+ req = nvme_allocate_request(payload, lba_count*512, cb_fn, cb_arg);
+
+ tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
if (tr == NULL)
return (ENOMEM);
- cmd = &tr->cmd;
+ cmd = &req->cmd;
cmd->opc = NVME_OPC_READ;
cmd->nsid = ns->id;
@@ -52,7 +54,7 @@ nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
cmd->cdw12 = lba_count-1;
err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, payload,
- tr->payload_size, nvme_payload_map, tr, 0);
+ req->payload_size, nvme_payload_map, tr, 0);
KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
@@ -63,17 +65,19 @@ int
nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
{
+ struct nvme_request *req;
struct nvme_tracker *tr;
struct nvme_command *cmd;
int err;
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg,
- lba_count*512, payload);
+ req = nvme_allocate_request(payload, lba_count*512, cb_fn, cb_arg);
+
+ tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
if (tr == NULL)
return (ENOMEM);
- cmd = &tr->cmd;
+ cmd = &req->cmd;
cmd->opc = NVME_OPC_WRITE;
cmd->nsid = ns->id;
@@ -82,7 +86,7 @@ nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
cmd->cdw12 = lba_count-1;
err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, payload,
- tr->payload_size, nvme_payload_map, tr, 0);
+ req->payload_size, nvme_payload_map, tr, 0);
KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
@@ -93,17 +97,20 @@ int
nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
uint8_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg)
{
+ struct nvme_request *req;
struct nvme_tracker *tr;
struct nvme_command *cmd;
int err;
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg,
- num_ranges * sizeof(struct nvme_dsm_range), payload);
+ req = nvme_allocate_request(payload,
+ num_ranges * sizeof(struct nvme_dsm_range), cb_fn, cb_arg);
+
+ tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
if (tr == NULL)
return (ENOMEM);
- cmd = &tr->cmd;
+ cmd = &req->cmd;
cmd->opc = NVME_OPC_DATASET_MANAGEMENT;
cmd->nsid = ns->id;
@@ -112,7 +119,7 @@ nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
cmd->cdw11 = NVME_DSM_ATTR_DEALLOCATE;
err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, payload,
- tr->payload_size, nvme_payload_map, tr, 0);
+ req->payload_size, nvme_payload_map, tr, 0);
KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
@@ -122,15 +129,18 @@ nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
int
nvme_ns_cmd_flush(struct nvme_namespace *ns, nvme_cb_fn_t cb_fn, void *cb_arg)
{
+ struct nvme_request *req;
struct nvme_tracker *tr;
struct nvme_command *cmd;
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, cb_fn, cb_arg, 0, NULL);
+ req = nvme_allocate_request(NULL, 0, cb_fn, cb_arg);
+
+ tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
if (tr == NULL)
return (ENOMEM);
- cmd = &tr->cmd;
+ cmd = &req->cmd;
cmd->opc = NVME_OPC_FLUSH;
cmd->nsid = ns->id;
OpenPOWER on IntegriCloud