bdev/ftl: Add driver specific data to get_bdevs rpc

Added basic configuration details (transport type and address,
parallel units, cache info) as well as most important OCSSD geometry
data to get_bdevs driver_specific section.

Signed-off-by: Mateusz Kozlowski <mateusz.kozlowski@intel.com>
Change-Id: I00c50706bd9203bcef1701be1b7d87e93c10e57f
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/456790
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Mateusz Kozlowski 2019-06-04 11:34:02 +02:00 committed by Darek Stojaczyk
parent 675c4aa743
commit 8cdb3d330e
3 changed files with 52 additions and 15 deletions

View File

@ -143,6 +143,10 @@ struct spdk_ftl_attrs {
struct spdk_bdev_desc *cache_bdev_desc;
/* Allow partial recovery after dirty shutdown */
bool allow_open_bands;
/* Number of chunks per parallel unit in the underlying device (including any offline ones) */
size_t num_chunks;
/* Number of sectors per chunk */
size_t chunk_size;
};
struct ftl_module_init_opts {
@ -220,7 +224,7 @@ void spdk_ftl_conf_init_defaults(struct spdk_ftl_conf *conf);
* \param dev device
* \param attr Attribute structure to fill
*/
void spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attr);
void spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *attr);
/**
* Submits a read to the specified device.

View File

@ -403,12 +403,33 @@ bdev_ftl_get_io_channel(void *ctx)
return spdk_get_io_channel(ftl_bdev);
}
static void
_bdev_ftl_write_config_info(struct ftl_bdev *ftl_bdev, struct spdk_json_write_ctx *w)
{
struct spdk_ftl_attrs attrs;
const char *trtype_str, *cache_bdev;
spdk_ftl_dev_get_attrs(ftl_bdev->dev, &attrs);
trtype_str = spdk_nvme_transport_id_trtype_str(ftl_bdev->ctrlr->trid.trtype);
if (trtype_str) {
spdk_json_write_named_string(w, "trtype", trtype_str);
}
spdk_json_write_named_string(w, "traddr", ftl_bdev->ctrlr->trid.traddr);
spdk_json_write_named_string_fmt(w, "punits", "%d-%d", attrs.range.begin, attrs.range.end);
if (ftl_bdev->cache_bdev_desc) {
cache_bdev = spdk_bdev_get_name(spdk_bdev_desc_get_bdev(ftl_bdev->cache_bdev_desc));
spdk_json_write_named_string(w, "cache", cache_bdev);
}
}
static void
bdev_ftl_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w)
{
struct ftl_bdev *ftl_bdev = bdev->ctxt;
struct spdk_ftl_attrs attrs;
const char *trtype_str, *cache_bdev;
char uuid[SPDK_UUID_STRING_LEN];
spdk_ftl_dev_get_attrs(ftl_bdev->dev, &attrs);
@ -420,34 +441,44 @@ bdev_ftl_write_config_json(struct spdk_bdev *bdev, struct spdk_json_write_ctx *w
spdk_json_write_named_object_begin(w, "params");
spdk_json_write_named_string(w, "name", ftl_bdev->bdev.name);
trtype_str = spdk_nvme_transport_id_trtype_str(ftl_bdev->ctrlr->trid.trtype);
if (trtype_str) {
spdk_json_write_named_string(w, "trtype", trtype_str);
}
spdk_json_write_named_string(w, "traddr", ftl_bdev->ctrlr->trid.traddr);
spdk_json_write_named_string_fmt(w, "punits", "%d-%d", attrs.range.begin, attrs.range.end);
spdk_json_write_named_bool(w, "allow_open_bands", attrs.allow_open_bands);
spdk_uuid_fmt_lower(uuid, sizeof(uuid), &attrs.uuid);
spdk_json_write_named_string(w, "uuid", uuid);
if (ftl_bdev->cache_bdev_desc) {
cache_bdev = spdk_bdev_get_name(spdk_bdev_desc_get_bdev(ftl_bdev->cache_bdev_desc));
spdk_json_write_named_string(w, "cache", cache_bdev);
}
spdk_json_write_named_bool(w, "allow_open_bands", attrs.allow_open_bands);
_bdev_ftl_write_config_info(ftl_bdev, w);
spdk_json_write_object_end(w);
spdk_json_write_object_end(w);
}
static int
bdev_ftl_dump_info_json(void *ctx, struct spdk_json_write_ctx *w)
{
struct ftl_bdev *ftl_bdev = ctx;
struct spdk_ftl_attrs attrs;
spdk_ftl_dev_get_attrs(ftl_bdev->dev, &attrs);
spdk_json_write_named_object_begin(w, "ftl");
_bdev_ftl_write_config_info(ftl_bdev, w);
spdk_json_write_named_string_fmt(w, "num_chunks", "%zu", attrs.num_chunks);
spdk_json_write_named_string_fmt(w, "chunk_size", "%zu", attrs.chunk_size);
/* ftl */
spdk_json_write_object_end(w);
return 0;
}
static const struct spdk_bdev_fn_table ftl_fn_table = {
.destruct = bdev_ftl_destruct,
.submit_request = bdev_ftl_submit_request,
.io_type_supported = bdev_ftl_io_type_supported,
.get_io_channel = bdev_ftl_get_io_channel,
.write_config_json = bdev_ftl_write_config_json,
.dump_info_json = bdev_ftl_dump_info_json,
};
int

View File

@ -1644,6 +1644,8 @@ spdk_ftl_dev_get_attrs(const struct spdk_ftl_dev *dev, struct spdk_ftl_attrs *at
attrs->range = dev->range;
attrs->cache_bdev_desc = dev->nv_cache.bdev_desc;
attrs->allow_open_bands = dev->conf.allow_open_bands;
attrs->num_chunks = dev->geo.num_chk;
attrs->chunk_size = dev->geo.clba;
}
static void