Commit 8689f6a3 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

nvmf: do not start ctrlr destruct if disconnect in progress



A ctrlr disconnect (due to EN=0 or SHN) results in
async operations that we need to make sure don't
complete after the associated controller has been
destructed.  So make sure we do not start the ctrlr
destruct if a disconnect is in progress.  We can
basically just continue to send the destruct message
to itself over and over again until the disconnect
has finished.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: Id722ad206c0dde26ee013dfd98815af3901a9cac
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6057


Community-CI: Broadcom CI
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatar <dongx.yi@intel.com>
parent 3f2d21a0
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -330,6 +330,7 @@ nvmf_ctrlr_create(struct spdk_nvmf_subsystem *subsystem,
	TAILQ_INIT(&ctrlr->log_head);
	ctrlr->subsys = subsystem;
	ctrlr->thread = req->qpair->group->thread;
	ctrlr->disconnect_in_progress = false;

	transport = req->qpair->transport;
	ctrlr->qpair_mask = spdk_bit_array_create(transport->opts.max_qpairs_per_ctrlr);
@@ -455,6 +456,12 @@ _nvmf_ctrlr_destruct(void *ctx)
	struct spdk_nvmf_reservation_log *log, *log_tmp;
	struct spdk_nvmf_async_event_completion *event, *event_tmp;

	if (ctrlr->disconnect_in_progress) {
		SPDK_ERRLOG("freeing ctrlr with disconnect in progress\n");
		spdk_thread_send_msg(ctrlr->thread, _nvmf_ctrlr_destruct, ctrlr);
		return;
	}

	nvmf_ctrlr_stop_keep_alive_timer(ctrlr);
	nvmf_ctrlr_stop_association_timer(ctrlr);
	spdk_bit_array_free(&ctrlr->qpair_mask);
@@ -853,6 +860,7 @@ nvmf_ctrlr_cc_shn_done(struct spdk_io_channel_iter *i, int status)
	}
	ctrlr->association_timer = SPDK_POLLER_REGISTER(nvmf_ctrlr_association_remove, ctrlr,
				   ctrlr->association_timeout * 1000);
	ctrlr->disconnect_in_progress = false;
}

static void
@@ -877,6 +885,7 @@ nvmf_ctrlr_cc_reset_done(struct spdk_io_channel_iter *i, int status)
	}
	ctrlr->association_timer = SPDK_POLLER_REGISTER(nvmf_ctrlr_association_remove, ctrlr,
				   ctrlr->association_timeout * 1000);
	ctrlr->disconnect_in_progress = false;
}

const struct spdk_nvmf_registers *
@@ -929,6 +938,7 @@ nvmf_prop_set_cc(struct spdk_nvmf_ctrlr *ctrlr, uint32_t value)
		} else {
			SPDK_DEBUGLOG(nvmf, "Property Set CC Disable!\n");
			ctrlr->vcprop.cc.bits.en = 0;
			ctrlr->disconnect_in_progress = true;
			spdk_for_each_channel(ctrlr->subsys->tgt,
					      nvmf_ctrlr_disconnect_io_qpairs_on_pg,
					      ctrlr,
@@ -943,6 +953,7 @@ nvmf_prop_set_cc(struct spdk_nvmf_ctrlr *ctrlr, uint32_t value)
			SPDK_DEBUGLOG(nvmf, "Property Set CC Shutdown %u%ub!\n",
				      cc.bits.shn >> 1, cc.bits.shn & 1);
			ctrlr->vcprop.cc.bits.shn = cc.bits.shn;
			ctrlr->disconnect_in_progress = true;
			spdk_for_each_channel(ctrlr->subsys->tgt,
					      nvmf_ctrlr_disconnect_io_qpairs_on_pg,
					      ctrlr,
+1 −0
Original line number Diff line number Diff line
@@ -251,6 +251,7 @@ struct spdk_nvmf_ctrlr {

	bool				dif_insert_or_strip;
	bool				in_destruct;
	bool				disconnect_in_progress;

	TAILQ_ENTRY(spdk_nvmf_ctrlr)	link;
};