Lines Matching defs:qp
28 struct nvmf_qpair *qp;
51 nvmf_allocate_request(struct nvmf_host_qpair *qp, void *sqe,
64 mtx_lock(&qp->lock);
65 nq = qp->qp;
67 mtx_unlock(&qp->lock);
71 qp->allocating++;
72 MPASS(qp->allocating != 0);
73 mtx_unlock(&qp->lock);
75 req->qp = qp;
84 mtx_lock(&qp->lock);
85 qp->allocating--;
86 if (qp->allocating == 0 && qp->shutting_down)
87 wakeup(qp);
88 mtx_unlock(&qp->lock);
114 nvmf_dispatch_command(struct nvmf_host_qpair *qp, struct nvmf_host_command *cmd)
116 struct nvmf_softc *sc = qp->sc;
122 mtx_assert(&qp->lock, MA_OWNED);
124 qp->submitted++;
131 new_sqtail = (qp->sqtail + 1) % (qp->num_commands + 1);
132 KASSERT(new_sqtail != qp->sqhd, ("%s: qp %p is full", __func__, qp));
133 qp->sqtail = new_sqtail;
134 mtx_unlock(&qp->lock);
160 struct nvmf_host_qpair *qp = arg;
161 struct nvmf_softc *sc = qp->sc;
166 qp->name);
173 struct nvmf_host_qpair *qp = arg;
174 struct nvmf_softc *sc = qp->sc;
191 if (cid > qp->num_commands) {
200 mtx_lock(&qp->lock);
201 if (qp->sq_flow_control) {
203 qp->sqhd = le16toh(cqe->sqhd);
209 qp->sqhd = (qp->sqhd + 1) % (qp->num_commands + 1);
216 if (qp->qp == NULL) {
219 qp->name);
220 mtx_unlock(&qp->lock);
225 cmd = qp->active_commands[cid];
227 mtx_unlock(&qp->lock);
239 if (STAILQ_EMPTY(&qp->pending_requests)) {
240 qp->active_commands[cid] = NULL;
241 TAILQ_INSERT_TAIL(&qp->free_commands, cmd, link);
242 mtx_unlock(&qp->lock);
244 cmd->req = STAILQ_FIRST(&qp->pending_requests);
245 STAILQ_REMOVE_HEAD(&qp->pending_requests, link);
246 nvmf_dispatch_command(qp, cmd);
255 nvmf_sysctls_qp(struct nvmf_softc *sc, struct nvmf_host_qpair *qp,
258 struct sysctl_ctx_list *ctx = &qp->sysctl_ctx;
275 NULL, qp->num_commands + 1, "Number of entries in queue");
276 SYSCTL_ADD_U16(ctx, list, OID_AUTO, "sq_head", CTLFLAG_RD, &qp->sqhd,
278 SYSCTL_ADD_U16(ctx, list, OID_AUTO, "sq_tail", CTLFLAG_RD, &qp->sqtail,
281 &qp->submitted, 0, "Number of commands submitted");
289 struct nvmf_host_qpair *qp;
294 qp = malloc(sizeof(*qp), M_NVMF, M_WAITOK | M_ZERO);
295 qp->sc = sc;
296 qp->sq_flow_control = nvlist_get_bool(nvl, "sq_flow_control");
297 qp->sqhd = nvlist_get_number(nvl, "sqhd");
298 qp->sqtail = nvlist_get_number(nvl, "sqtail");
299 strlcpy(qp->name, name, sizeof(qp->name));
300 mtx_init(&qp->lock, "nvmf qp", NULL, MTX_DEF);
301 (void)sysctl_ctx_init(&qp->sysctl_ctx);
307 qp->num_commands = nvlist_get_number(nvl, "qsize") - 1;
309 qp->num_commands += sc->num_aer;
311 qp->active_commands = malloc(sizeof(*qp->active_commands) *
312 qp->num_commands, M_NVMF, M_WAITOK | M_ZERO);
313 TAILQ_INIT(&qp->free_commands);
314 for (i = 0; i < qp->num_commands; i++) {
317 TAILQ_INSERT_TAIL(&qp->free_commands, cmd, link);
319 STAILQ_INIT(&qp->pending_requests);
321 qp->qp = nvmf_allocate_qpair(trtype, false, nvl, nvmf_qp_error, qp,
322 nvmf_receive_capsule, qp);
323 if (qp->qp == NULL) {
324 (void)sysctl_ctx_free(&qp->sysctl_ctx);
325 TAILQ_FOREACH_SAFE(cmd, &qp->free_commands, link, ncmd) {
326 TAILQ_REMOVE(&qp->free_commands, cmd, link);
329 free(qp->active_commands, M_NVMF);
330 mtx_destroy(&qp->lock);
331 free(qp, M_NVMF);
335 nvmf_sysctls_qp(sc, qp, admin, qid);
337 return (qp);
341 nvmf_shutdown_qp(struct nvmf_host_qpair *qp)
347 mtx_lock(&qp->lock);
348 nq = qp->qp;
349 qp->qp = NULL;
352 while (qp->shutting_down)
353 mtx_sleep(qp, &qp->lock, 0, "nvmfqpsh", 0);
354 mtx_unlock(&qp->lock);
357 qp->shutting_down = true;
358 while (qp->allocating != 0)
359 mtx_sleep(qp, &qp->lock, 0, "nvmfqpqu", 0);
360 mtx_unlock(&qp->lock);
371 for (u_int i = 0; i < qp->num_commands; i++) {
372 cmd = qp->active_commands[i];
385 while (!STAILQ_EMPTY(&qp->pending_requests)) {
386 req = STAILQ_FIRST(&qp->pending_requests);
387 STAILQ_REMOVE_HEAD(&qp->pending_requests, link);
396 mtx_lock(&qp->lock);
397 qp->shutting_down = false;
398 mtx_unlock(&qp->lock);
399 wakeup(qp);
403 nvmf_destroy_qp(struct nvmf_host_qpair *qp)
407 nvmf_shutdown_qp(qp);
408 (void)sysctl_ctx_free(&qp->sysctl_ctx);
410 TAILQ_FOREACH_SAFE(cmd, &qp->free_commands, link, ncmd) {
411 TAILQ_REMOVE(&qp->free_commands, cmd, link);
414 free(qp->active_commands, M_NVMF);
415 mtx_destroy(&qp->lock);
416 free(qp, M_NVMF);
422 struct nvmf_host_qpair *qp;
425 qp = req->qp;
426 mtx_lock(&qp->lock);
427 if (qp->qp == NULL) {
428 mtx_unlock(&qp->lock);
435 cmd = TAILQ_FIRST(&qp->free_commands);
441 STAILQ_INSERT_TAIL(&qp->pending_requests, req, link);
442 mtx_unlock(&qp->lock);
446 TAILQ_REMOVE(&qp->free_commands, cmd, link);
447 KASSERT(qp->active_commands[cmd->cid] == NULL,
449 qp->active_commands[cmd->cid] = cmd;
451 nvmf_dispatch_command(qp, cmd);