Commit 851af375 authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Jim Harris
Browse files

lib/ftl: Add placeholder for NV cache device interface



Change-Id: Ie0dc8fdd24c9dff9e20d4e12de82a19eec77d04b
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/+/18545


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent 22e97fd5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +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

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

+73 −0
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright 2023 Solidigm All Rights Reserved
 */

#include "spdk/stdinc.h"
#include "spdk/queue.h"
#include "spdk/log.h"

#include "ftl_nvc_dev.h"
#include "utils/ftl_defs.h"

static TAILQ_HEAD(, ftl_nv_cache_device_desc) g_devs = TAILQ_HEAD_INITIALIZER(g_devs);
static pthread_mutex_t g_devs_mutex = PTHREAD_MUTEX_INITIALIZER;

static const struct ftl_nv_cache_device_desc *
ftl_nv_cache_device_type_get_desc(const char *name)
{
	struct ftl_nv_cache_device_desc *entry;

	TAILQ_FOREACH(entry, &g_devs, internal.entry) {
		if (0 == strcmp(entry->name, name)) {
			return entry;
		}
	}

	return NULL;
}

static bool
ftl_nv_cache_device_valid(const struct ftl_nv_cache_device_desc *desc)
{
	return desc && desc->name && strlen(desc->name) > 0;
}

void
ftl_nv_cache_device_register(struct ftl_nv_cache_device_desc *desc)
{
	if (!ftl_nv_cache_device_valid(desc)) {
		SPDK_ERRLOG("NV cache device descriptor is invalid\n");
		ftl_abort();
	}

	pthread_mutex_lock(&g_devs_mutex);
	if (!ftl_nv_cache_device_type_get_desc(desc->name)) {
		TAILQ_INSERT_TAIL(&g_devs, desc, internal.entry);
		SPDK_NOTICELOG("Registered NV cache device, name: %s\n", desc->name);
	} else {
		SPDK_ERRLOG("Cannot register NV cache device, already exists, name: %s\n", desc->name);
		ftl_abort();
	}

	pthread_mutex_unlock(&g_devs_mutex);
}

const struct ftl_nv_cache_device_desc *
ftl_nv_cache_device_get_desc_by_bdev(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev)
{
	struct ftl_nv_cache_device_desc *entry;
	const struct ftl_nv_cache_device_desc *desc = NULL;

	pthread_mutex_lock(&g_devs_mutex);
	TAILQ_FOREACH(entry, &g_devs, internal.entry) {
		if (entry->ops.is_bdev_compatible) {
			if (entry->ops.is_bdev_compatible(dev, bdev)) {
				desc = entry;
				break;
			}
		}
	}
	pthread_mutex_unlock(&g_devs_mutex);

	return desc;
}
+94 −0
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright 2023 Solidigm All Rights Reserved
  */

#ifndef FTL_NV_CACHE_DEVICE_H
#define FTL_NV_CACHE_DEVICE_H

#include "spdk/stdinc.h"
#include "spdk/bdev_module.h"

struct spdk_ftl_dev;
struct ftl_mngt_process;

/**
 * @brief NV Cache device features and capabilities
 */
struct ftl_nv_cache_device_features {
	/*
	 * The placeholder for NV Cache device features. It will be filled in the future.
	 */
};

/**
 * @brief NV Cache device operations interface
 */
struct ftl_nv_cache_device_ops {
	/**
	 * @brief Check if block device is valid for NV Cache device
	 *
	 * @param dev ftl device
	 * @param bdev bdev to be checked
	 *
	 * @retval true if bdev is valid for NV Cache device
	 * @retval false if bdev is not valid for NV Cache device
	 */
	bool (*is_bdev_compatible)(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev);
};

/**
 * @brief NV Cache device descriptor
 */
struct ftl_nv_cache_device_desc {
	/**
	 * The name of the NV cache device type
	 */
	const char *name;

	/**
	 * The features list of the NV cache device type
	 *
	 */
	const struct ftl_nv_cache_device_features features;

	/**
	 * The NV cache device operations
	 */
	const struct ftl_nv_cache_device_ops ops;

	/** Internal fields */
	struct {
		/* The queue entry to put this description to a queue */
		TAILQ_ENTRY(ftl_nv_cache_device_desc) entry;
	} internal;
};

/**
 * @brief Macro to register NV Cache device type when the module is loaded
 *
 * @param desc NV Cache device type descriptor
 */
#define FTL_NV_CACHE_DEVICE_TYPE_REGISTER(desc) \
static void __attribute__((constructor)) ftl_nv_cache_device_register_##desc(void) \
{ \
	ftl_nv_cache_device_register(&desc); \
}

/**
 * @brief Register NV Cache device type
 *
 * @param desc NV Cache device type descriptor
 */
void ftl_nv_cache_device_register(struct ftl_nv_cache_device_desc *desc);

/**
 * @brief Get NV Cache device type descriptor by bdev
 *
 * @param bdev bdev for which NV Cache device type descriptor is requested
 *
 * @return NV Cache device type descriptor
 */
const struct ftl_nv_cache_device_desc *ftl_nv_cache_device_get_desc_by_bdev(
	struct spdk_ftl_dev *dev, struct spdk_bdev *bdev);

#endif /* FTL_NV_CACHE_DEVICE_H */