From a96dc2592e9217f375206452a5c06850462b7268 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 5 Oct 2016 15:00:20 -0700 Subject: [PATCH] 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 --- include/spdk/bdev.h | 6 +++--- lib/bdev/bdev.c | 17 ++++------------- lib/nvmf/virtual.c | 7 +++---- lib/scsi/scsi_bdev.c | 7 +++---- test/lib/bdev/bdevio/bdevio.c | 6 ++---- test/lib/bdev/bdevperf/bdevperf.c | 24 ++++++++++-------------- test/lib/scsi/scsi_bdev/scsi_bdev_ut.c | 6 +++--- 7 files changed, 28 insertions(+), 45 deletions(-) diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index 9d7dd632b..7efc70718 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -142,7 +142,9 @@ enum spdk_bdev_reset_type { 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); /** @@ -253,8 +255,6 @@ struct spdk_bdev_io { /** Context that will be passed to the completion callback */ void *caller_ctx; - struct spdk_event *cb_event; - /** Callback for when rbuf is allocated */ spdk_bdev_io_get_rbuf_cb get_rbuf_cb; diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index aa4ba795e..1f71efa2e 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -409,10 +409,8 @@ spdk_bdev_cleanup_pending_rbuf_io(struct spdk_bdev *bdev) } 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->type == SPDK_BDEV_IO_TYPE_RESET) { spdk_bdev_cleanup_pending_rbuf_io(bdev); @@ -445,15 +443,8 @@ static int spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io) { struct spdk_bdev *bdev = bdev_io->bdev; - struct spdk_event *cb_event = NULL; - if (bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING) { - 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); + __submit_request(bdev, bdev_io); 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; - assert(bdev_io->cb_event != NULL); - spdk_event_call(bdev_io->cb_event); + assert(bdev_io->cb != NULL); + bdev_io->cb(bdev_io, status, bdev_io->caller_ctx); } void diff --git a/lib/nvmf/virtual.c b/lib/nvmf/virtual.c index 817948944..7672760cb 100644 --- a/lib/nvmf/virtual.c +++ b/lib/nvmf/virtual.c @@ -118,11 +118,10 @@ nvmf_virtual_ctrlr_poll_for_completions(struct spdk_nvmf_session *session) } 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 = arg1; - enum spdk_bdev_io_status status = bdev_io->status; + struct spdk_nvmf_request *req = cb_arg; struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl; struct spdk_nvme_cmd *cmd = &req->cmd->nvme_cmd; diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index 3cb9aab03..681d768c5 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -1222,11 +1222,10 @@ spdk_bdev_scsi_mode_select_page(struct spdk_bdev *bdev, } 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 = arg1; - enum spdk_bdev_io_status status = bdev_io->status; + struct spdk_scsi_task *task = cb_arg; if (task->type == SPDK_SCSI_TASK_TYPE_CMD) { if (status == SPDK_BDEV_IO_STATUS_SUCCESS) { diff --git a/test/lib/bdev/bdevio/bdevio.c b/test/lib/bdev/bdevio/bdevio.c index 95b67e8ff..f9372f049 100644 --- a/test/lib/bdev/bdevio/bdevio.c +++ b/test/lib/bdev/bdevio/bdevio.c @@ -163,11 +163,9 @@ initialize_buffer(char **buf, int pattern, int size) } 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 = bdev_io->status; + g_completion_status = status; spdk_bdev_free_io(bdev_io); wake_ut_thread(); } diff --git a/test/lib/bdev/bdevperf/bdevperf.c b/test/lib/bdev/bdevperf/bdevperf.c index 4bc5130be..97fd64af6 100644 --- a/test/lib/bdev/bdevperf/bdevperf.c +++ b/test/lib/bdev/bdevperf/bdevperf.c @@ -183,16 +183,15 @@ end_run(void *arg1, void *arg2) struct rte_mempool *task_pool; 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 bdevperf_task *task = arg1; - struct spdk_bdev_io *bdev_io = arg2; + struct bdevperf_task *task = cb_arg; struct spdk_event *complete; target = task->target; - if (bdev_io->status != SPDK_BDEV_IO_STATUS_SUCCESS) { + if (status != SPDK_BDEV_IO_STATUS_SUCCESS) { if (!g_reset) { target->is_draining = true; g_run_failed = true; @@ -229,11 +228,10 @@ bdevperf_complete(void *arg1, void *arg2) } 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 bdevperf_task *task = arg1; - struct spdk_bdev_io *bdev_io = arg2; + struct bdevperf_task *task = cb_arg; target = task->target; @@ -252,11 +250,11 @@ bdevperf_unmap_complete(void *arg1, void *arg2) } 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 bdevperf_task *task = arg1; - struct spdk_bdev_io *bdev_io = arg2; + struct bdevperf_task *task = cb_arg; target = task->target; @@ -367,11 +365,9 @@ end_target(void *arg) static void reset_target(void *arg); 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; - int status = bdev_io->status; - struct bdevperf_task *task = bdev_io->caller_ctx; + struct bdevperf_task *task = cb_arg; struct io_target *target = task->target; if (status != SPDK_BDEV_IO_STATUS_SUCCESS) { diff --git a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c index f867e916f..e2760d7d3 100644 --- a/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c +++ b/test/lib/scsi/scsi_bdev/scsi_bdev_ut.c @@ -485,7 +485,7 @@ task_complete_test(void) task.type = SPDK_SCSI_TASK_TYPE_CMD; 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); 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.asc = SPDK_SCSI_ASC_WARNING; 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.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[13], SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED); 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.sense_data[2] & 0xf, SPDK_SCSI_SENSE_ABORTED_COMMAND); CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE);