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:
parent
83f3785bc4
commit
11ff1f4a2b
@ -92,6 +92,13 @@ struct spdk_ftl_conf {
|
|||||||
|
|
||||||
/* Allow for partial recovery from open bands instead of returning error */
|
/* Allow for partial recovery from open bands instead of returning error */
|
||||||
bool allow_open_bands;
|
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) */
|
/* Range of parallel units (inclusive) */
|
||||||
|
@ -110,6 +110,8 @@ struct ftl_nv_cache {
|
|||||||
uint64_t current_addr;
|
uint64_t current_addr;
|
||||||
/* Number of available blocks left */
|
/* Number of available blocks left */
|
||||||
uint64_t num_available;
|
uint64_t num_available;
|
||||||
|
/* Metadata pool */
|
||||||
|
struct spdk_mempool *md_pool;
|
||||||
/* Cache lock */
|
/* Cache lock */
|
||||||
pthread_spinlock_t lock;
|
pthread_spinlock_t lock;
|
||||||
};
|
};
|
||||||
|
@ -96,6 +96,12 @@ static const struct spdk_ftl_conf g_default_conf = {
|
|||||||
* will result in lost data after recovery.
|
* will result in lost data after recovery.
|
||||||
*/
|
*/
|
||||||
.allow_open_bands = false,
|
.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);
|
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)
|
ftl_dev_init_nv_cache(struct spdk_ftl_dev *dev, struct spdk_bdev_desc *bdev_desc)
|
||||||
{
|
{
|
||||||
struct spdk_bdev *bdev;
|
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) {
|
if (!bdev_desc) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -494,14 +504,29 @@ ftl_dev_init_nv_cache(struct spdk_ftl_dev *dev, struct spdk_bdev_desc *bdev_desc
|
|||||||
return -1;
|
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");
|
SPDK_ERRLOG("Failed to initialize cache lock\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->nv_cache.bdev_desc = bdev_desc;
|
nv_cache->bdev_desc = bdev_desc;
|
||||||
dev->nv_cache.current_addr = 0;
|
nv_cache->current_addr = 0;
|
||||||
dev->nv_cache.num_available = spdk_bdev_get_num_blocks(bdev);
|
nv_cache->num_available = spdk_bdev_get_num_blocks(bdev);
|
||||||
|
|
||||||
return 0;
|
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->lba_pool);
|
||||||
|
spdk_mempool_free(dev->nv_cache.md_pool);
|
||||||
if (dev->lba_request_pool) {
|
if (dev->lba_request_pool) {
|
||||||
spdk_mempool_obj_iter(dev->lba_request_pool, ftl_lba_map_request_dtor, NULL);
|
spdk_mempool_obj_iter(dev->lba_request_pool, ftl_lba_map_request_dtor, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user