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:
parent
4573e4cc23
commit
2515621184
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user