Lines Matching refs:qpair
31 struct spdk_nvmf_qpair *qpair;
38 * In order to do this sequentially without overlap, we must provide a context to recover the next qpair from
39 * to enable calling nvmf_qpair_disconnect on the next desired qpair.
139 nvmf_qpair_set_state(struct spdk_nvmf_qpair *qpair,
142 assert(qpair != NULL);
143 assert(qpair->group->thread == spdk_get_thread());
145 qpair->state = state;
289 struct spdk_nvmf_qpair *qpair, *qpair_tmp;
295 TAILQ_FOREACH_SAFE(qpair, &group->qpairs, link, qpair_tmp) {
296 rc = spdk_nvmf_qpair_disconnect(qpair);
1115 struct spdk_nvmf_qpair *qpair;
1123 struct spdk_nvmf_qpair *qpair = ctx->qpair;
1128 if (spdk_nvmf_poll_group_add(group, qpair) != 0) {
1129 SPDK_ERRLOG("Unable to add the qpair to a poll group.\n");
1131 assert(qpair->state == SPDK_NVMF_QPAIR_UNINITIALIZED);
1137 spdk_nvmf_qpair_disconnect(qpair);
1142 spdk_nvmf_tgt_new_qpair(struct spdk_nvmf_tgt *tgt, struct spdk_nvmf_qpair *qpair)
1147 group = spdk_nvmf_get_optimal_poll_group(qpair);
1153 spdk_nvmf_qpair_disconnect(qpair);
1164 spdk_nvmf_qpair_disconnect(qpair);
1168 ctx->qpair = qpair;
1207 struct spdk_nvmf_qpair *qpair)
1212 TAILQ_INIT(&qpair->outstanding);
1213 qpair->group = group;
1214 qpair->ctrlr = NULL;
1215 qpair->disconnect_started = false;
1217 tgroup = nvmf_get_transport_poll_group(group, qpair->transport);
1222 rc = nvmf_transport_poll_group_add(tgroup, qpair);
1224 /* We add the qpair to the group only it is successfully added into the tgroup */
1226 SPDK_DTRACE_PROBE2_TICKS(nvmf_poll_group_add_qpair, qpair, spdk_thread_get_id(group->thread));
1227 TAILQ_INSERT_TAIL(&group->qpairs, qpair, link);
1228 nvmf_qpair_set_state(qpair, SPDK_NVMF_QPAIR_CONNECTING);
1254 SPDK_DEBUGLOG(nvmf, "Last qpair %u, destroy ctrlr 0x%hx\n", qpair_ctx->qid, ctrlr->cntlid);
1272 /* Admin qpair is removed, so set the pointer to NULL.
1273 * This operation is safe since we are on ctrlr thread now, admin qpair's thread is the same
1278 /* Free qpair id from controller's bit mask and destroy the controller if it is the last qpair */
1290 spdk_nvmf_poll_group_remove(struct spdk_nvmf_qpair *qpair)
1295 SPDK_DTRACE_PROBE2_TICKS(nvmf_poll_group_remove_qpair, qpair,
1296 spdk_thread_get_id(qpair->group->thread));
1297 nvmf_qpair_set_state(qpair, SPDK_NVMF_QPAIR_ERROR);
1299 /* Find the tgroup and remove the qpair from the tgroup */
1300 tgroup = nvmf_get_transport_poll_group(qpair->group, qpair->transport);
1302 rc = nvmf_transport_poll_group_remove(tgroup, qpair);
1304 SPDK_ERRLOG("Cannot remove qpair=%p from transport group=%p\n",
1305 qpair, tgroup);
1309 TAILQ_REMOVE(&qpair->group->qpairs, qpair, link);
1310 qpair->group = NULL;
1315 const struct spdk_nvmf_qpair *qpair)
1319 if (req->qpair == qpair) {
1332 struct spdk_nvmf_qpair *qpair = qpair_ctx->qpair;
1333 struct spdk_nvmf_ctrlr *ctrlr = qpair->ctrlr;
1337 assert(qpair->state == SPDK_NVMF_QPAIR_DEACTIVATING);
1338 qpair_ctx->qid = qpair->qid;
1340 if (qpair->connect_received) {
1341 if (0 == qpair->qid) {
1342 assert(qpair->group->stat.current_admin_qpairs > 0);
1343 qpair->group->stat.current_admin_qpairs--;
1345 assert(qpair->group->stat.current_io_qpairs > 0);
1346 qpair->group->stat.current_io_qpairs--;
1349 pthread_mutex_lock(&qpair->group->mutex);
1350 assert(qpair->group->current_unassociated_qpairs > 0);
1351 qpair->group->current_unassociated_qpairs--;
1352 pthread_mutex_unlock(&qpair->group->mutex);
1356 sgroup = &qpair->group->sgroups[ctrlr->subsys->id];
1357 _nvmf_qpair_sgroup_req_clean(sgroup, qpair);
1359 for (sid = 0; sid < qpair->group->num_sgroups; sid++) {
1360 sgroup = &qpair->group->sgroups[sid];
1362 _nvmf_qpair_sgroup_req_clean(sgroup, qpair);
1366 nvmf_qpair_auth_destroy(qpair);
1368 spdk_nvmf_poll_group_remove(qpair);
1369 nvmf_transport_qpair_fini(qpair, _nvmf_transport_qpair_fini_complete, qpair_ctx);
1377 spdk_nvmf_qpair_disconnect(qpair_ctx->qpair);
1382 spdk_nvmf_qpair_disconnect(struct spdk_nvmf_qpair *qpair)
1384 struct spdk_nvmf_poll_group *group = qpair->group;
1387 if (__atomic_test_and_set(&qpair->disconnect_started, __ATOMIC_RELAXED)) {
1391 /* If we get a qpair in the uninitialized state, we can just destroy it immediately */
1392 if (qpair->state == SPDK_NVMF_QPAIR_UNINITIALIZED) {
1393 nvmf_transport_qpair_fini(qpair, NULL, NULL);
1400 __atomic_clear(&qpair->disconnect_started, __ATOMIC_RELAXED);
1406 qpair_ctx->qpair = qpair;
1411 SPDK_DTRACE_PROBE2_TICKS(nvmf_qpair_disconnect, qpair, spdk_thread_get_id(group->thread));
1412 assert(spdk_nvmf_qpair_is_active(qpair));
1413 nvmf_qpair_set_state(qpair, SPDK_NVMF_QPAIR_DEACTIVATING);
1421 qpair_ctx->qpair = qpair;
1424 if (!TAILQ_EMPTY(&qpair->outstanding)) {
1425 SPDK_DTRACE_PROBE2_TICKS(nvmf_poll_group_drain_qpair, qpair, spdk_thread_get_id(group->thread));
1426 qpair->state_cb = _nvmf_qpair_destroy;
1427 qpair->state_cb_arg = qpair_ctx;
1428 nvmf_qpair_abort_pending_zcopy_reqs(qpair);
1429 nvmf_qpair_free_aer(qpair);
1439 spdk_nvmf_qpair_get_peer_trid(struct spdk_nvmf_qpair *qpair,
1443 return nvmf_transport_qpair_get_peer_trid(qpair, trid);
1447 spdk_nvmf_qpair_get_local_trid(struct spdk_nvmf_qpair *qpair,
1451 return nvmf_transport_qpair_get_local_trid(qpair, trid);
1455 spdk_nvmf_qpair_get_listen_trid(struct spdk_nvmf_qpair *qpair,
1459 return nvmf_transport_qpair_get_listen_trid(qpair, trid);
1688 struct spdk_nvmf_qpair *qpair, *qpair_tmp;
1698 TAILQ_FOREACH_SAFE(qpair, &group->qpairs, link, qpair_tmp) {
1699 if ((qpair->ctrlr != NULL) && (qpair->ctrlr->subsys == subsystem)) {
1701 rc = spdk_nvmf_qpair_disconnect(qpair);
1876 spdk_nvmf_get_optimal_poll_group(struct spdk_nvmf_qpair *qpair)
1880 tgroup = nvmf_transport_get_optimal_poll_group(qpair->transport, qpair);