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: Jim Harris <james.r.harris@intel.com>
Change-Id: I59f333d38a0d89cc4c50082177ff818135bcad37
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16454
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Xiaodong Liu <xiaodong.liu@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
Jim Harris 2023-01-24 20:01:16 +00:00 committed by Tomasz Zawadzki
parent 5b81c4bb9f
commit 525dcf4935

View File

@ -43,6 +43,8 @@ struct ublk_thread_ctx;
static void ublk_submit_bdev_io(struct ublk_queue *q, uint16_t tag); static void ublk_submit_bdev_io(struct ublk_queue *q, uint16_t tag);
static void ublk_dev_queue_fini(struct ublk_queue *q); static void ublk_dev_queue_fini(struct ublk_queue *q);
static int ublk_poll(void *arg); 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_set_params(struct spdk_ublk_dev *ublk);
static void ublk_finish_start(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); static void ublk_delete_dev(struct spdk_ublk_dev *ublk);
@ -99,7 +101,8 @@ struct spdk_ublk_dev {
volatile bool is_closing; volatile bool is_closing;
ublk_del_cb del_cb; ublk_del_cb del_cb;
void *cb_arg; 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; uint32_t ctrl_ops_in_progress;
TAILQ_ENTRY(spdk_ublk_dev) tailq; TAILQ_ENTRY(spdk_ublk_dev) tailq;
@ -212,18 +215,8 @@ ublk_ctrl_poller(void *arg)
} }
ublk = (struct spdk_ublk_dev *)cqe->user_data; ublk = (struct spdk_ublk_dev *)cqe->user_data;
ublk->ctrl_ops_in_progress--; ublk->ctrl_ops_in_progress--;
switch (ublk->last_cmd_op) { if (ublk->next_state_fn) {
case UBLK_CMD_ADD_DEV: ublk->next_state_fn(ublk);
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;
} }
io_uring_cqe_seen(ring, cqe); io_uring_cqe_seen(ring, cqe);
count++; count++;
@ -251,7 +244,8 @@ ublk_ctrl_cmd(struct spdk_ublk_dev *ublk, uint32_t cmd_op)
sqe->ioprio = 0; sqe->ioprio = 0;
cmd->dev_id = dev_id; cmd->dev_id = dev_id;
cmd->queue_id = -1; cmd->queue_id = -1;
ublk->last_cmd_op = cmd_op; ublk->ctrl_cmd_op = cmd_op;
ublk->next_state_fn = NULL;
switch (cmd_op) { switch (cmd_op) {
case UBLK_CMD_START_DEV: 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; cmd->data[1] = 0;
break; break;
case UBLK_CMD_ADD_DEV: case UBLK_CMD_ADD_DEV:
ublk->next_state_fn = ublk_set_params;
cmd->addr = (__u64)(uintptr_t)&ublk->dev_info; cmd->addr = (__u64)(uintptr_t)&ublk->dev_info;
cmd->len = sizeof(ublk->dev_info); cmd->len = sizeof(ublk->dev_info);
break; break;
case UBLK_CMD_STOP_DEV: case UBLK_CMD_STOP_DEV:
break;
case UBLK_CMD_DEL_DEV: case UBLK_CMD_DEL_DEV:
ublk->next_state_fn = ublk_delete_dev;
break; break;
case UBLK_CMD_SET_PARAMS: case UBLK_CMD_SET_PARAMS:
ublk->next_state_fn = ublk_finish_start;
cmd->addr = (__u64)(uintptr_t)&ublk->dev_params; cmd->addr = (__u64)(uintptr_t)&ublk->dev_params;
cmd->len = sizeof(ublk->dev_params); cmd->len = sizeof(ublk->dev_params);
break; break;