lib/ftl: batch metadata buffers

Metadata buffer was added to ftl_batch structure.  It'll make it
possible to send writes with a separate metadata buffer.

Change-Id: I475c0982809cb0cc9aa6bcbc2a4935a6f15f19af
Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/907
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Wojciech Malikowski <wojciech.malikowski@intel.com>
Reviewed-by: Maciej Szczepaniak <maciej.szczepaniak@intel.com>
This commit is contained in:
Konrad Sztyber 2020-02-12 13:43:34 +01:00 committed by Tomasz Zawadzki
parent 87731e1105
commit 17ad5c8ea3
3 changed files with 26 additions and 0 deletions

View File

@ -216,6 +216,7 @@ ftl_get_next_batch(struct spdk_ftl_dev *dev)
struct ftl_wbuf_entry *entries[FTL_DEQUEUE_ENTRIES];
TAILQ_HEAD(, ftl_io_channel) ioch_queue;
size_t i, num_dequeued, num_remaining;
uint64_t *metadata;
if (batch == NULL) {
batch = TAILQ_FIRST(&dev->free_batches);
@ -251,6 +252,13 @@ ftl_get_next_batch(struct spdk_ftl_dev *dev)
for (i = 0; i < num_dequeued; ++i) {
batch->iov[batch->num_entries + i].iov_base = entries[i]->payload;
batch->iov[batch->num_entries + i].iov_len = FTL_BLOCK_SIZE;
if (batch->metadata != NULL) {
metadata = (uint64_t *)((char *)batch->metadata +
i * dev->md_size);
*metadata = entries[i]->lba;
}
TAILQ_INSERT_TAIL(&batch->entries, entries[i], tailq);
}

View File

@ -115,6 +115,7 @@ struct ftl_batch {
/* Index within spdk_ftl_dev.batch_array */
uint32_t index;
struct iovec *iov;
void *metadata;
TAILQ_ENTRY(ftl_batch) tailq;
};
@ -188,6 +189,7 @@ struct spdk_ftl_dev {
/* Metadata size */
size_t md_size;
void *md_buf;
/* Transfer unit size */
size_t xfer_size;

View File

@ -1208,6 +1208,16 @@ ftl_dev_init_io_channel(struct spdk_ftl_dev *dev)
return -1;
}
if (dev->md_size > 0) {
dev->md_buf = spdk_zmalloc(dev->md_size * dev->xfer_size * FTL_BATCH_COUNT,
dev->md_size, NULL, SPDK_ENV_LCORE_ID_ANY,
SPDK_MALLOC_DMA);
if (dev->md_buf == NULL) {
SPDK_ERRLOG("Failed to allocate metadata buffer\n");
return -1;
}
}
dev->iov_buf = calloc(FTL_BATCH_COUNT, dev->xfer_size * sizeof(struct iovec));
if (!dev->iov_buf) {
SPDK_ERRLOG("Failed to allocate iovec buffer\n");
@ -1223,6 +1233,10 @@ ftl_dev_init_io_channel(struct spdk_ftl_dev *dev)
batch->num_entries = 0;
batch->index = i;
TAILQ_INIT(&batch->entries);
if (dev->md_buf != NULL) {
batch->metadata = (char *)dev->md_buf + i * dev->xfer_size * dev->md_size;
}
TAILQ_INSERT_TAIL(&dev->free_batches, batch, tailq);
}
@ -1367,6 +1381,8 @@ ftl_dev_free_sync(struct spdk_ftl_dev *dev)
ftl_release_bdev(dev->nv_cache.bdev_desc);
ftl_release_bdev(dev->base_bdev_desc);
spdk_free(dev->md_buf);
assert(dev->num_io_channels == 0);
free(dev->ioch_array);
free(dev->iov_buf);