Loading lib/nvme/nvme_pcie.c +31 −18 Original line number Diff line number Diff line Loading @@ -721,6 +721,9 @@ nvme_pcie_copy_command(struct spdk_nvme_cmd *dst, const struct spdk_nvme_cmd *sr #endif } /** * Note: the ctrlr_lock must be held when calling this function. */ static void nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req, struct spdk_nvme_cpl *cpl) Loading @@ -737,9 +740,6 @@ nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, assert(nvme_qpair_is_admin_queue(qpair)); assert(active_req->pid != getpid()); /* Acquire the recursive lock first if not held already. */ pthread_mutex_lock(&ctrlr->ctrlr_lock); TAILQ_FOREACH_SAFE(active_proc, &ctrlr->active_procs, tailq, tmp) { if (active_proc->pid == active_req->pid) { /* Saved the original completion information */ Loading @@ -751,8 +751,6 @@ nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, } } pthread_mutex_unlock(&ctrlr->ctrlr_lock); if (pending_on_proc == false) { SPDK_ERRLOG("The owning process is not found. Drop the request.\n"); Loading @@ -760,6 +758,9 @@ nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, } } /** * Note: the ctrlr_lock must be held when calling this function. */ static void nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) { Loading @@ -775,9 +776,6 @@ nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) */ assert(nvme_qpair_is_admin_queue(qpair)); /* Acquire the recursive lock if not held already */ pthread_mutex_lock(&ctrlr->ctrlr_lock); TAILQ_FOREACH(proc, &ctrlr->active_procs, tailq) { if (proc->pid == pid) { proc_found = true; Loading @@ -786,8 +784,6 @@ nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) } } pthread_mutex_unlock(&ctrlr->ctrlr_lock); if (proc_found == false) { SPDK_ERRLOG("the active process is not found for this controller."); assert(proc_found); Loading Loading @@ -1534,12 +1530,16 @@ int nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req) { struct nvme_tracker *tr; int rc; int rc = 0; struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr; struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); nvme_pcie_qpair_check_enabled(qpair); if (nvme_qpair_is_admin_queue(qpair)) { pthread_mutex_lock(&ctrlr->ctrlr_lock); } tr = LIST_FIRST(&pqpair->free_tr); if (tr == NULL || !pqpair->is_enabled) { Loading @@ -1553,7 +1553,7 @@ nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_reques * completed. */ STAILQ_INSERT_TAIL(&qpair->queued_req, req, stailq); return 0; goto exit; } LIST_REMOVE(tr, list); /* remove tr from free_tr */ Loading @@ -1579,11 +1579,17 @@ nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_reques } if (rc < 0) { return rc; goto exit; } nvme_pcie_qpair_submit_tracker(qpair, tr); return 0; exit: if (nvme_qpair_is_admin_queue(qpair)) { pthread_mutex_unlock(&ctrlr->ctrlr_lock); } return rc; } int32_t Loading @@ -1593,6 +1599,7 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ struct nvme_tracker *tr; struct spdk_nvme_cpl *cpl; uint32_t num_completions = 0; struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr; if (!nvme_pcie_qpair_check_enabled(qpair)) { /* Loading @@ -1604,6 +1611,10 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ return 0; } if (nvme_qpair_is_admin_queue(qpair)) { pthread_mutex_lock(&ctrlr->ctrlr_lock); } if (max_completions == 0 || (max_completions > (qpair->num_entries - 1U))) { /* Loading Loading @@ -1647,6 +1658,8 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ /* Before returning, complete any pending admin request. */ if (nvme_qpair_is_admin_queue(qpair)) { nvme_pcie_qpair_complete_pending_admin_request(qpair); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } return num_completions; Loading Loading
lib/nvme/nvme_pcie.c +31 −18 Original line number Diff line number Diff line Loading @@ -721,6 +721,9 @@ nvme_pcie_copy_command(struct spdk_nvme_cmd *dst, const struct spdk_nvme_cmd *sr #endif } /** * Note: the ctrlr_lock must be held when calling this function. */ static void nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req, struct spdk_nvme_cpl *cpl) Loading @@ -737,9 +740,6 @@ nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, assert(nvme_qpair_is_admin_queue(qpair)); assert(active_req->pid != getpid()); /* Acquire the recursive lock first if not held already. */ pthread_mutex_lock(&ctrlr->ctrlr_lock); TAILQ_FOREACH_SAFE(active_proc, &ctrlr->active_procs, tailq, tmp) { if (active_proc->pid == active_req->pid) { /* Saved the original completion information */ Loading @@ -751,8 +751,6 @@ nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, } } pthread_mutex_unlock(&ctrlr->ctrlr_lock); if (pending_on_proc == false) { SPDK_ERRLOG("The owning process is not found. Drop the request.\n"); Loading @@ -760,6 +758,9 @@ nvme_pcie_qpair_insert_pending_admin_request(struct spdk_nvme_qpair *qpair, } } /** * Note: the ctrlr_lock must be held when calling this function. */ static void nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) { Loading @@ -775,9 +776,6 @@ nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) */ assert(nvme_qpair_is_admin_queue(qpair)); /* Acquire the recursive lock if not held already */ pthread_mutex_lock(&ctrlr->ctrlr_lock); TAILQ_FOREACH(proc, &ctrlr->active_procs, tailq) { if (proc->pid == pid) { proc_found = true; Loading @@ -786,8 +784,6 @@ nvme_pcie_qpair_complete_pending_admin_request(struct spdk_nvme_qpair *qpair) } } pthread_mutex_unlock(&ctrlr->ctrlr_lock); if (proc_found == false) { SPDK_ERRLOG("the active process is not found for this controller."); assert(proc_found); Loading Loading @@ -1534,12 +1530,16 @@ int nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_request *req) { struct nvme_tracker *tr; int rc; int rc = 0; struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr; struct nvme_pcie_qpair *pqpair = nvme_pcie_qpair(qpair); nvme_pcie_qpair_check_enabled(qpair); if (nvme_qpair_is_admin_queue(qpair)) { pthread_mutex_lock(&ctrlr->ctrlr_lock); } tr = LIST_FIRST(&pqpair->free_tr); if (tr == NULL || !pqpair->is_enabled) { Loading @@ -1553,7 +1553,7 @@ nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_reques * completed. */ STAILQ_INSERT_TAIL(&qpair->queued_req, req, stailq); return 0; goto exit; } LIST_REMOVE(tr, list); /* remove tr from free_tr */ Loading @@ -1579,11 +1579,17 @@ nvme_pcie_qpair_submit_request(struct spdk_nvme_qpair *qpair, struct nvme_reques } if (rc < 0) { return rc; goto exit; } nvme_pcie_qpair_submit_tracker(qpair, tr); return 0; exit: if (nvme_qpair_is_admin_queue(qpair)) { pthread_mutex_unlock(&ctrlr->ctrlr_lock); } return rc; } int32_t Loading @@ -1593,6 +1599,7 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ struct nvme_tracker *tr; struct spdk_nvme_cpl *cpl; uint32_t num_completions = 0; struct spdk_nvme_ctrlr *ctrlr = qpair->ctrlr; if (!nvme_pcie_qpair_check_enabled(qpair)) { /* Loading @@ -1604,6 +1611,10 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ return 0; } if (nvme_qpair_is_admin_queue(qpair)) { pthread_mutex_lock(&ctrlr->ctrlr_lock); } if (max_completions == 0 || (max_completions > (qpair->num_entries - 1U))) { /* Loading Loading @@ -1647,6 +1658,8 @@ nvme_pcie_qpair_process_completions(struct spdk_nvme_qpair *qpair, uint32_t max_ /* Before returning, complete any pending admin request. */ if (nvme_qpair_is_admin_queue(qpair)) { nvme_pcie_qpair_complete_pending_admin_request(qpair); pthread_mutex_unlock(&ctrlr->ctrlr_lock); } return num_completions; Loading