bdev: remove event dependency from I/O callback
Use a plain function pointer + callback context for the bdev I/O completion callback. This is possible now because each I/O channel will be polled on the core that submitted the I/O. Change-Id: I29ee8e4a3430df11c74845adab840395b9bc5010 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
292c9c42aa
commit
a96dc2592e
@ -142,7 +142,9 @@ enum spdk_bdev_reset_type {
|
|||||||
SPDK_BDEV_RESET_SOFT,
|
SPDK_BDEV_RESET_SOFT,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef spdk_event_fn spdk_bdev_io_completion_cb;
|
typedef void (*spdk_bdev_io_completion_cb)(struct spdk_bdev_io *bdev_io,
|
||||||
|
enum spdk_bdev_io_status status,
|
||||||
|
void *cb_arg);
|
||||||
typedef void (*spdk_bdev_io_get_rbuf_cb)(struct spdk_bdev_io *bdev_io);
|
typedef void (*spdk_bdev_io_get_rbuf_cb)(struct spdk_bdev_io *bdev_io);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -253,8 +255,6 @@ struct spdk_bdev_io {
|
|||||||
/** Context that will be passed to the completion callback */
|
/** Context that will be passed to the completion callback */
|
||||||
void *caller_ctx;
|
void *caller_ctx;
|
||||||
|
|
||||||
struct spdk_event *cb_event;
|
|
||||||
|
|
||||||
/** Callback for when rbuf is allocated */
|
/** Callback for when rbuf is allocated */
|
||||||
spdk_bdev_io_get_rbuf_cb get_rbuf_cb;
|
spdk_bdev_io_get_rbuf_cb get_rbuf_cb;
|
||||||
|
|
||||||
|
@ -409,10 +409,8 @@ spdk_bdev_cleanup_pending_rbuf_io(struct spdk_bdev *bdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
__submit_request(struct spdk_bdev *bdev, struct spdk_bdev_io *bdev_io, struct spdk_event *cb_event)
|
__submit_request(struct spdk_bdev *bdev, struct spdk_bdev_io *bdev_io)
|
||||||
{
|
{
|
||||||
bdev_io->cb_event = cb_event;
|
|
||||||
|
|
||||||
if (bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING) {
|
if (bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING) {
|
||||||
if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) {
|
if (bdev_io->type == SPDK_BDEV_IO_TYPE_RESET) {
|
||||||
spdk_bdev_cleanup_pending_rbuf_io(bdev);
|
spdk_bdev_cleanup_pending_rbuf_io(bdev);
|
||||||
@ -445,15 +443,8 @@ static int
|
|||||||
spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io)
|
spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io)
|
||||||
{
|
{
|
||||||
struct spdk_bdev *bdev = bdev_io->bdev;
|
struct spdk_bdev *bdev = bdev_io->bdev;
|
||||||
struct spdk_event *cb_event = NULL;
|
|
||||||
|
|
||||||
if (bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING) {
|
__submit_request(bdev, bdev_io);
|
||||||
cb_event = spdk_event_allocate(rte_lcore_id(), bdev_io->cb,
|
|
||||||
bdev_io->caller_ctx, bdev_io);
|
|
||||||
assert(cb_event != NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
__submit_request(bdev, bdev_io, cb_event);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -842,8 +833,8 @@ spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status sta
|
|||||||
|
|
||||||
bdev_io->status = status;
|
bdev_io->status = status;
|
||||||
|
|
||||||
assert(bdev_io->cb_event != NULL);
|
assert(bdev_io->cb != NULL);
|
||||||
spdk_event_call(bdev_io->cb_event);
|
bdev_io->cb(bdev_io, status, bdev_io->caller_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -118,11 +118,10 @@ nvmf_virtual_ctrlr_poll_for_completions(struct spdk_nvmf_session *session)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nvmf_virtual_ctrlr_complete_cmd(void *arg1, void *arg2)
|
nvmf_virtual_ctrlr_complete_cmd(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
|
||||||
|
void *cb_arg)
|
||||||
{
|
{
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
struct spdk_nvmf_request *req = cb_arg;
|
||||||
struct spdk_nvmf_request *req = arg1;
|
|
||||||
enum spdk_bdev_io_status status = bdev_io->status;
|
|
||||||
struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
|
struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl;
|
||||||
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
|
struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd;
|
||||||
|
|
||||||
|
@ -1222,11 +1222,10 @@ spdk_bdev_scsi_mode_select_page(struct spdk_bdev *bdev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
spdk_bdev_scsi_task_complete(void *arg1, void *arg2)
|
spdk_bdev_scsi_task_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
|
||||||
|
void *cb_arg)
|
||||||
{
|
{
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
struct spdk_scsi_task *task = cb_arg;
|
||||||
struct spdk_scsi_task *task = arg1;
|
|
||||||
enum spdk_bdev_io_status status = bdev_io->status;
|
|
||||||
|
|
||||||
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
|
if (task->type == SPDK_SCSI_TASK_TYPE_CMD) {
|
||||||
if (status == SPDK_BDEV_IO_STATUS_SUCCESS) {
|
if (status == SPDK_BDEV_IO_STATUS_SUCCESS) {
|
||||||
|
@ -163,11 +163,9 @@ initialize_buffer(char **buf, int pattern, int size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
quick_test_complete(void *arg1, void *arg2)
|
quick_test_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status, void *arg)
|
||||||
{
|
{
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
g_completion_status = status;
|
||||||
|
|
||||||
g_completion_status = bdev_io->status;
|
|
||||||
spdk_bdev_free_io(bdev_io);
|
spdk_bdev_free_io(bdev_io);
|
||||||
wake_ut_thread();
|
wake_ut_thread();
|
||||||
}
|
}
|
||||||
|
@ -183,16 +183,15 @@ end_run(void *arg1, void *arg2)
|
|||||||
struct rte_mempool *task_pool;
|
struct rte_mempool *task_pool;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdevperf_complete(void *arg1, void *arg2)
|
bdevperf_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status, void *cb_arg)
|
||||||
{
|
{
|
||||||
struct io_target *target;
|
struct io_target *target;
|
||||||
struct bdevperf_task *task = arg1;
|
struct bdevperf_task *task = cb_arg;
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
|
||||||
struct spdk_event *complete;
|
struct spdk_event *complete;
|
||||||
|
|
||||||
target = task->target;
|
target = task->target;
|
||||||
|
|
||||||
if (bdev_io->status != SPDK_BDEV_IO_STATUS_SUCCESS) {
|
if (status != SPDK_BDEV_IO_STATUS_SUCCESS) {
|
||||||
if (!g_reset) {
|
if (!g_reset) {
|
||||||
target->is_draining = true;
|
target->is_draining = true;
|
||||||
g_run_failed = true;
|
g_run_failed = true;
|
||||||
@ -229,11 +228,10 @@ bdevperf_complete(void *arg1, void *arg2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdevperf_unmap_complete(void *arg1, void *arg2)
|
bdevperf_unmap_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status, void *cb_arg)
|
||||||
{
|
{
|
||||||
struct io_target *target;
|
struct io_target *target;
|
||||||
struct bdevperf_task *task = arg1;
|
struct bdevperf_task *task = cb_arg;
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
|
||||||
|
|
||||||
target = task->target;
|
target = task->target;
|
||||||
|
|
||||||
@ -252,11 +250,11 @@ bdevperf_unmap_complete(void *arg1, void *arg2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bdevperf_verify_write_complete(void *arg1, void *arg2)
|
bdevperf_verify_write_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status,
|
||||||
|
void *cb_arg)
|
||||||
{
|
{
|
||||||
struct io_target *target;
|
struct io_target *target;
|
||||||
struct bdevperf_task *task = arg1;
|
struct bdevperf_task *task = cb_arg;
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
|
||||||
|
|
||||||
target = task->target;
|
target = task->target;
|
||||||
|
|
||||||
@ -367,11 +365,9 @@ end_target(void *arg)
|
|||||||
static void reset_target(void *arg);
|
static void reset_target(void *arg);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reset_cb(void *arg1, void *arg2)
|
reset_cb(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status, void *cb_arg)
|
||||||
{
|
{
|
||||||
struct spdk_bdev_io *bdev_io = arg2;
|
struct bdevperf_task *task = cb_arg;
|
||||||
int status = bdev_io->status;
|
|
||||||
struct bdevperf_task *task = bdev_io->caller_ctx;
|
|
||||||
struct io_target *target = task->target;
|
struct io_target *target = task->target;
|
||||||
|
|
||||||
if (status != SPDK_BDEV_IO_STATUS_SUCCESS) {
|
if (status != SPDK_BDEV_IO_STATUS_SUCCESS) {
|
||||||
|
@ -485,7 +485,7 @@ task_complete_test(void)
|
|||||||
|
|
||||||
task.type = SPDK_SCSI_TASK_TYPE_CMD;
|
task.type = SPDK_SCSI_TASK_TYPE_CMD;
|
||||||
bdev_io.status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
bdev_io.status = SPDK_BDEV_IO_STATUS_SUCCESS;
|
||||||
spdk_bdev_scsi_task_complete(&task, &bdev_io);
|
spdk_bdev_scsi_task_complete(&bdev_io, bdev_io.status, &task);
|
||||||
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
|
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
|
||||||
|
|
||||||
bdev_io.status = SPDK_BDEV_IO_STATUS_SCSI_ERROR;
|
bdev_io.status = SPDK_BDEV_IO_STATUS_SCSI_ERROR;
|
||||||
@ -493,14 +493,14 @@ task_complete_test(void)
|
|||||||
bdev_io.error.scsi.sk = SPDK_SCSI_SENSE_HARDWARE_ERROR;
|
bdev_io.error.scsi.sk = SPDK_SCSI_SENSE_HARDWARE_ERROR;
|
||||||
bdev_io.error.scsi.asc = SPDK_SCSI_ASC_WARNING;
|
bdev_io.error.scsi.asc = SPDK_SCSI_ASC_WARNING;
|
||||||
bdev_io.error.scsi.ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
|
bdev_io.error.scsi.ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
|
||||||
spdk_bdev_scsi_task_complete(&task, &bdev_io);
|
spdk_bdev_scsi_task_complete(&bdev_io, bdev_io.status, &task);
|
||||||
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_HARDWARE_ERROR);
|
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_HARDWARE_ERROR);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_WARNING);
|
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_WARNING);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[13], SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED);
|
CU_ASSERT_EQUAL(task.sense_data[13], SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED);
|
||||||
|
|
||||||
bdev_io.status = SPDK_BDEV_IO_STATUS_FAILED;
|
bdev_io.status = SPDK_BDEV_IO_STATUS_FAILED;
|
||||||
spdk_bdev_scsi_task_complete(&task, &bdev_io);
|
spdk_bdev_scsi_task_complete(&bdev_io, bdev_io.status, &task);
|
||||||
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_ABORTED_COMMAND);
|
CU_ASSERT_EQUAL(task.sense_data[2] & 0xf, SPDK_SCSI_SENSE_ABORTED_COMMAND);
|
||||||
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
|
CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);
|
||||||
|
Loading…
Reference in New Issue
Block a user