Commit 3cdd17f5 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Jim Harris
Browse files

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: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/450618


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent c262145f
Loading
Loading
Loading
Loading
+36 −24
Original line number Diff line number Diff line
@@ -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;
	}

	assert(conf->rwb_size % xfer_size == 0);
	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);