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