nvmf/vfio-user: only kick controller when in interrupt mode
There is a race condition if we call this function in the polling mode when running with multi-cores, same as other places where the function is called, we only kick controller in interrupt mode, also in `vfio_user_ctrlr_intr`, `ctrlr->sqs[0]` may be set to NULL after the controller poll call, so return earlier for this case. Change-Id: I03a7b74a39c966a2b8be610bca0e492d902f6b08 Signed-off-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13696 Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Dong Yi <dongx.yi@intel.com>
This commit is contained in:
parent
6212597bda
commit
91eb10b4be
@ -2918,6 +2918,13 @@ struct ctrlr_quiesce_ctx {
|
|||||||
|
|
||||||
static void ctrlr_quiesce(struct nvmf_vfio_user_ctrlr *vu_ctrlr);
|
static void ctrlr_quiesce(struct nvmf_vfio_user_ctrlr *vu_ctrlr);
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
in_interrupt_mode(struct nvmf_vfio_user_transport *vu_transport)
|
||||||
|
{
|
||||||
|
return spdk_interrupt_mode_is_enabled() &&
|
||||||
|
vu_transport->intr_mode_supported;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_vfio_user_endpoint_resume_done_msg(void *ctx)
|
_vfio_user_endpoint_resume_done_msg(void *ctx)
|
||||||
{
|
{
|
||||||
@ -2938,7 +2945,9 @@ _vfio_user_endpoint_resume_done_msg(void *ctx)
|
|||||||
* kick ourselves so we'll definitely check again while in
|
* kick ourselves so we'll definitely check again while in
|
||||||
* VFIO_USER_CTRLR_RUNNING state.
|
* VFIO_USER_CTRLR_RUNNING state.
|
||||||
*/
|
*/
|
||||||
ctrlr_kick(vu_ctrlr);
|
if (in_interrupt_mode(endpoint->transport)) {
|
||||||
|
ctrlr_kick(vu_ctrlr);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4549,13 +4558,6 @@ nvmf_vfio_user_poll_group_create(struct spdk_nvmf_transport *transport,
|
|||||||
return &vu_group->group;
|
return &vu_group->group;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
in_interrupt_mode(struct nvmf_vfio_user_transport *vu_transport)
|
|
||||||
{
|
|
||||||
return spdk_interrupt_mode_is_enabled() &&
|
|
||||||
vu_transport->intr_mode_supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct spdk_nvmf_transport_poll_group *
|
static struct spdk_nvmf_transport_poll_group *
|
||||||
nvmf_vfio_user_get_optimal_poll_group(struct spdk_nvmf_qpair *qpair)
|
nvmf_vfio_user_get_optimal_poll_group(struct spdk_nvmf_qpair *qpair)
|
||||||
{
|
{
|
||||||
@ -4765,6 +4767,12 @@ vfio_user_ctrlr_intr(void *ctx)
|
|||||||
* Poll vfio-user for this controller.
|
* Poll vfio-user for this controller.
|
||||||
*/
|
*/
|
||||||
ret = vfio_user_poll_vfu_ctx(ctrlr);
|
ret = vfio_user_poll_vfu_ctx(ctrlr);
|
||||||
|
/* `sqs[0]` could be set to NULL in vfio_user_poll_vfu_ctx() context, just return
|
||||||
|
* for this case.
|
||||||
|
*/
|
||||||
|
if (ctrlr->sqs[0] == NULL) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
vu_group = ctrlr_to_poll_group(ctrlr);
|
vu_group = ctrlr_to_poll_group(ctrlr);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user