From 02ccb0f79101e894eed8d5b44cf2592134f558fb Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Tue, 30 Aug 2016 12:52:27 -0700 Subject: [PATCH] bdev: make check_io callback optional If a bdev doesn't need to be polled, allow it to specify NULL for the check_io function pointer to indicate that no poller needs to be registered. This will be useful for virtual blockdevs that don't have any associated hardware to poll. Change-Id: I0ef8f848587b0c200296805ccc710340dde683b5 Signed-off-by: Daniel Verkamp --- include/spdk/bdev.h | 6 +++++- lib/bdev/bdev.c | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/spdk/bdev.h b/include/spdk/bdev.h index a4f58dbaf..b7198ea32 100644 --- a/include/spdk/bdev.h +++ b/include/spdk/bdev.h @@ -134,7 +134,11 @@ struct spdk_bdev_fn_table { /** Destroy the backend block device object */ int (*destruct)(struct spdk_bdev *bdev); - /** Poll the backend for I/O waiting to be completed. */ + /** + * Poll the backend for I/O waiting to be completed. + * + * Optional; if the bdev does not have any periodic work to do, this pointer can be NULL. + */ int (*check_io)(struct spdk_bdev *bdev); /** Process the IO. */ diff --git a/lib/bdev/bdev.c b/lib/bdev/bdev.c index e03565ac5..14490855d 100644 --- a/lib/bdev/bdev.c +++ b/lib/bdev/bdev.c @@ -462,7 +462,9 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io) lcore = rte_lcore_id(); } bdev->lcore = lcore; - spdk_poller_register(&bdev->poller, spdk_bdev_do_work, bdev, lcore, NULL, 0); + if (bdev->fn_table->check_io) { + spdk_poller_register(&bdev->poller, spdk_bdev_do_work, bdev, lcore, NULL, 0); + } } if (bdev_io->status == SPDK_BDEV_IO_STATUS_PENDING) { @@ -815,6 +817,7 @@ spdk_bdev_register(struct spdk_bdev *bdev) /* initialize the reset generation value to zero */ bdev->gencnt = 0; bdev->is_running = false; + bdev->poller = NULL; SPDK_TRACELOG(SPDK_TRACE_DEBUG, "Inserting bdev %s into list\n", bdev->name); TAILQ_INSERT_TAIL(&spdk_bdev_list, bdev, link); @@ -834,7 +837,9 @@ spdk_bdev_unregister(struct spdk_bdev *bdev) } if (bdev->is_running) { - spdk_poller_unregister(&bdev->poller, NULL); + if (bdev->poller) { + spdk_poller_unregister(&bdev->poller, NULL); + } bdev->is_running = false; } }