Commit 525dcf49 authored by Jim Harris's avatar Jim Harris Committed by Tomasz Zawadzki
Browse files

ublk: add ublk->next_state_fn



Instead of having the poller check the last
ctrl_cmd_op to determine which function to call,
just have ublk_ctrl_cmd store that function pointer
in the ublk itself.  This keeps all of the
cmd_op-specific logic in one place rather than
splitting it between the submit and poller
functions.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I59f333d38a0d89cc4c50082177ff818135bcad37
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16454


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarXiaodong Liu <xiaodong.liu@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
parent 5b81c4bb
Loading
Loading
Loading
Loading
+12 −14
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ struct ublk_thread_ctx;
static void ublk_submit_bdev_io(struct ublk_queue *q, uint16_t tag);
static void ublk_dev_queue_fini(struct ublk_queue *q);
static int ublk_poll(void *arg);

typedef void (*ublk_next_state_fn)(struct spdk_ublk_dev *ublk);
static void ublk_set_params(struct spdk_ublk_dev *ublk);
static void ublk_finish_start(struct spdk_ublk_dev *ublk);
static void ublk_delete_dev(struct spdk_ublk_dev *ublk);
@@ -99,7 +101,8 @@ struct spdk_ublk_dev {
	volatile bool		is_closing;
	ublk_del_cb		del_cb;
	void			*cb_arg;
	uint32_t		last_cmd_op;
	uint32_t		ctrl_cmd_op;
	ublk_next_state_fn	next_state_fn;
	uint32_t		ctrl_ops_in_progress;

	TAILQ_ENTRY(spdk_ublk_dev) tailq;
@@ -212,18 +215,8 @@ ublk_ctrl_poller(void *arg)
		}
		ublk = (struct spdk_ublk_dev *)cqe->user_data;
		ublk->ctrl_ops_in_progress--;
		switch (ublk->last_cmd_op) {
		case UBLK_CMD_ADD_DEV:
			ublk_set_params(ublk);
			break;
		case UBLK_CMD_SET_PARAMS:
			ublk_finish_start(ublk);
			break;
		case UBLK_CMD_DEL_DEV:
			ublk_delete_dev(ublk);
			break;
		default:
			break;
		if (ublk->next_state_fn) {
			ublk->next_state_fn(ublk);
		}
		io_uring_cqe_seen(ring, cqe);
		count++;
@@ -251,7 +244,8 @@ ublk_ctrl_cmd(struct spdk_ublk_dev *ublk, uint32_t cmd_op)
	sqe->ioprio = 0;
	cmd->dev_id = dev_id;
	cmd->queue_id = -1;
	ublk->last_cmd_op = cmd_op;
	ublk->ctrl_cmd_op = cmd_op;
	ublk->next_state_fn = NULL;

	switch (cmd_op) {
	case UBLK_CMD_START_DEV:
@@ -259,13 +253,17 @@ ublk_ctrl_cmd(struct spdk_ublk_dev *ublk, uint32_t cmd_op)
		cmd->data[1] = 0;
		break;
	case UBLK_CMD_ADD_DEV:
		ublk->next_state_fn = ublk_set_params;
		cmd->addr = (__u64)(uintptr_t)&ublk->dev_info;
		cmd->len = sizeof(ublk->dev_info);
		break;
	case UBLK_CMD_STOP_DEV:
		break;
	case UBLK_CMD_DEL_DEV:
		ublk->next_state_fn = ublk_delete_dev;
		break;
	case UBLK_CMD_SET_PARAMS:
		ublk->next_state_fn = ublk_finish_start;
		cmd->addr = (__u64)(uintptr_t)&ublk->dev_params;
		cmd->len = sizeof(ublk->dev_params);
		break;