Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright 2023 Solidigm All Rights Reserved
3 : : */
4 : :
5 : : #include "spdk/stdinc.h"
6 : : #include "spdk/queue.h"
7 : : #include "spdk/log.h"
8 : :
9 : : #include "ftl_nvc_dev.h"
10 : : #include "utils/ftl_defs.h"
11 : :
12 : : static TAILQ_HEAD(, ftl_nv_cache_device_desc) g_devs = TAILQ_HEAD_INITIALIZER(g_devs);
13 : : static pthread_mutex_t g_devs_mutex = PTHREAD_MUTEX_INITIALIZER;
14 : :
15 : : static const struct ftl_nv_cache_device_desc *
16 : 1901 : ftl_nv_cache_device_type_get_desc(const char *name)
17 : : {
18 : 0 : struct ftl_nv_cache_device_desc *entry;
19 : :
20 [ - + # # : 1901 : TAILQ_FOREACH(entry, &g_devs, internal.entry) {
# # # # #
# ]
21 [ # # # # : 0 : if (0 == strcmp(entry->name, name)) {
# # # # #
# ]
22 : 0 : return entry;
23 : : }
24 : 0 : }
25 : :
26 : 1901 : return NULL;
27 : 55 : }
28 : :
29 : : static bool
30 : 1901 : ftl_nv_cache_device_valid(const struct ftl_nv_cache_device_desc *desc)
31 : : {
32 [ + - + - : 1901 : return desc && desc->name && strlen(desc->name) > 0;
+ - + - +
- + - +
- ]
33 : : }
34 : :
35 : : void
36 : 1901 : ftl_nv_cache_device_register(struct ftl_nv_cache_device_desc *desc)
37 : : {
38 [ + + ]: 1901 : if (!ftl_nv_cache_device_valid(desc)) {
39 : 0 : SPDK_ERRLOG("NV cache device descriptor is invalid\n");
40 [ # # ]: 0 : ftl_abort();
41 : 0 : }
42 : :
43 [ + + ]: 1901 : pthread_mutex_lock(&g_devs_mutex);
44 [ + - + - : 1901 : if (!ftl_nv_cache_device_type_get_desc(desc->name)) {
+ - ]
45 [ + - + - : 1901 : TAILQ_INSERT_TAIL(&g_devs, desc, internal.entry);
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- ]
46 [ + - + - ]: 1901 : SPDK_NOTICELOG("Registered NV cache device, name: %s\n", desc->name);
47 : 55 : } else {
48 [ # # # # ]: 0 : SPDK_ERRLOG("Cannot register NV cache device, already exists, name: %s\n", desc->name);
49 [ # # ]: 0 : ftl_abort();
50 : : }
51 : :
52 [ + + ]: 1901 : pthread_mutex_unlock(&g_devs_mutex);
53 : 1901 : }
54 : :
55 : : const struct ftl_nv_cache_device_desc *
56 : 22 : ftl_nv_cache_device_get_desc_by_bdev(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev)
57 : : {
58 : 0 : struct ftl_nv_cache_device_desc *entry;
59 : 22 : const struct ftl_nv_cache_device_desc *desc = NULL;
60 : :
61 [ - + ]: 22 : pthread_mutex_lock(&g_devs_mutex);
62 [ + - # # : 22 : TAILQ_FOREACH(entry, &g_devs, internal.entry) {
# # # # #
# ]
63 [ + - # # : 22 : if (entry->ops.is_bdev_compatible) {
# # # # ]
64 [ + - # # : 22 : if (entry->ops.is_bdev_compatible(dev, bdev)) {
# # # # #
# # # ]
65 : 22 : desc = entry;
66 : 22 : break;
67 : : }
68 : 0 : }
69 : 0 : }
70 [ - + ]: 22 : pthread_mutex_unlock(&g_devs_mutex);
71 : :
72 : 22 : return desc;
73 : 0 : }
|