Lines Matching refs:qp
26 struct nvmf_qpair *qp; member
44 static int _nvmft_send_generic_error(struct nvmft_qpair *qp,
51 struct nvmft_qpair *qp = arg; in nvmft_qpair_error() local
52 struct nvmft_controller *ctrlr = qp->ctrlr; in nvmft_qpair_error()
63 nvmft_printf(ctrlr, "error %d on %s\n", error, qp->name); in nvmft_qpair_error()
64 nvmft_controller_error(ctrlr, qp, error); in nvmft_qpair_error()
70 struct nvmft_qpair *qp = arg; in nvmft_receive_capsule() local
71 struct nvmft_controller *ctrlr = qp->ctrlr; in nvmft_receive_capsule()
78 qp->name, le16toh(cmd->cid), cmd->opc); in nvmft_receive_capsule()
85 _nvmft_send_generic_error(qp, nc, sc_status); in nvmft_receive_capsule()
91 if (BIT_TEST_SET_ATOMIC(NUM_CIDS, cmd->cid, qp->cids)) { in nvmft_receive_capsule()
92 _nvmft_send_generic_error(qp, nc, NVME_SC_COMMAND_ID_CONFLICT); in nvmft_receive_capsule()
97 if (qp->admin) in nvmft_receive_capsule()
100 nvmft_handle_io_command(qp, qp->qid, nc); in nvmft_receive_capsule()
107 struct nvmft_qpair *qp; in nvmft_qpair_init() local
109 qp = malloc(sizeof(*qp), M_NVMFT, M_WAITOK | M_ZERO); in nvmft_qpair_init()
110 qp->admin = nvlist_get_bool(params, "admin"); in nvmft_qpair_init()
111 qp->sq_flow_control = nvlist_get_bool(params, "sq_flow_control"); in nvmft_qpair_init()
112 qp->qsize = nvlist_get_number(params, "qsize"); in nvmft_qpair_init()
113 qp->qid = qid; in nvmft_qpair_init()
114 qp->sqhd = nvlist_get_number(params, "sqhd"); in nvmft_qpair_init()
115 strlcpy(qp->name, name, sizeof(qp->name)); in nvmft_qpair_init()
116 mtx_init(&qp->lock, "nvmft qp", NULL, MTX_DEF); in nvmft_qpair_init()
117 qp->cids = BITSET_ALLOC(NUM_CIDS, M_NVMFT, M_WAITOK | M_ZERO); in nvmft_qpair_init()
118 STAILQ_INIT(&qp->datamove_queue); in nvmft_qpair_init()
119 TASK_INIT(&qp->datamove_task, 0, nvmft_datamove_task, qp); in nvmft_qpair_init()
121 qp->qp = nvmf_allocate_qpair(trtype, true, params, nvmft_qpair_error, in nvmft_qpair_init()
122 qp, nvmft_receive_capsule, qp); in nvmft_qpair_init()
123 if (qp->qp == NULL) { in nvmft_qpair_init()
124 mtx_destroy(&qp->lock); in nvmft_qpair_init()
125 free(qp->cids, M_NVMFT); in nvmft_qpair_init()
126 free(qp, M_NVMFT); in nvmft_qpair_init()
130 refcount_init(&qp->qp_refs, 1); in nvmft_qpair_init()
131 return (qp); in nvmft_qpair_init()
135 nvmft_qpair_shutdown(struct nvmft_qpair *qp) in nvmft_qpair_shutdown() argument
142 mtx_lock(&qp->lock); in nvmft_qpair_shutdown()
143 nq = qp->qp; in nvmft_qpair_shutdown()
144 qp->qp = NULL; in nvmft_qpair_shutdown()
145 STAILQ_CONCAT(&datamove_queue, &qp->datamove_queue); in nvmft_qpair_shutdown()
146 mtx_unlock(&qp->lock); in nvmft_qpair_shutdown()
147 if (nq != NULL && refcount_release(&qp->qp_refs)) in nvmft_qpair_shutdown()
155 nvmft_drain_task(&qp->datamove_task); in nvmft_qpair_shutdown()
159 nvmft_qpair_destroy(struct nvmft_qpair *qp) in nvmft_qpair_destroy() argument
161 nvmft_qpair_shutdown(qp); in nvmft_qpair_destroy()
162 mtx_destroy(&qp->lock); in nvmft_qpair_destroy()
163 free(qp->cids, M_NVMFT); in nvmft_qpair_destroy()
164 free(qp, M_NVMFT); in nvmft_qpair_destroy()
168 nvmft_qpair_ctrlr(struct nvmft_qpair *qp) in nvmft_qpair_ctrlr() argument
170 return (qp->ctrlr); in nvmft_qpair_ctrlr()
174 nvmft_qpair_id(struct nvmft_qpair *qp) in nvmft_qpair_id() argument
176 return (qp->qid); in nvmft_qpair_id()
180 nvmft_qpair_name(struct nvmft_qpair *qp) in nvmft_qpair_name() argument
182 return (qp->name); in nvmft_qpair_name()
186 _nvmft_send_response(struct nvmft_qpair *qp, const void *cqe) in _nvmft_send_response() argument
194 mtx_lock(&qp->lock); in _nvmft_send_response()
195 nq = qp->qp; in _nvmft_send_response()
197 mtx_unlock(&qp->lock); in _nvmft_send_response()
200 refcount_acquire(&qp->qp_refs); in _nvmft_send_response()
203 if (qp->sq_flow_control) { in _nvmft_send_response()
204 qp->sqhd = (qp->sqhd + 1) % qp->qsize; in _nvmft_send_response()
205 cpl.sqhd = htole16(qp->sqhd); in _nvmft_send_response()
208 mtx_unlock(&qp->lock); in _nvmft_send_response()
214 if (refcount_release(&qp->qp_refs)) in _nvmft_send_response()
220 nvmft_command_completed(struct nvmft_qpair *qp, struct nvmf_capsule *nc) in nvmft_command_completed() argument
225 KASSERT(BIT_ISSET(NUM_CIDS, cmd->cid, qp->cids), in nvmft_command_completed()
228 BIT_CLR_ATOMIC(NUM_CIDS, cmd->cid, qp->cids); in nvmft_command_completed()
232 nvmft_send_response(struct nvmft_qpair *qp, const void *cqe) in nvmft_send_response() argument
237 KASSERT(BIT_ISSET(NUM_CIDS, cpl->cid, qp->cids), in nvmft_send_response()
240 BIT_CLR_ATOMIC(NUM_CIDS, cpl->cid, qp->cids); in nvmft_send_response()
241 return (_nvmft_send_response(qp, cqe)); in nvmft_send_response()
256 nvmft_send_error(struct nvmft_qpair *qp, struct nvmf_capsule *nc, in nvmft_send_error() argument
265 return (nvmft_send_response(qp, &cpl)); in nvmft_send_error()
269 nvmft_send_generic_error(struct nvmft_qpair *qp, struct nvmf_capsule *nc, in nvmft_send_generic_error() argument
272 return (nvmft_send_error(qp, nc, NVME_SCT_GENERIC, sc_status)); in nvmft_send_generic_error()
280 _nvmft_send_generic_error(struct nvmft_qpair *qp, struct nvmf_capsule *nc, in _nvmft_send_generic_error() argument
289 return (_nvmft_send_response(qp, &cpl)); in _nvmft_send_generic_error()
293 nvmft_send_success(struct nvmft_qpair *qp, struct nvmf_capsule *nc) in nvmft_send_success() argument
295 return (nvmft_send_generic_error(qp, nc, NVME_SC_SUCCESS)); in nvmft_send_success()
308 nvmft_send_connect_response(struct nvmft_qpair *qp, in nvmft_send_connect_response() argument
315 mtx_lock(&qp->lock); in nvmft_send_connect_response()
316 nq = qp->qp; in nvmft_send_connect_response()
318 mtx_unlock(&qp->lock); in nvmft_send_connect_response()
321 refcount_acquire(&qp->qp_refs); in nvmft_send_connect_response()
322 mtx_unlock(&qp->lock); in nvmft_send_connect_response()
324 rc = nvmf_allocate_response(qp->qp, rsp, M_WAITOK); in nvmft_send_connect_response()
328 if (refcount_release(&qp->qp_refs)) in nvmft_send_connect_response()
334 nvmft_connect_error(struct nvmft_qpair *qp, in nvmft_connect_error() argument
344 nvmft_send_connect_response(qp, &rsp); in nvmft_connect_error()
348 nvmft_connect_invalid_parameters(struct nvmft_qpair *qp, in nvmft_connect_invalid_parameters() argument
358 nvmft_send_connect_response(qp, &rsp); in nvmft_connect_invalid_parameters()
362 nvmft_finish_accept(struct nvmft_qpair *qp, in nvmft_finish_accept() argument
367 qp->ctrlr = ctrlr; in nvmft_finish_accept()
369 if (qp->sq_flow_control) in nvmft_finish_accept()
370 rsp.sqhd = htole16(qp->sqhd); in nvmft_finish_accept()
374 return (nvmft_send_connect_response(qp, &rsp)); in nvmft_finish_accept()
378 nvmft_qpair_datamove(struct nvmft_qpair *qp, union ctl_io *io) in nvmft_qpair_datamove() argument
382 mtx_lock(&qp->lock); in nvmft_qpair_datamove()
383 if (qp->qp == NULL) { in nvmft_qpair_datamove()
384 mtx_unlock(&qp->lock); in nvmft_qpair_datamove()
388 enqueue_task = STAILQ_EMPTY(&qp->datamove_queue); in nvmft_qpair_datamove()
389 STAILQ_INSERT_TAIL(&qp->datamove_queue, &io->io_hdr, links); in nvmft_qpair_datamove()
390 mtx_unlock(&qp->lock); in nvmft_qpair_datamove()
392 nvmft_enqueue_task(&qp->datamove_task); in nvmft_qpair_datamove()
398 struct nvmft_qpair *qp = context; in nvmft_datamove_task() local
402 mtx_lock(&qp->lock); in nvmft_datamove_task()
403 while (!STAILQ_EMPTY(&qp->datamove_queue)) { in nvmft_datamove_task()
404 io = (union ctl_io *)STAILQ_FIRST(&qp->datamove_queue); in nvmft_datamove_task()
405 STAILQ_REMOVE_HEAD(&qp->datamove_queue, links); in nvmft_datamove_task()
406 abort = (qp->qp == NULL); in nvmft_datamove_task()
407 mtx_unlock(&qp->lock); in nvmft_datamove_task()
412 mtx_lock(&qp->lock); in nvmft_datamove_task()
414 mtx_unlock(&qp->lock); in nvmft_datamove_task()