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:
parent
c262145f61
commit
3cdd17f518
@ -105,7 +105,7 @@ ftl_rwb_batch_full(const struct ftl_rwb_batch *batch, size_t batch_size)
|
|||||||
return batch_size == rwb->xfer_size;
|
return batch_size == rwb->xfer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
ftl_rwb_batch_init_entry(struct ftl_rwb_batch *batch, size_t pos)
|
ftl_rwb_batch_init_entry(struct ftl_rwb_batch *batch, size_t pos)
|
||||||
{
|
{
|
||||||
struct ftl_rwb *rwb = batch->rwb;
|
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->md = rwb->md_size ? ((char *)batch->md_buffer) + rwb->md_size * batch_offset : NULL;
|
||||||
entry->batch = batch;
|
entry->batch = batch;
|
||||||
entry->rwb = batch->rwb;
|
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) {
|
if (batch_offset > 0) {
|
||||||
prev = &batch->entries[batch_offset - 1];
|
prev = &batch->entries[batch_offset - 1];
|
||||||
@ -126,6 +130,8 @@ ftl_rwb_batch_init_entry(struct ftl_rwb_batch *batch, size_t pos)
|
|||||||
} else {
|
} else {
|
||||||
LIST_INSERT_HEAD(&batch->entry_list, entry, list_entry);
|
LIST_INSERT_HEAD(&batch->entry_list, entry, list_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -143,32 +149,28 @@ ftl_rwb_batch_init(struct ftl_rwb *rwb, struct ftl_rwb_batch *batch, unsigned in
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LIST_INIT(&batch->entry_list);
|
||||||
|
|
||||||
batch->buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * rwb->xfer_size,
|
batch->buffer = spdk_dma_zmalloc(FTL_BLOCK_SIZE * rwb->xfer_size,
|
||||||
FTL_BLOCK_SIZE, NULL);
|
FTL_BLOCK_SIZE, NULL);
|
||||||
if (!batch->buffer) {
|
if (!batch->buffer) {
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (md_size > 0) {
|
if (md_size > 0) {
|
||||||
batch->md_buffer = spdk_dma_zmalloc(md_size, FTL_BLOCK_SIZE, NULL);
|
batch->md_buffer = spdk_dma_zmalloc(md_size, FTL_BLOCK_SIZE, NULL);
|
||||||
if (!batch->md_buffer) {
|
if (!batch->md_buffer) {
|
||||||
goto error;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIST_INIT(&batch->entry_list);
|
|
||||||
|
|
||||||
for (i = 0; i < rwb->xfer_size; ++i) {
|
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;
|
return 0;
|
||||||
error:
|
|
||||||
free(batch->entries);
|
|
||||||
batch->entries = NULL;
|
|
||||||
spdk_dma_free(batch->buffer);
|
|
||||||
batch->buffer = NULL;
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ftl_rwb *
|
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));
|
rwb = calloc(1, sizeof(*rwb));
|
||||||
if (!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);
|
assert(conf->rwb_size % xfer_size == 0);
|
||||||
|
|
||||||
rwb->xfer_size = xfer_size;
|
rwb->xfer_size = xfer_size;
|
||||||
rwb->md_size = md_size;
|
rwb->md_size = md_size;
|
||||||
rwb->num_batches = conf->rwb_size / (FTL_BLOCK_SIZE * xfer_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);
|
rwb->limits[i] = ftl_rwb_entry_cnt(rwb);
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_spin_init(&rwb->lock, PTHREAD_PROCESS_PRIVATE);
|
|
||||||
return rwb;
|
return rwb;
|
||||||
error:
|
error:
|
||||||
ftl_rwb_free(rwb);
|
ftl_rwb_free(rwb);
|
||||||
@ -244,16 +251,21 @@ ftl_rwb_free(struct ftl_rwb *rwb)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < rwb->num_batches; ++i) {
|
if (rwb->batches) {
|
||||||
batch = &rwb->batches[i];
|
for (size_t i = 0; i < rwb->num_batches; ++i) {
|
||||||
|
batch = &rwb->batches[i];
|
||||||
|
|
||||||
ftl_rwb_foreach(entry, batch) {
|
if (batch->entries) {
|
||||||
pthread_spin_destroy(&entry->lock);
|
ftl_rwb_foreach(entry, batch) {
|
||||||
|
pthread_spin_destroy(&entry->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(batch->entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
spdk_dma_free(batch->buffer);
|
||||||
|
spdk_dma_free(batch->md_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
spdk_dma_free(batch->buffer);
|
|
||||||
spdk_dma_free(batch->md_buffer);
|
|
||||||
free(batch->entries);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_spin_destroy(&rwb->lock);
|
pthread_spin_destroy(&rwb->lock);
|
||||||
|
Loading…
Reference in New Issue
Block a user