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 <daniel.verkamp@intel.com>
This commit is contained in:
Daniel Verkamp 2016-08-30 12:52:27 -07:00 committed by Ben Walker
parent 97020b7ab6
commit 02ccb0f791
2 changed files with 12 additions and 3 deletions

View File

@ -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. */

View File

@ -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;
}
}