Commit 1875912f authored by Darek Stojaczyk's avatar Darek Stojaczyk Committed by Jim Harris
Browse files

vhost/scsi: make scsi device a part of the device state struct



Both the scsi device and its state will need an
additional per-session copy, so we put those two
in a single struct now.

This also serves as a cleanup.

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent e6dfba0f
Loading
Loading
Loading
Loading
+32 −32
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@
#define VIRTIO_SCSI_REQUESTQ   2

struct spdk_scsi_dev_vhost_state {
	struct spdk_scsi_dev *dev;
	bool removed;
	spdk_vhost_event_fn remove_cb;
	void *remove_ctx;
@@ -75,7 +76,6 @@ struct spdk_scsi_dev_vhost_state {

struct spdk_vhost_scsi_dev {
	struct spdk_vhost_dev vdev;
	struct spdk_scsi_dev *scsi_dev[SPDK_VHOST_SCSI_CTRLR_MAX_DEVS];
	struct spdk_scsi_dev_vhost_state scsi_dev_state[SPDK_VHOST_SCSI_CTRLR_MAX_DEVS];
} __rte_cache_aligned;

@@ -155,12 +155,12 @@ process_removed_devs(struct spdk_vhost_scsi_dev *svdev)
	int i;

	for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; ++i) {
		dev = svdev->scsi_dev[i];
		state = &svdev->scsi_dev_state[i];
		dev = state->dev;

		if (dev && state->removed && !spdk_scsi_dev_has_pending_tasks(dev)) {
			spdk_scsi_dev_free_io_channels(dev);
			svdev->scsi_dev[i] = NULL;
			svdev->scsi_dev_state[i].dev = NULL;
			spdk_scsi_dev_destruct(dev);
			if (state->remove_cb) {
				state->remove_cb(&svdev->vdev, state->remove_ctx);
@@ -301,7 +301,7 @@ static int
spdk_vhost_scsi_task_init_target(struct spdk_vhost_scsi_task *task, const __u8 *lun)
{
	struct spdk_vhost_scsi_dev *svdev = task->svsession->svdev;
	struct spdk_scsi_dev *dev;
	struct spdk_scsi_dev_vhost_state *state;
	uint16_t lun_id = (((uint16_t)lun[2] << 8) | lun[3]) & 0x3FFF;

	SPDK_LOGDUMP(SPDK_LOG_VHOST_SCSI_QUEUE, "LUN", lun, 8);
@@ -311,9 +311,9 @@ spdk_vhost_scsi_task_init_target(struct spdk_vhost_scsi_task *task, const __u8 *
		return -1;
	}

	dev = svdev->scsi_dev[lun[1]];
	task->scsi_dev = dev;
	if (dev == NULL || svdev->scsi_dev_state[lun[1]].removed) {
	state = &svdev->scsi_dev_state[lun[1]];
	task->scsi_dev = state->dev;
	if (state->dev == NULL || svdev->scsi_dev_state[lun[1]].removed) {
		/* If dev has been hotdetached, return 0 to allow sending
		 * additional hotremove event via sense codes.
		 */
@@ -321,7 +321,7 @@ spdk_vhost_scsi_task_init_target(struct spdk_vhost_scsi_task *task, const __u8 *
	}

	task->scsi.target_port = spdk_scsi_dev_find_port_by_id(task->scsi_dev, 0);
	task->scsi.lun = spdk_scsi_dev_get_lun(dev, lun_id);
	task->scsi.lun = spdk_scsi_dev_get_lun(state->dev, lun_id);
	return 0;
}

@@ -775,7 +775,7 @@ spdk_vhost_scsi_dev_remove(struct spdk_vhost_dev *vdev)
	}

	for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; ++i) {
		if (svdev->scsi_dev[i]) {
		if (svdev->scsi_dev_state[i].dev) {
			if (vdev->registered) {
				SPDK_ERRLOG("Trying to remove non-empty controller: %s.\n", vdev->name);
				return -EBUSY;
@@ -806,7 +806,7 @@ spdk_vhost_scsi_dev_get_tgt(struct spdk_vhost_dev *vdev, uint8_t num)
	assert(num < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS);
	svdev = to_scsi_dev(vdev);

	return svdev ? svdev->scsi_dev[num] : NULL;
	return svdev ? svdev->scsi_dev_state[num].dev : NULL;
}

static void
@@ -820,7 +820,7 @@ spdk_vhost_scsi_lun_hotremove(const struct spdk_scsi_lun *lun, void *arg)
	assert(svdev != NULL);
	scsi_dev = spdk_scsi_lun_get_dev(lun);
	for (scsi_dev_num = 0; scsi_dev_num < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; scsi_dev_num++) {
		if (svdev->scsi_dev[scsi_dev_num] == scsi_dev) {
		if (svdev->scsi_dev_state[scsi_dev_num].dev == scsi_dev) {
			break;
		}
	}
@@ -839,6 +839,7 @@ spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num,
			    const char *bdev_name)
{
	struct spdk_vhost_scsi_dev *svdev;
	struct spdk_scsi_dev_vhost_state *state;
	char target_name[SPDK_SCSI_DEV_MAX_NAME];
	int lun_id_list[1];
	const char *bdev_names_list[1];
@@ -859,7 +860,8 @@ spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num,
		return -EINVAL;
	}

	if (svdev->scsi_dev[scsi_tgt_num] != NULL) {
	state = &svdev->scsi_dev_state[scsi_tgt_num];
	if (state->dev != NULL) {
		SPDK_ERRLOG("Controller %s target %u already occupied\n", vdev->name, scsi_tgt_num);
		return -EEXIST;
	}
@@ -871,17 +873,17 @@ spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num,
	lun_id_list[0] = 0;
	bdev_names_list[0] = (char *)bdev_name;

	svdev->scsi_dev_state[scsi_tgt_num].removed = false;
	svdev->scsi_dev[scsi_tgt_num] = spdk_scsi_dev_construct(target_name, bdev_names_list, lun_id_list,
					1,
					SPDK_SPC_PROTOCOL_IDENTIFIER_SAS, spdk_vhost_scsi_lun_hotremove, svdev);
	state->removed = false;
	state->dev = spdk_scsi_dev_construct(target_name, bdev_names_list, lun_id_list, 1,
					     SPDK_SPC_PROTOCOL_IDENTIFIER_SAS,
					     spdk_vhost_scsi_lun_hotremove, svdev);

	if (svdev->scsi_dev[scsi_tgt_num] == NULL) {
	if (state->dev == NULL) {
		SPDK_ERRLOG("Couldn't create spdk SCSI target '%s' using bdev '%s' in controller: %s\n",
			    target_name, bdev_name, vdev->name);
		return -EINVAL;
	}
	spdk_scsi_dev_add_port(svdev->scsi_dev[scsi_tgt_num], 0, "vhost");
	spdk_scsi_dev_add_port(state->dev, 0, "vhost");

	SPDK_INFOLOG(SPDK_LOG_VHOST, "Controller %s: defined target '%s' using bdev '%s'\n",
		     vdev->name, target_name, bdev_name);
@@ -891,7 +893,7 @@ spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num,
		return 0;
	}

	spdk_scsi_dev_allocate_io_channels(svdev->scsi_dev[scsi_tgt_num]);
	spdk_scsi_dev_allocate_io_channels(state->dev);

	if (spdk_vhost_dev_has_feature(vdev->session, VIRTIO_SCSI_F_HOTPLUG)) {
		eventq_enqueue((struct spdk_vhost_scsi_session *)vdev->session, scsi_tgt_num,
@@ -910,7 +912,6 @@ spdk_vhost_scsi_dev_remove_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_nu
			       spdk_vhost_event_fn cb_fn, void *cb_arg)
{
	struct spdk_vhost_scsi_dev *svdev;
	struct spdk_scsi_dev *scsi_dev;
	struct spdk_scsi_dev_vhost_state *scsi_dev_state;
	int rc = 0;

@@ -924,16 +925,16 @@ spdk_vhost_scsi_dev_remove_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_nu
		return -ENODEV;
	}

	scsi_dev = svdev->scsi_dev[scsi_tgt_num];
	if (scsi_dev == NULL) {
	scsi_dev_state = &svdev->scsi_dev_state[scsi_tgt_num];
	if (scsi_dev_state->dev == NULL) {
		SPDK_ERRLOG("Controller %s target %u is not occupied\n", vdev->name, scsi_tgt_num);
		return -ENODEV;
	}

	if (svdev->vdev.lcore == -1) {
		/* controller is not in use, remove dev and exit */
		svdev->scsi_dev[scsi_tgt_num] = NULL;
		spdk_scsi_dev_destruct(scsi_dev);
		svdev->scsi_dev_state[scsi_tgt_num].dev = NULL;
		spdk_scsi_dev_destruct(scsi_dev_state->dev);
		if (cb_fn) {
			rc = cb_fn(vdev, cb_arg);
		}
@@ -942,7 +943,6 @@ spdk_vhost_scsi_dev_remove_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_nu
		return rc;
	}

	scsi_dev_state = &svdev->scsi_dev_state[scsi_tgt_num];
	if (scsi_dev_state->removed) {
		SPDK_WARNLOG("%s: 'Target %u' has been already marked to hotremove.\n", svdev->vdev.name,
			     scsi_tgt_num);
@@ -1132,10 +1132,10 @@ spdk_vhost_scsi_start(struct spdk_vhost_dev *vdev, void *event_ctx)
	}

	for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) {
		if (svdev->scsi_dev[i] == NULL) {
		if (svdev->scsi_dev_state[i].dev == NULL) {
			continue;
		}
		spdk_scsi_dev_allocate_io_channels(svdev->scsi_dev[i]);
		spdk_scsi_dev_allocate_io_channels(svdev->scsi_dev_state[i].dev);
	}
	SPDK_INFOLOG(SPDK_LOG_VHOST, "Started poller for vhost controller %s on lcore %d\n",
		     vdev->name, vdev->lcore);
@@ -1169,11 +1169,11 @@ destroy_session_poller_cb(void *arg)
	}

	for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) {
		if (svdev->scsi_dev[i] == NULL) {
		if (svdev->scsi_dev_state[i].dev == NULL) {
			continue;
		}

		spdk_scsi_dev_free_io_channels(svdev->scsi_dev[i]);
		spdk_scsi_dev_free_io_channels(svdev->scsi_dev_state[i].dev);
	}

	SPDK_INFOLOG(SPDK_LOG_VHOST, "Stopping poller for vhost controller %s\n", svdev->vdev.name);
@@ -1288,12 +1288,12 @@ spdk_vhost_scsi_write_config_json(struct spdk_vhost_dev *vdev, struct spdk_json_

	spdk_json_write_object_end(w);

	for (i = 0; i < SPDK_COUNTOF(svdev->scsi_dev); i++) {
		if (svdev->scsi_dev[i] == NULL || svdev->scsi_dev_state[i].removed) {
	for (i = 0; i < SPDK_COUNTOF(svdev->scsi_dev_state); i++) {
		if (svdev->scsi_dev_state[i].dev == NULL || svdev->scsi_dev_state[i].removed) {
			continue;
		}

		lun = spdk_scsi_dev_get_lun(svdev->scsi_dev[i], 0);
		lun = spdk_scsi_dev_get_lun(svdev->scsi_dev_state[i].dev, 0);

		spdk_json_write_object_begin(w);
		spdk_json_write_named_string(w, "method", "add_vhost_scsi_lun");