Commit 02ccb0f7 authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Ben Walker
Browse files

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: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 97020b7a
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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. */
+7 −2
Original line number Diff line number Diff line
@@ -462,8 +462,10 @@ spdk_bdev_io_submit(struct spdk_bdev_io *bdev_io)
			lcore = rte_lcore_id();
		}
		bdev->lcore = lcore;
		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) {
		cb_event = spdk_event_allocate(rte_lcore_id(), bdev_io->cb,
@@ -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) {
		if (bdev->poller) {
			spdk_poller_unregister(&bdev->poller, NULL);
		}
		bdev->is_running = false;
	}
}