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: Shuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: I3e184066e237e10132523591133900231055b5af
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12069
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Shuhei Matsumoto 2022-03-29 16:07:19 +09:00 committed by Tomasz Zawadzki
parent 4573e4cc23
commit 2515621184

View File

@ -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: