Commit c6745bc2 authored by Dariusz Stojaczyk's avatar Dariusz Stojaczyk Committed by Jim Harris
Browse files

vhost: generalized spdk_vhost_dev struct



Moved controller-related variables from spdk_vhost_scsi_controller to
spdk_vhost_dev. Generalized vhost to operate on non scsi-specific
controller struct.

Now spdk_vhost_scsi_dev contains direct spdk_vhost_dev field instead
of a pointer. This means there is no more allocation/deallocation
on poller start/stop.

Change-Id: I99739d58833ee023a75cb530cc80294e02f28090
Signed-off-by: default avatarDariusz Stojaczyk <dariuszx.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/361880


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
parent 78360d56
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -52,24 +52,25 @@ void spdk_vhost_startup(void *arg1, void *arg2);
void spdk_vhost_shutdown_cb(void);

/* Forward declaration */
struct spdk_vhost_scsi_ctrlr;
struct spdk_vhost_dev;
struct spdk_vhost_scsi_dev;

/**
 * Get handle to next controller.
 * \param prev Previous controller or NULL to get first one.
 * \return handle to next controller ot NULL if prev was the last one.
 */
struct spdk_vhost_scsi_ctrlr *spdk_vhost_scsi_ctrlr_next(struct spdk_vhost_scsi_ctrlr *prev);

const char *spdk_vhost_scsi_ctrlr_get_name(struct spdk_vhost_scsi_ctrlr *ctrl);
uint64_t spdk_vhost_scsi_ctrlr_get_cpumask(struct spdk_vhost_scsi_ctrlr *ctrl);
struct spdk_vhost_scsi_ctrlr *spdk_vhost_scsi_ctrlr_find(const char *ctrlr_name);
int spdk_vhost_scsi_ctrlr_construct(const char *name, uint64_t cpumask);
int spdk_vhost_scsi_ctrlr_remove(struct spdk_vhost_scsi_ctrlr *vdev);
struct spdk_vhost_dev *spdk_vhost_dev_next(struct spdk_vhost_dev *prev);
struct spdk_vhost_dev *spdk_vhost_dev_find(const char *ctrlr_name);
const char *spdk_vhost_dev_get_name(struct spdk_vhost_dev *ctrl);
uint64_t spdk_vhost_dev_get_cpumask(struct spdk_vhost_dev *ctrl);
int spdk_vhost_scsi_dev_construct(const char *name, uint64_t cpumask);
int spdk_vhost_scsi_dev_remove(struct spdk_vhost_scsi_dev *vdev);
int spdk_vhost_parse_core_mask(const char *mask, uint64_t *cpumask);
struct spdk_scsi_dev *spdk_vhost_scsi_ctrlr_get_dev(struct spdk_vhost_scsi_ctrlr *ctrl,

struct spdk_scsi_dev *spdk_vhost_scsi_dev_get_dev(struct spdk_vhost_scsi_dev *ctrl,
		uint8_t num);
int spdk_vhost_scsi_ctrlr_add_dev(const char *name, unsigned scsi_dev_num, const char *lun_name);
int spdk_vhost_scsi_ctrlr_remove_dev(struct spdk_vhost_scsi_ctrlr *vdev, unsigned scsi_dev_num);
int spdk_vhost_scsi_dev_add_dev(const char *name, unsigned scsi_dev_num, const char *lun_name);
int spdk_vhost_scsi_dev_remove_dev(struct spdk_vhost_scsi_dev *vdev, unsigned scsi_dev_num);

#endif /* SPDK_VHOST_H */
+4 −4
Original line number Diff line number Diff line
@@ -68,11 +68,11 @@ spdk_vhost_task_free_cb(struct spdk_scsi_task *scsi_task)
	struct spdk_vhost_task *task = container_of(scsi_task, struct spdk_vhost_task, scsi);

	rte_mempool_put(g_task_pool, task);
	spdk_vhost_scsi_ctrlr_task_unref(task->vdev);
	spdk_vhost_dev_task_unref((struct spdk_vhost_dev *) task->svdev);
}

struct spdk_vhost_task *
spdk_vhost_task_get(struct spdk_vhost_scsi_ctrlr *vdev)
spdk_vhost_task_get(struct spdk_vhost_scsi_dev *vdev)
{
	struct spdk_vhost_task *task;
	int rc;
@@ -84,8 +84,8 @@ spdk_vhost_task_get(struct spdk_vhost_scsi_ctrlr *vdev)
	}

	memset(task, 0, sizeof(*task));
	task->vdev = vdev;
	spdk_vhost_scsi_ctrlr_task_ref(task->vdev);
	task->svdev = vdev;
	spdk_vhost_dev_task_ref((struct spdk_vhost_dev *) task->svdev);
	spdk_scsi_task_construct(&task->scsi, spdk_vhost_task_free_cb, NULL);

	return task;
+6 −4
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@
/* Allocated iovec buffer len */
#define VHOST_SCSI_IOVS_LEN		128

struct spdk_vhost_dev;

struct spdk_vhost_task {
	struct spdk_scsi_task	scsi;

@@ -47,7 +49,7 @@ struct spdk_vhost_task {
		struct virtio_scsi_ctrl_tmf_resp *tmf_resp;
	};

	struct spdk_vhost_scsi_ctrlr *vdev;
	struct spdk_vhost_scsi_dev *svdev;
	struct spdk_scsi_dev *scsi_dev;

	int req_idx;
@@ -61,10 +63,10 @@ void spdk_vhost_enqueue_task(struct spdk_vhost_task *task);
struct spdk_vhost_task *spdk_vhost_dequeue_task(void);

void spdk_vhost_task_put(struct spdk_vhost_task *task);
struct spdk_vhost_task *spdk_vhost_task_get(struct spdk_vhost_scsi_ctrlr *vdev);
struct spdk_vhost_task *spdk_vhost_task_get(struct spdk_vhost_scsi_dev *vdev);

void spdk_vhost_scsi_ctrlr_task_ref(struct spdk_vhost_scsi_ctrlr *vdev);
void spdk_vhost_scsi_ctrlr_task_unref(struct spdk_vhost_scsi_ctrlr *vdev);
void spdk_vhost_dev_task_ref(struct spdk_vhost_dev *vdev);
void spdk_vhost_dev_task_unref(struct spdk_vhost_dev *vdev);

void spdk_vhost_iovec_free(struct iovec *iov);
struct iovec *spdk_vhost_iovec_alloc(void);
+133 −139

File changed.

Preview size limit exceeded, changes collapsed.

+13 −13
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ spdk_rpc_get_vhost_scsi_controllers(struct spdk_jsonrpc_server_conn *conn,
				    const struct spdk_json_val *id)
{
	struct spdk_json_write_ctx *w;
	struct spdk_vhost_scsi_ctrlr *ctrlr = NULL;
	struct spdk_vhost_dev *vdev = NULL;
	struct spdk_scsi_dev *dev;
	uint32_t i;
	char buf[32];
@@ -93,21 +93,21 @@ spdk_rpc_get_vhost_scsi_controllers(struct spdk_jsonrpc_server_conn *conn,

	w = spdk_jsonrpc_begin_result(conn, id);
	spdk_json_write_array_begin(w);
	while ((ctrlr = spdk_vhost_scsi_ctrlr_next(ctrlr)) != NULL) {
	while ((vdev = spdk_vhost_dev_next(vdev)) != NULL) {
		spdk_json_write_object_begin(w);

		spdk_json_write_name(w, "ctrlr");
		spdk_json_write_string(w, spdk_vhost_scsi_ctrlr_get_name(ctrlr));
		spdk_json_write_string(w, spdk_vhost_dev_get_name(vdev));

		spdk_json_write_name(w, "cpu_mask");
		snprintf(buf, sizeof(buf), "%#" PRIx64, spdk_vhost_scsi_ctrlr_get_cpumask(ctrlr));
		snprintf(buf, sizeof(buf), "%#" PRIx64, spdk_vhost_dev_get_cpumask(vdev));
		spdk_json_write_string(w, buf);

		spdk_json_write_name(w, "scsi_devs");
		spdk_json_write_array_begin(w);

		for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) {
			dev = spdk_vhost_scsi_ctrlr_get_dev(ctrlr, i);
			dev = spdk_vhost_scsi_dev_get_dev((struct spdk_vhost_scsi_dev *) vdev, i);
			if (!dev)
				continue;

@@ -169,7 +169,7 @@ spdk_rpc_construct_vhost_scsi_controller(struct spdk_jsonrpc_server_conn *conn,
		goto invalid;
	}

	rc = spdk_vhost_scsi_ctrlr_construct(req.ctrlr, cpumask);
	rc = spdk_vhost_scsi_dev_construct(req.ctrlr, cpumask);
	if (rc < 0) {
		goto invalid;
	}
@@ -207,7 +207,7 @@ spdk_rpc_remove_vhost_scsi_controller(struct spdk_jsonrpc_server_conn *conn,
{
	struct rpc_remove_vhost_scsi_ctrlr req = {NULL};
	struct spdk_json_write_ctx *w;
	struct spdk_vhost_scsi_ctrlr *vdev;
	struct spdk_vhost_dev *vdev;
	int rc;

	if (spdk_json_decode_object(params, rpc_remove_vhost_ctrlr,
@@ -218,12 +218,12 @@ spdk_rpc_remove_vhost_scsi_controller(struct spdk_jsonrpc_server_conn *conn,
		goto invalid;
	}

	if (!(vdev = spdk_vhost_scsi_ctrlr_find(req.ctrlr))) {
	if (!(vdev = spdk_vhost_dev_find(req.ctrlr))) {
		rc = -ENODEV;
		goto invalid;
	}

	rc = spdk_vhost_scsi_ctrlr_remove(vdev);
	rc = spdk_vhost_scsi_dev_remove((struct spdk_vhost_scsi_dev *) vdev);
	if (rc < 0) {
		goto invalid;
	}
@@ -280,7 +280,7 @@ spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_server_conn *conn,
		goto invalid;
	}

	rc = spdk_vhost_scsi_ctrlr_add_dev(req.ctrlr, req.scsi_dev_num, req.lun_name);
	rc = spdk_vhost_scsi_dev_add_dev(req.ctrlr, req.scsi_dev_num, req.lun_name);
	if (rc < 0) {
		goto invalid;
	}
@@ -323,7 +323,7 @@ spdk_rpc_remove_vhost_scsi_dev(struct spdk_jsonrpc_server_conn *conn,
{
	struct rpc_remove_vhost_scsi_ctrlr_dev req = {0};
	struct spdk_json_write_ctx *w;
	struct spdk_vhost_scsi_ctrlr *vdev;
	struct spdk_vhost_dev *vdev;
	int rc;

	if (spdk_json_decode_object(params, rpc_vhost_remove_dev,
@@ -334,12 +334,12 @@ spdk_rpc_remove_vhost_scsi_dev(struct spdk_jsonrpc_server_conn *conn,
		goto invalid;
	}

	if (!(vdev = spdk_vhost_scsi_ctrlr_find(req.ctrlr))) {
	if (!(vdev = spdk_vhost_dev_find(req.ctrlr))) {
		rc = -ENODEV;
		goto invalid;
	}

	rc = spdk_vhost_scsi_ctrlr_remove_dev(vdev, req.scsi_dev_num);
	rc = spdk_vhost_scsi_dev_remove_dev((struct spdk_vhost_scsi_dev *) vdev, req.scsi_dev_num);
	if (rc < 0) {
		goto invalid;
	}