Commit 91eb10b4 authored by Changpeng Liu's avatar Changpeng Liu Committed by Jim Harris
Browse files

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: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13696


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarDong Yi <dongx.yi@intel.com>
parent 6212597b
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -2918,6 +2918,13 @@ struct ctrlr_quiesce_ctx {

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
_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
		 * VFIO_USER_CTRLR_RUNNING state.
		 */
		if (in_interrupt_mode(endpoint->transport)) {
			ctrlr_kick(vu_ctrlr);
		}
		return;
	}

@@ -4549,13 +4558,6 @@ nvmf_vfio_user_poll_group_create(struct spdk_nvmf_transport *transport,
	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 *
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.
	 */
	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);