Commit a0fb555b authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Tomasz Zawadzki
Browse files

lib/ftl: New memory allocation mode in MD



This patch adds ability to allocate FTL metadata's buffer
on SPDK memory.

Change-Id: Ic95d940dcb98538cd57c2ef9283bcd32eb2aa442
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Signed-off-by: default avatarMariusz Barczak <Mariusz.Barczak@solidigmtechnology.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19603


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent d9f2ae9d
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -49,6 +49,19 @@ xfer_size(struct ftl_md *md)
	return ftl_md_xfer_blocks(md->dev) * FTL_BLOCK_SIZE;
}

static void
ftl_md_create_spdk_buf(struct ftl_md *md, uint64_t vss_blksz)
{
	md->shm_fd = -1;
	md->vss_data = NULL;
	md->data = spdk_zmalloc(md->data_blocks * (FTL_BLOCK_SIZE + vss_blksz), FTL_BLOCK_SIZE, NULL,
				SPDK_ENV_SOCKET_ID_ANY, SPDK_MALLOC_DMA);

	if (md->data && vss_blksz) {
		md->vss_data = ((char *)md->data) + md->data_blocks * FTL_BLOCK_SIZE;
	}
}

static void
ftl_md_create_heap(struct ftl_md *md, uint64_t vss_blksz)
{
@@ -61,6 +74,16 @@ ftl_md_create_heap(struct ftl_md *md, uint64_t vss_blksz)
	}
}

static void
ftl_md_destroy_spdk_buf(struct ftl_md *md)
{
	if (md->data) {
		spdk_free(md->data);
		md->data = NULL;
		md->vss_data = NULL;
	}
}

static void
ftl_md_destroy_heap(struct ftl_md *md)
{
@@ -269,6 +292,8 @@ struct ftl_md *ftl_md_create(struct spdk_ftl_dev *dev, uint64_t blocks,
		if (flags & FTL_MD_CREATE_SHM) {
			ftl_md_setup_obj(md, flags, name);
			ftl_md_create_shm(md, vss_blksz, flags);
		} else if (flags & FTL_MD_CREATE_SPDK_BUF) {
			ftl_md_create_spdk_buf(md, vss_blksz);
		} else {
			assert((flags & FTL_MD_CREATE_HEAP) == FTL_MD_CREATE_HEAP);
			ftl_md_create_heap(md, vss_blksz);
@@ -339,8 +364,12 @@ ftl_md_free_buf(struct ftl_md *md, int flags)
	}

	if (md->shm_fd < 0) {
		if (flags & FTL_MD_DESTROY_SPDK_BUF) {
			ftl_md_destroy_spdk_buf(md);
		} else {
			assert(flags == 0);
			ftl_md_destroy_heap(md);
		}
	} else {
		ftl_md_destroy_shm(md, flags);
	}
+5 −0
Original line number Diff line number Diff line
@@ -151,6 +151,9 @@ enum ftl_md_create_flags {

	/** FTL metadata will be created on heap */
	FTL_MD_CREATE_HEAP =		0x4,

	/** FTL metadata will be created using spdk_zmalloc */
	FTL_MD_CREATE_SPDK_BUF =	0x8,
};

/**
@@ -189,6 +192,8 @@ int ftl_md_unlink(struct spdk_ftl_dev *dev, const char *name, int flags);
enum ftl_md_destroy_flags {
	/** FTL metadata data buf will be kept in SHM */
	FTL_MD_DESTROY_SHM_KEEP = 0x1,
	/** FTL metadata data buf, freeing buffer allocated with FTL_MD_CREATE_SPDK_BUF */
	FTL_MD_DESTROY_SPDK_BUF = 0x2,
};

/**