Commit 08be9c66 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Tomasz Zawadzki
Browse files

nvmf: fix admin_qpair race



Checking ctrlr->admin_qpair->group can race with setting
ctrlr->admin_qpair to NULL in _nvmf_transport_qpair_fini_complete().
Skip this check if we are not on ctrlr->thread because then the group
won't match either.

Fixes: #2498
Change-Id: I4dafd3d52869af8283fd7d0dc9d8116b7aaa452b
Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18696


Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent 9e06b192
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1478,6 +1478,9 @@ poll_group_update_subsystem(struct spdk_nvmf_poll_group *group,

	if (ns_changed) {
		TAILQ_FOREACH(ctrlr, &subsystem->ctrlrs, link) {
			if (ctrlr->thread != spdk_get_thread()) {
				continue;
			}
			/* It is possible that a ctrlr was added but the admin_qpair hasn't been
			 * assigned yet.
			 */
+4 −0
Original line number Diff line number Diff line
@@ -3206,6 +3206,10 @@ subsystem_listener_update_on_pg(struct spdk_io_channel_iter *i)
	group = spdk_io_channel_get_ctx(spdk_io_channel_iter_get_channel(i));

	TAILQ_FOREACH(ctrlr, &listener->subsystem->ctrlrs, link) {
		if (ctrlr->thread != spdk_get_thread()) {
			continue;
		}

		if (ctrlr->admin_qpair && ctrlr->admin_qpair->group == group && ctrlr->listener == listener) {
			nvmf_ctrlr_async_event_ana_change_notice(ctrlr);
		}