Commit 29c6115c authored by Haoqian He's avatar Haoqian He Committed by Tomasz Zawadzki
Browse files

vhost: fix memory issue when spdk exit



When spdk exit, if stop session timeout, vhost memory will be
unmapped, we cannot access vring anymore.

The funciton call path is:
vhost_scsi_subsystem_fini
  -> spdk_vhost_scsi_fini
    -> vhost_user_fini
      -> vhost_user_session_shutdown
        -> _stop_session (timeout)
        -> vhost_driver_unregister (unmap vhost memory)
      -> vhost_fini
        -> spdk_vhost_dev_remove
          -> spdk_vhost_scsi_dev_remove_tgt
            -> vhost_scsi_session_remove_tgt
              -> eventq_enqueue (access vring and crash)

So We can skip calling vhost_driver_unregister when _stop_session
return error.

Change-Id: I250cfbc1edb288babea7658d005c2e7292ce68e5
Signed-off-by: default avatarHaoqian He <haoqian.he@smartx.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20452


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent e8003b3a
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1935,19 +1935,23 @@ vhost_user_session_shutdown(void *vhost_cb)
	struct spdk_vhost_dev *vdev = NULL;
	struct spdk_vhost_session *vsession;
	struct spdk_vhost_user_dev *user_dev;
	int ret;

	for (vdev = spdk_vhost_dev_next(NULL); vdev != NULL;
	     vdev = spdk_vhost_dev_next(vdev)) {
		user_dev = to_user_dev(vdev);
		ret = 0;
		pthread_mutex_lock(&user_dev->lock);
		TAILQ_FOREACH(vsession, &user_dev->vsessions, tailq) {
			if (vsession->started || vsession->starting) {
				_stop_session(vsession);
				ret += _stop_session(vsession);
			}
		}
		pthread_mutex_unlock(&user_dev->lock);
		if (ret == 0) {
			vhost_driver_unregister(vdev->path);
		}
	}

	SPDK_INFOLOG(vhost, "Exiting\n");
	spdk_thread_send_msg(g_vhost_user_init_thread, vhost_user_session_shutdown_on_init, vhost_cb);