lib/ftl: non-volatile cache metadata pool

Initialize the memory pool for storing metadata (LBAs) when writing data
to the non-volatile cache. The mempool's object count and size can be
configured via nv_cache.max_request_cnt / nv_cache.max_request_size
respectively.

Change-Id: I376df9a75be13d4b29ba475f350edf402c868d48
Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/458092
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Wojciech Malikowski <wojciech.malikowski@intel.com>
This commit is contained in:
Konrad Sztyber 2019-05-29 09:22:34 +02:00 committed by Darek Stojaczyk
parent 83f3785bc4
commit 11ff1f4a2b
3 changed files with 39 additions and 4 deletions

View File

@ -92,6 +92,13 @@ struct spdk_ftl_conf {
/* Allow for partial recovery from open bands instead of returning error */
bool allow_open_bands;
struct {
/* Maximum number of concurrent requests */
size_t max_request_cnt;
/* Maximum number of blocks per one request */
size_t max_request_size;
} nv_cache;
};
/* Range of parallel units (inclusive) */

View File

@ -110,6 +110,8 @@ struct ftl_nv_cache {
uint64_t current_addr;
/* Number of available blocks left */
uint64_t num_available;
/* Metadata pool */
struct spdk_mempool *md_pool;
/* Cache lock */
pthread_spinlock_t lock;
};

View File

@ -96,6 +96,12 @@ static const struct spdk_ftl_conf g_default_conf = {
* will result in lost data after recovery.
*/
.allow_open_bands = false,
.nv_cache = {
/* Maximum number of concurrent requests */
.max_request_cnt = 2048,
/* Maximum number of blocks per request */
.max_request_size = 16,
}
};
static void ftl_dev_free_sync(struct spdk_ftl_dev *dev);
@ -470,6 +476,10 @@ static int
ftl_dev_init_nv_cache(struct spdk_ftl_dev *dev, struct spdk_bdev_desc *bdev_desc)
{
struct spdk_bdev *bdev;
struct spdk_ftl_conf *conf = &dev->conf;
struct ftl_nv_cache *nv_cache = &dev->nv_cache;
char pool_name[128];
int rc;
if (!bdev_desc) {
return 0;
@ -494,14 +504,29 @@ ftl_dev_init_nv_cache(struct spdk_ftl_dev *dev, struct spdk_bdev_desc *bdev_desc
return -1;
}
if (pthread_spin_init(&dev->nv_cache.lock, PTHREAD_PROCESS_PRIVATE)) {
rc = snprintf(pool_name, sizeof(pool_name), "ftl-nvpool-%p", dev);
if (rc < 0 || rc >= 128) {
return -1;
}
nv_cache->md_pool = spdk_mempool_create(pool_name, conf->nv_cache.max_request_cnt,
spdk_bdev_get_md_size(bdev) *
conf->nv_cache.max_request_size,
SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
SPDK_ENV_SOCKET_ID_ANY);
if (!nv_cache->md_pool) {
SPDK_ERRLOG("Failed to initialize non-volatile cache metadata pool\n");
return -1;
}
if (pthread_spin_init(&nv_cache->lock, PTHREAD_PROCESS_PRIVATE)) {
SPDK_ERRLOG("Failed to initialize cache lock\n");
return -1;
}
dev->nv_cache.bdev_desc = bdev_desc;
dev->nv_cache.current_addr = 0;
dev->nv_cache.num_available = spdk_bdev_get_num_blocks(bdev);
nv_cache->bdev_desc = bdev_desc;
nv_cache->current_addr = 0;
nv_cache->num_available = spdk_bdev_get_num_blocks(bdev);
return 0;
}
@ -1093,6 +1118,7 @@ ftl_dev_free_sync(struct spdk_ftl_dev *dev)
}
spdk_mempool_free(dev->lba_pool);
spdk_mempool_free(dev->nv_cache.md_pool);
if (dev->lba_request_pool) {
spdk_mempool_obj_iter(dev->lba_request_pool, ftl_lba_map_request_dtor, NULL);
}