Commit 1e18d9cd authored by Darek Stojaczyk's avatar Darek Stojaczyk Committed by Jim Harris
Browse files

vhost: introduce spdk_vhost_dev_foreach_session



When device is changed, e.g. the underlying bdev is
hotremoved, all sessions need to be notified. For
instance, Vhost-SCSI would send an additional hotremove
eventq message. That's why we introduce a helper
function to iterate through all active sessions.

Eventually, we may want to poll different sessions
from different lcores, so there will be some kind of
internal cross-lcore message management required
- just like there is one for spdk_vhost_call_external_event_foreach().
For now, though, we can get away with a dumbest
implementation.

We still want to keep this API internal for the time
being. The end-user (RPC) should only modify the
device, and the whole concept of sessions should be
completely encapsulated.

Change-Id: I2e142632c07a23daeac15cabea4cffecf984e455
Signed-off-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/418736


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent f82a1757
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -1349,6 +1349,21 @@ spdk_vhost_external_event_foreach_continue(struct spdk_vhost_dev *vdev,
	spdk_vhost_event_async_send(vdev, fn, arg, true);
}

void
spdk_vhost_dev_foreach_session(struct spdk_vhost_dev *vdev,
			       spdk_vhost_session_fn fn, void *arg)
{
	int rc = 0;

	if (vdev->session != NULL) {
		rc = fn(vdev, vdev->session, arg);
	}

	if (rc >= 0) {
		fn(vdev, NULL, arg);
	}
}

void
spdk_vhost_call_external_event_foreach(spdk_vhost_event_fn fn, void *arg)
{
+31 −0
Original line number Diff line number Diff line
@@ -191,6 +191,25 @@ struct spdk_vhost_dev_destroy_ctx {
	void *event_ctx;
};

/**
 * Synchronized vhost session event used for backend callbacks.
 *
 * \param vdev vhost device. If the device has been deleted
 * in the meantime, this function will be called one last
 * time with vdev == NULL.
 * \param vsession vhost session. If all sessions have been
 * iterated through, this function will be called one last
 * time with vsession == NULL.
 * \param arg user-provided parameter.
 *
 * \return negative values will break the foreach call, meaning
 * the function won't be called again. Return codes zero and
 * positive don't have any effect.
 */
typedef int (*spdk_vhost_session_fn)(struct spdk_vhost_dev *vdev,
				     struct spdk_vhost_session *vsession,
				     void *arg);

struct spdk_vhost_dev *spdk_vhost_dev_find(const char *ctrlr_name);

void *spdk_vhost_gpa_to_vva(struct spdk_vhost_session *vsession, uint64_t addr, uint64_t len);
@@ -272,6 +291,18 @@ int spdk_vhost_dev_unregister(struct spdk_vhost_dev *vdev);
int spdk_vhost_scsi_controller_construct(void);
int spdk_vhost_blk_controller_construct(void);
void spdk_vhost_dump_info_json(struct spdk_vhost_dev *vdev, struct spdk_json_write_ctx *w);

/*
 * Call function for each active session on the provided
 * vhost device. The function will be called one-by-one
 * on each session's thread.
 *
 * \param vdev vhost device
 * \param fn function to call
 * \param arg additional argument to \c fn
 */
void spdk_vhost_dev_foreach_session(struct spdk_vhost_dev *dev,
				    spdk_vhost_session_fn fn, void *arg);
void spdk_vhost_dev_backend_event_done(void *event_ctx, int response);
void spdk_vhost_lock(void);
void spdk_vhost_unlock(void);