lib/ftl: cleaned up write buffer initialization

Moved freeing the data into one place. Added error checks for all of the
pthread_spin_init calls.

Change-Id: Ic123f75f242fb71b92fcad5acf7b00588c2801c3
Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450618
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Konrad Sztyber 2019-04-09 09:45:45 +02:00 committed by Jim Harris
parent c262145f61
commit 3cdd17f518

View File

@ -105,7 +105,7 @@ ftl_rwb_batch_full(const struct ftl_rwb_batch *batch, size_t batch_size)
return batch_size == rwb->xfer_size;
}
static void
static int
ftl_rwb_batch_init_entry(struct ftl_rwb_batch *batch, size_t pos)
{
struct ftl_rwb *rwb = batch->rwb;
@ -118,7 +118,11 @@ ftl_rwb_batch_init_entry(struct ftl_rwb_batch *batch, size_t pos)
entry->md = rwb->md_size ? ((char *)batch->md_buffer) + rwb->md_size * batch_offset : NULL;
entry->batch = batch;
entry->rwb = batch->rwb;
pthread_spin_init(&entry->lock, PTHREAD_PROCESS_PRIVATE);
if (pthread_spin_init(&entry->lock, PTHREAD_PROCESS_PRIVATE)) {
SPDK_ERRLOG("Spinlock initialization failure\n");
return -1;
}
if (batch_offset > 0) {
prev = &batch->entries[batch_offset - 1];
@ -126,6 +130,8 @@ ftl_rwb_batch_init_entry(struct ftl_rwb_batch *batch, size_t pos)
} else {
LIST_INSERT_HEAD(&batch->entry_list, entry, list_entry);
}
return 0;
}
static int
@ -143,32 +149,28 @@ ftl_rwb_batch_init(struct ftl_rwb *rwb, struct ftl_rwb_batch *batch, unsigned in
return -1;
}
LIST_INIT(&batch->entry_list);
batch->buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * rwb->xfer_size,
FTL_BLOCK_SIZE, NULL);
if (!batch->buffer) {
goto error;
return -1;
}
if (md_size > 0) {
batch->md_buffer = spdk_dma_zmalloc(md_size, FTL_BLOCK_SIZE, NULL);
if (!batch->md_buffer) {
goto error;
return -1;
}
}
LIST_INIT(&batch->entry_list);
for (i = 0; i < rwb->xfer_size; ++i) {
ftl_rwb_batch_init_entry(batch, pos * rwb->xfer_size + i);
if (ftl_rwb_batch_init_entry(batch, pos * rwb->xfer_size + i)) {
return -1;
}
}
return 0;
error:
free(batch->entries);
batch->entries = NULL;
spdk_dma_free(batch->buffer);
batch->buffer = NULL;
return -1;
}
struct ftl_rwb *
@ -180,11 +182,17 @@ ftl_rwb_init(const struct spdk_ftl_conf *conf, size_t xfer_size, size_t md_size)
rwb = calloc(1, sizeof(*rwb));
if (!rwb) {
goto error;
SPDK_ERRLOG("Memory allocation failure\n");
return NULL;
}
if (pthread_spin_init(&rwb->lock, PTHREAD_PROCESS_PRIVATE)) {
SPDK_ERRLOG("Spinlock initialization failure\n");
free(rwb);
return NULL;
}
assert(conf->rwb_size % xfer_size == 0);
rwb->xfer_size = xfer_size;
rwb->md_size = md_size;
rwb->num_batches = conf->rwb_size / (FTL_BLOCK_SIZE * xfer_size);
@ -227,7 +235,6 @@ ftl_rwb_init(const struct spdk_ftl_conf *conf, size_t xfer_size, size_t md_size)
rwb->limits[i] = ftl_rwb_entry_cnt(rwb);
}
pthread_spin_init(&rwb->lock, PTHREAD_PROCESS_PRIVATE);
return rwb;
error:
ftl_rwb_free(rwb);
@ -244,16 +251,21 @@ ftl_rwb_free(struct ftl_rwb *rwb)
return;
}
if (rwb->batches) {
for (size_t i = 0; i < rwb->num_batches; ++i) {
batch = &rwb->batches[i];
if (batch->entries) {
ftl_rwb_foreach(entry, batch) {
pthread_spin_destroy(&entry->lock);
}
free(batch->entries);
}
spdk_dma_free(batch->buffer);
spdk_dma_free(batch->md_buffer);
free(batch->entries);
}
}
pthread_spin_destroy(&rwb->lock);