nvmf/vfio-user: cleanup ctrlr enable/disable
Refactor controller reset a little bit for cleaner code. Co-authored-by: John Levon <john.levon@nutanix.com> Signed-off-by: John Levon <john.levon@nutanix.com> Change-Id: I2b3323005d4e788ffe980d41c349702828886981 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/11786 Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com> Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
eb0305e0e6
commit
797df3717e
@ -1785,41 +1785,6 @@ handle_sq_tdbl_write(struct nvmf_vfio_user_ctrlr *ctrlr, const uint32_t new_tail
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
enable_admin_queue(struct nvmf_vfio_user_ctrlr *ctrlr)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
assert(ctrlr != NULL);
|
|
||||||
|
|
||||||
err = acq_setup(ctrlr);
|
|
||||||
if (err != 0) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = asq_setup(ctrlr);
|
|
||||||
if (err != 0) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
disable_admin_queue(struct nvmf_vfio_user_ctrlr *ctrlr)
|
|
||||||
{
|
|
||||||
assert(ctrlr->sqs[0] != NULL);
|
|
||||||
assert(ctrlr->cqs[0] != NULL);
|
|
||||||
|
|
||||||
unmap_q(ctrlr, &ctrlr->sqs[0]->mapping);
|
|
||||||
unmap_q(ctrlr, &ctrlr->cqs[0]->mapping);
|
|
||||||
|
|
||||||
ctrlr->sqs[0]->size = 0;
|
|
||||||
*sq_headp(ctrlr->sqs[0]) = 0;
|
|
||||||
ctrlr->cqs[0]->size = 0;
|
|
||||||
*cq_dbl_headp(ctrlr, ctrlr->cqs[0]) = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
memory_region_add_cb(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
|
memory_region_add_cb(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
|
||||||
{
|
{
|
||||||
@ -1957,6 +1922,62 @@ memory_region_remove_cb(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Used to initiate a controller-level reset or a controller shutdown. */
|
||||||
|
static void
|
||||||
|
disable_ctrlr(struct nvmf_vfio_user_ctrlr *vu_ctrlr)
|
||||||
|
{
|
||||||
|
SPDK_DEBUGLOG(nvmf_vfio, "%s: disabling controller\n",
|
||||||
|
ctrlr_id(vu_ctrlr));
|
||||||
|
|
||||||
|
/* Unmap Admin queue. */
|
||||||
|
|
||||||
|
assert(vu_ctrlr->sqs[0] != NULL);
|
||||||
|
assert(vu_ctrlr->cqs[0] != NULL);
|
||||||
|
|
||||||
|
unmap_q(vu_ctrlr, &vu_ctrlr->sqs[0]->mapping);
|
||||||
|
unmap_q(vu_ctrlr, &vu_ctrlr->cqs[0]->mapping);
|
||||||
|
|
||||||
|
vu_ctrlr->sqs[0]->size = 0;
|
||||||
|
*sq_headp(vu_ctrlr->sqs[0]) = 0;
|
||||||
|
|
||||||
|
vu_ctrlr->sqs[0]->sq_state = VFIO_USER_SQ_INACTIVE;
|
||||||
|
|
||||||
|
vu_ctrlr->cqs[0]->size = 0;
|
||||||
|
*cq_tailp(vu_ctrlr->cqs[0]) = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For PCIe controller reset or shutdown, we will drop all AER
|
||||||
|
* responses.
|
||||||
|
*/
|
||||||
|
nvmf_ctrlr_abort_aer(vu_ctrlr->ctrlr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used to re-enable the controller after a controller-level reset. */
|
||||||
|
static int
|
||||||
|
enable_ctrlr(struct nvmf_vfio_user_ctrlr *vu_ctrlr)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
assert(vu_ctrlr != NULL);
|
||||||
|
|
||||||
|
SPDK_DEBUGLOG(nvmf_vfio, "%s: enabling controller\n",
|
||||||
|
ctrlr_id(vu_ctrlr));
|
||||||
|
|
||||||
|
err = acq_setup(vu_ctrlr);
|
||||||
|
if (err != 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = asq_setup(vu_ctrlr);
|
||||||
|
if (err != 0) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
vu_ctrlr->sqs[0]->sq_state = VFIO_USER_SQ_ACTIVE;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nvmf_vfio_user_prop_req_rsp(struct nvmf_vfio_user_req *req, void *cb_arg)
|
nvmf_vfio_user_prop_req_rsp(struct nvmf_vfio_user_req *req, void *cb_arg)
|
||||||
{
|
{
|
||||||
@ -1987,13 +2008,11 @@ nvmf_vfio_user_prop_req_rsp(struct nvmf_vfio_user_req *req, void *cb_arg)
|
|||||||
|
|
||||||
if (diff.bits.en) {
|
if (diff.bits.en) {
|
||||||
if (cc.bits.en) {
|
if (cc.bits.en) {
|
||||||
SPDK_DEBUGLOG(nvmf_vfio, "%s: MAP Admin queue\n", ctrlr_id(vu_ctrlr));
|
ret = enable_ctrlr(vu_ctrlr);
|
||||||
ret = enable_admin_queue(vu_ctrlr);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
SPDK_ERRLOG("%s: failed to map Admin queue\n", ctrlr_id(vu_ctrlr));
|
SPDK_ERRLOG("%s: failed to enable ctrlr\n", ctrlr_id(vu_ctrlr));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
sq->sq_state = VFIO_USER_SQ_ACTIVE;
|
|
||||||
vu_ctrlr->reset_shn = false;
|
vu_ctrlr->reset_shn = false;
|
||||||
} else {
|
} else {
|
||||||
vu_ctrlr->reset_shn = true;
|
vu_ctrlr->reset_shn = true;
|
||||||
@ -2007,13 +2026,7 @@ nvmf_vfio_user_prop_req_rsp(struct nvmf_vfio_user_req *req, void *cb_arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (vu_ctrlr->reset_shn) {
|
if (vu_ctrlr->reset_shn) {
|
||||||
SPDK_DEBUGLOG(nvmf_vfio,
|
disable_ctrlr(vu_ctrlr);
|
||||||
"%s: UNMAP Admin queue\n",
|
|
||||||
ctrlr_id(vu_ctrlr));
|
|
||||||
sq->sq_state = VFIO_USER_SQ_INACTIVE;
|
|
||||||
disable_admin_queue(vu_ctrlr);
|
|
||||||
/* For PCIe controller reset or shutdown, we will drop all AER responses */
|
|
||||||
nvmf_ctrlr_abort_aer(vu_ctrlr->ctrlr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user