Commit 20c3c166 authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Jim Harris
Browse files

lib/ftl: Select NV cache device when opening bdev



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


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
parent 851af375
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ C_SRCS += mngt/ftl_mngt_recovery.c mngt/ftl_mngt_upgrade.c
C_SRCS += utils/ftl_conf.c utils/ftl_md.c utils/ftl_mempool.c utils/ftl_bitmap.c
C_SRCS += upgrade/ftl_layout_upgrade.c upgrade/ftl_sb_upgrade.c upgrade/ftl_p2l_upgrade.c
C_SRCS += upgrade/ftl_band_upgrade.c upgrade/ftl_chunk_upgrade.c
C_SRCS += nvc/ftl_nvc_dev.c
C_SRCS += nvc/ftl_nvc_dev.c nvc/ftl_nvc_bdev_vss.c

SPDK_MAP_FILE = $(abspath $(CURDIR)/spdk_ftl.map)

+5 −0
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright 2023 Solidigm All Rights Reserved
 *   Copyright (C) 2022 Intel Corporation.
 *   All rights reserved.
 */
@@ -11,6 +12,7 @@

#include "ftl_io.h"
#include "ftl_utils.h"
#include "nvc/ftl_nvc_dev.h"

/*
 * FTL non volatile cache is divided into groups of blocks called chunks.
@@ -132,6 +134,9 @@ struct ftl_nv_cache {
	/* Flag indicating halt request */
	bool halt;

	/* NV cache device descriptor */
	const struct ftl_nv_cache_device_desc *nvc_desc;

	/* Write buffer cache bdev */
	struct spdk_bdev_desc *bdev_desc;

+8 −32
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright 2023 Solidigm All Rights Reserved
 *   Copyright (C) 2022 Intel Corporation.
 *   All rights reserved.
 */
@@ -182,47 +183,22 @@ ftl_mngt_open_cache_bdev(struct spdk_ftl_dev *dev, struct ftl_mngt_process *mngt
		goto error;
	}

#ifndef SPDK_FTL_VSS_EMU
	if (!spdk_bdev_is_md_separate(bdev)) {
		FTL_ERRLOG(dev, "Bdev %s doesn't support separate metadata buffer IO\n",
			   spdk_bdev_get_name(bdev));
		goto error;
	}

	nv_cache->md_size = spdk_bdev_get_md_size(bdev);
	if (nv_cache->md_size != sizeof(union ftl_md_vss)) {
		FTL_ERRLOG(dev, "Bdev's %s metadata is invalid size (%"PRIu32")\n",
			   spdk_bdev_get_name(bdev), spdk_bdev_get_md_size(bdev));
		goto error;
	}

	if (spdk_bdev_get_dif_type(bdev) != SPDK_DIF_DISABLE) {
		FTL_ERRLOG(dev, "Unsupported DIF type used by bdev %s\n",
			   spdk_bdev_get_name(bdev));
		goto error;
	}

	if (bdev->blockcnt * bdev->blocklen < MINIMUM_CACHE_SIZE_GIB * GiB) {
		FTL_ERRLOG(dev, "Bdev %s is too small, requires, at least %uGiB capacity\n",
			   spdk_bdev_get_name(bdev), MINIMUM_CACHE_SIZE_GIB);
		goto error;
	}
	nv_cache->md_size = spdk_bdev_get_md_size(bdev);

	if (ftl_md_xfer_blocks(dev) * nv_cache->md_size > FTL_ZERO_BUFFER_SIZE) {
		FTL_ERRLOG(dev, "Zero buffer too small for bdev %s metadata transfer\n",
			   spdk_bdev_get_name(bdev));
		goto error;
	}
#else
	if (spdk_bdev_is_md_separate(bdev)) {
		FTL_ERRLOG(dev, "FTL VSS emulation but NV cache supports VSS\n");
	/* Get FTL NVC bdev descriptor */
	nv_cache->nvc_desc = ftl_nv_cache_device_get_desc_by_bdev(dev, bdev);
	if (!nv_cache->nvc_desc) {
		FTL_ERRLOG(dev, "Failed to get NV Cache device descriptor\n");
		goto error;
	}
	nv_cache->md_size = sizeof(union ftl_md_vss);

	nv_cache->md_size = 64;
	FTL_NOTICELOG(dev, "FTL uses VSS emulation\n");
#endif

	FTL_NOTICELOG(dev, "Using %s as NV Cache device\n", nv_cache->nvc_desc->name);
	ftl_mngt_next_step(mngt);
	return;
error:
+43 −0
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright 2023 Solidigm All Rights Reserved
 */

#include "ftl_nvc_dev.h"
#include "ftl_core.h"

static bool
is_bdev_compatible(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev)
{
	if (!spdk_bdev_is_md_separate(bdev)) {
		/* It doesn't support separate metadata buffer IO */
		return false;
	}

	if (spdk_bdev_get_md_size(bdev) != sizeof(union ftl_md_vss)) {
		/* Bdev's metadata is invalid size */
		return false;
	}

	if (spdk_bdev_get_dif_type(bdev) != SPDK_DIF_DISABLE) {
		/* Unsupported DIF type used by bdev */
		return false;
	}

	if (ftl_md_xfer_blocks(dev) * spdk_bdev_get_md_size(bdev) > FTL_ZERO_BUFFER_SIZE) {
		FTL_ERRLOG(dev, "Zero buffer too small for bdev %s metadata transfer\n",
			   spdk_bdev_get_name(bdev));
		return false;
	}

	return true;
}

struct ftl_nv_cache_device_desc nvc_bdev_vss = {
	.name = "bdev",
	.features = {
	},
	.ops = {
		.is_bdev_compatible = is_bdev_compatible,
	}
};
FTL_NV_CACHE_DEVICE_TYPE_REGISTER(nvc_bdev_vss)
+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ uint64_t test_offset_from_addr(ftl_addr addr, struct ftl_band *band);

DEFINE_STUB(spdk_bdev_desc_get_bdev, struct spdk_bdev *, (struct spdk_bdev_desc *desc), NULL);

DEFINE_STUB(ftl_nv_cache_device_get_desc_by_bdev, const struct ftl_nv_cache_device_desc *,
	    (struct spdk_ftl_dev *dev, struct spdk_bdev *bdev), NULL);

uint64_t
spdk_bdev_get_zone_size(const struct spdk_bdev *bdev)
{