summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_qpair.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2012-10-18 00:32:07 +0000
committerjimharris <jimharris@FreeBSD.org>2012-10-18 00:32:07 +0000
commitc070c3fe817d16552546a6954df85a4731b3e8be (patch)
tree4db66064fe7cf4ae165af763fcf230f22e61d0fc /sys/dev/nvme/nvme_qpair.c
parent20df59b294c348ddc1e7d3683cb6b3fdf7858f91 (diff)
downloadFreeBSD-src-c070c3fe817d16552546a6954df85a4731b3e8be.zip
FreeBSD-src-c070c3fe817d16552546a6954df85a4731b3e8be.tar.gz
Add return codes to all functions used for submitting commands to I/O
queues. Sponsored by: Intel
Diffstat (limited to 'sys/dev/nvme/nvme_qpair.c')
-rw-r--r--sys/dev/nvme/nvme_qpair.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 5ad1ea8..efe5055 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -84,10 +84,24 @@ nvme_qpair_allocate_tracker(struct nvme_qpair *qpair, boolean_t alloc_prp_list)
tr = SLIST_FIRST(&qpair->free_tr);
if (tr == NULL) {
- /* TODO: fail if malloc returns NULL */
+ /*
+ * We can't support more trackers than we have entries in
+ * our queue, because it would generate invalid indices
+ * into the qpair's active tracker array.
+ */
+ if (qpair->num_tr == qpair->num_entries) {
+ mtx_unlock(&qpair->lock);
+ return (NULL);
+ }
+
tr = malloc(sizeof(struct nvme_tracker), M_NVME,
M_ZERO | M_NOWAIT);
+ if (tr == NULL) {
+ mtx_unlock(&qpair->lock);
+ return (NULL);
+ }
+
bus_dmamap_create(qpair->dma_tag, 0, &tr->dma_map);
callout_init_mtx(&tr->timer, &qpair->lock, 0);
tr->cid = qpair->num_tr++;
OpenPOWER on IntegriCloud