Commit 25156211 authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

bdev/delay: Find delay_bdev directly from g_delay_node list



spdk_bdev_get_by_name() uses RB tree and is fast. However it is not
secure from race condition. We can use spdk_bdev_open_ext() instead
but what we want to get is not spdk_bdev but vbdev_delay.
vbdev_delay is managed by the g_delay_nodes list.

The g_delay_nodes includes only vbdev_delay. Even if its performance
is O(N), it is more intutive, more secure, and small list.

So replace spdk_bdev_get_by_name() by simple list traversal.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I3e184066e237e10132523591133900231055b5af
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12069


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 4573e4cc
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -646,18 +646,18 @@ vbdev_delay_insert_association(const char *bdev_name, const char *vbdev_name,
int
vbdev_delay_update_latency_value(char *delay_name, uint64_t latency_us, enum delay_io_type type)
{
	struct spdk_bdev *delay_bdev;
	struct vbdev_delay *delay_node;
	uint64_t ticks_mhz = spdk_get_ticks_hz() / SPDK_SEC_TO_USEC;

	delay_bdev = spdk_bdev_get_by_name(delay_name);
	if (delay_bdev == NULL) {
		return -ENODEV;
	} else if (delay_bdev->module != &delay_if) {
		return -EINVAL;
	TAILQ_FOREACH(delay_node, &g_delay_nodes, link) {
		if (strcmp(delay_node->delay_bdev.name, delay_name) == 0) {
			break;
		}
	}

	delay_node = SPDK_CONTAINEROF(delay_bdev, struct vbdev_delay, delay_bdev);
	if (delay_node == NULL) {
		return -ENODEV;
	}

	switch (type) {
	case DELAY_AVG_READ: