lib/ftl: distinct non-volatile cache recovery phase

Change-Id: I6936905d4a031508a85729e61ac72a352a490e14
Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/458104
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Mateusz Kozlowski <mateusz.kozlowski@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
This commit is contained in:
Konrad Sztyber 2019-06-11 12:17:17 +02:00 committed by Ben Walker
parent 6db41a006e
commit 81e3797452
3 changed files with 35 additions and 15 deletions

View File

@ -280,6 +280,7 @@ size_t ftl_lba_map_num_lbks(const struct spdk_ftl_dev *dev);
size_t ftl_head_md_num_lbks(const struct spdk_ftl_dev *dev);
int ftl_restore_md(struct spdk_ftl_dev *dev, ftl_restore_fn cb);
int ftl_restore_device(struct ftl_restore *restore, ftl_restore_fn cb);
void ftl_restore_nv_cache(struct ftl_restore *restore, ftl_restore_fn cb);
int ftl_band_set_direct_access(struct ftl_band *band, bool access);
int ftl_retrieve_chunk_info(struct spdk_ftl_dev *dev, struct ftl_ppa ppa,
struct spdk_ocssd_chunk_information_entry *info,

View File

@ -974,23 +974,39 @@ ftl_setup_initial_state(struct spdk_ftl_dev *dev)
return 0;
}
static void
ftl_restore_nv_cache_cb(struct spdk_ftl_dev *dev, struct ftl_restore *restore, int status)
{
if (spdk_unlikely(status != 0)) {
SPDK_ERRLOG("Failed to restore the non-volatile cache state\n");
ftl_init_fail(dev);
return;
}
ftl_init_complete(dev);
}
static void
ftl_restore_device_cb(struct spdk_ftl_dev *dev, struct ftl_restore *restore, int status)
{
if (status) {
SPDK_ERRLOG("Failed to restore the device from the SSD\n");
goto error;
ftl_init_fail(dev);
return;
}
if (ftl_init_bands_state(dev)) {
SPDK_ERRLOG("Unable to finish the initialization\n");
goto error;
ftl_init_fail(dev);
return;
}
ftl_init_complete(dev);
return;
error:
ftl_init_fail(dev);
if (!dev->nv_cache.bdev_desc) {
ftl_init_complete(dev);
return;
}
ftl_restore_nv_cache(restore, ftl_restore_nv_cache_cb);
}
static void

View File

@ -118,7 +118,7 @@ struct ftl_restore {
/* LBA map buffer */
void *lba_map;
/* Indicates we're in the final phase of the restoration */
bool l2p_phase;
bool final_phase;
/* Non-volatile cache recovery */
struct ftl_nv_cache_restore nv_cache;
};
@ -163,7 +163,7 @@ ftl_restore_init(struct spdk_ftl_dev *dev, ftl_restore_fn cb)
restore->dev = dev;
restore->cb = cb;
restore->l2p_phase = false;
restore->final_phase = false;
restore->bands = calloc(ftl_dev_num_bands(dev), sizeof(*restore->bands));
if (!restore->bands) {
@ -203,10 +203,10 @@ static void
ftl_restore_complete(struct ftl_restore *restore, int status)
{
struct ftl_restore *ctx = status ? NULL : restore;
bool l2p_phase = restore->l2p_phase;
bool final_phase = restore->final_phase;
restore->cb(restore->dev, ctx, status);
if (status || l2p_phase) {
if (status || final_phase) {
ftl_restore_free(restore);
}
}
@ -630,8 +630,8 @@ out:
spdk_bdev_free_io(bdev_io);
}
static void
ftl_restore_nv_cache(struct ftl_restore *restore)
void
ftl_restore_nv_cache(struct ftl_restore *restore, ftl_restore_fn cb)
{
struct spdk_ftl_dev *dev = restore->dev;
struct spdk_bdev *bdev;
@ -645,9 +645,13 @@ ftl_restore_nv_cache(struct ftl_restore *restore)
ioch = spdk_io_channel_get_ctx(dev->ioch);
bdev = spdk_bdev_desc_get_bdev(nv_cache->bdev_desc);
alignment = spdk_max(spdk_bdev_get_buf_align(bdev), sizeof(uint64_t));
nvc_restore->nv_cache = nv_cache;
nvc_restore->ioch = ioch->cache_ioch;
restore->final_phase = true;
restore->cb = cb;
for (i = 0; i < FTL_NV_CACHE_RESTORE_DEPTH; ++i) {
block = &nvc_restore->block[i];
block->parent = nvc_restore;
@ -912,8 +916,6 @@ ftl_restore_tail_md_cb(struct ftl_io *io, void *ctx, int status)
if (!STAILQ_EMPTY(&restore->pad_bands)) {
spdk_thread_send_msg(ftl_get_core_thread(dev), ftl_restore_pad_open_bands,
restore);
} else if (dev->nv_cache.bdev_desc) {
ftl_restore_nv_cache(restore);
} else {
ftl_restore_complete(restore, 0);
}
@ -945,11 +947,12 @@ ftl_restore_tail_md(struct ftl_restore_band *rband)
int
ftl_restore_device(struct ftl_restore *restore, ftl_restore_fn cb)
{
struct spdk_ftl_dev *dev = restore->dev;
struct ftl_restore_band *rband;
restore->l2p_phase = true;
restore->current = 0;
restore->cb = cb;
restore->final_phase = dev->nv_cache.bdev_desc == NULL;
/* If restore_device is called, there must be at least one valid band */
rband = ftl_restore_next_band(restore);