Commit dd98a248 authored by Mehakjot Singh Sidhu's avatar Mehakjot Singh Sidhu Committed by Konrad Sztyber
Browse files

bdev_nvme: Make bdev nvme create and set multipath policy APIs public



Introduced new header file /module/bdev/nvme.h and added public APIs
`spdk_bdev_nvme_create`, `spdk_bdev_nvme_set_multipath_policy` and
`spdk_bdev_nvme_get_default_ctrlr_opts`, replacing internal functions
`bdev_nvme_create`,  `bdev_nvme_set_multipath_policy` and
`bdev_nvme_get_default_ctrlr_opts`.

No changes have been done to the implementation of the above functions.

Change-Id: I610cfca65fbc43c32b1cf2288c8208fa5c6e567b
Signed-off-by: default avatarMehakjot Singh Sidhu <mehakjot.sidhu@nutanix.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24370


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent ca5cd2b2
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -58,6 +58,12 @@ The `framework_get_reactors` RPC method supports getting pid and tid.
Added `framework_get_governor` RPC to retrieve the power governor name,
power env and the frequencies available, frequency set to the cpu cores.

### bdev_nvme

Introduced new header file /module/bdev/nvme.h and added public APIs `spdk_bdev_nvme_create`,
`spdk_bdev_nvme_set_multipath_policy` and `spdk_bdev_nvme_get_default_ctrlr_opts`
to get connectivity and multipathing capabilities of bdev_nvme.

### dif

Each element in `enum spdk_dif_pi_format` was subtracted by 1 to match the definition
+2 −2
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

HEADERS := $(wildcard $(SPDK_ROOT_DIR)/include/spdk/*.h)
HEADERS := $(shell find $(SPDK_ROOT_DIR)/include/spdk/ -name '*.h')
INSTALLED_HEADERS := $(patsubst $(SPDK_ROOT_DIR)/include%,$(DESTDIR)$(includedir)%,$(HEADERS))

$(INSTALLED_HEADERS):
@@ -19,7 +19,7 @@ endif
.PHONY: $(INSTALLED_HEADERS)

all:
	$(Q)cp $(SPDK_ROOT_DIR)/include/spdk/*.h $(SPDK_ROOT_DIR)/build/include/spdk/
	$(Q)cp -r $(SPDK_ROOT_DIR)/include/spdk/* $(SPDK_ROOT_DIR)/build/include/spdk/

clean:
	@:
+96 −0
Original line number Diff line number Diff line
/*   SPDX-License-Identifier: BSD-3-Clause
 *   Copyright (C) 2024 Nutanix Inc. All rights reserved.
 */

/** \file
 * Nvme block device abstraction layer
 */

#ifndef SPDK_MODULE_BDEV_NVME_H_
#define SPDK_MODULE_BDEV_NVME_H_

#include "spdk/nvme.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef void (*spdk_bdev_nvme_create_cb)(void *ctx, size_t bdev_count, int rc);
typedef void (*spdk_bdev_nvme_set_multipath_policy_cb)(void *cb_arg, int rc);

enum spdk_bdev_nvme_multipath_policy {
	BDEV_NVME_MP_POLICY_ACTIVE_PASSIVE,
	BDEV_NVME_MP_POLICY_ACTIVE_ACTIVE,
};

enum spdk_bdev_nvme_multipath_selector {
	BDEV_NVME_MP_SELECTOR_ROUND_ROBIN = 1,
	BDEV_NVME_MP_SELECTOR_QUEUE_DEPTH,
};

struct spdk_bdev_nvme_ctrlr_opts {
	uint32_t prchk_flags;
	int32_t ctrlr_loss_timeout_sec;
	uint32_t reconnect_delay_sec;
	uint32_t fast_io_fail_timeout_sec;
	bool from_discovery_service;
	/* Name of the PSK or path to the file containing PSK. */
	char psk[PATH_MAX];
	const char *dhchap_key;
	const char *dhchap_ctrlr_key;
};

/**
 * Connect to the NVMe controller and populate namespaces as bdevs.
 *
 * \param trid Transport ID for nvme controller.
 * \param base_name Base name for the nvme subsystem.
 * \param names Pointer to string array to get bdev names.
 * \param count Maximum count of the string array 'names'. Restricts the length
 *		of 'names' array only, not the count of bdevs created.
 * \param cb_fn Callback function to be called after all the bdevs are created
 *              or updated if already created.
 * \param cb_ctx Context to pass to cb_fn.
 * \param drv_opts NVMe driver options.
 * \param bdev_opts NVMe bdev options.
 * \param multipath Whether to enable multipathing (if true) else failover mode.
 * \return 0 on success, negative errno on failure.
 */
int spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
			  const char *base_name,
			  const char **names,
			  uint32_t count,
			  spdk_bdev_nvme_create_cb cb_fn,
			  void *cb_ctx,
			  struct spdk_nvme_ctrlr_opts *drv_opts,
			  struct spdk_bdev_nvme_ctrlr_opts *bdev_opts,
			  bool multipath);

/**
 * Set multipath policy of the NVMe bdev.
 *
 * \param name NVMe bdev name.
 * \param policy Multipath policy (active-passive or active-active).
 * \param selector Multipath selector (round_robin, queue_depth).
 * \param rr_min_io Number of IO to route to a path before switching to another for round-robin.
 * \param cb_fn Function to be called back after completion.
 * \param cb_arg Argument passed to the callback function.
 */
void spdk_bdev_nvme_set_multipath_policy(const char *name,
		enum spdk_bdev_nvme_multipath_policy policy,
		enum spdk_bdev_nvme_multipath_selector selector,
		uint32_t rr_min_io,
		spdk_bdev_nvme_set_multipath_policy_cb cb_fn,
		void *cb_arg);

/* Get default values for controller opts.
 *
 * \param opts Ctrlr opts object to be loaded with default values.
 */
void spdk_bdev_nvme_get_default_ctrlr_opts(struct spdk_bdev_nvme_ctrlr_opts *opts);

#ifdef __cplusplus
}
#endif

#endif /* SPDK_MODULE_BDEV_NVME_H_ */
+4 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "spdk/rpc.h"
#include "spdk/util.h"
#include "spdk/nvme.h"
#include "spdk/module/bdev/nvme.h"
#include "bdev_nvme.h"

#ifdef SPDK_CONFIG_AVAHI
@@ -47,7 +48,7 @@ struct mdns_discovery_ctx {
	AvahiServiceBrowser                     *sb;
	struct spdk_poller                      *poller;
	struct spdk_nvme_ctrlr_opts             drv_opts;
	struct nvme_ctrlr_opts                  bdev_opts;
	struct spdk_bdev_nvme_ctrlr_opts        bdev_opts;
	uint32_t                                seqno;
	bool                                    stop;
	struct spdk_thread                      *calling_thread;
@@ -456,7 +457,7 @@ int
bdev_nvme_start_mdns_discovery(const char *base_name,
			       const char *svcname,
			       struct spdk_nvme_ctrlr_opts *drv_opts,
			       struct nvme_ctrlr_opts *bdev_opts)
			       struct spdk_bdev_nvme_ctrlr_opts *bdev_opts)
{
	AvahiServiceBrowser *sb = NULL;
	int error;
@@ -635,7 +636,7 @@ int
bdev_nvme_start_mdns_discovery(const char *base_name,
			       const char *svcname,
			       struct spdk_nvme_ctrlr_opts *drv_opts,
			       struct nvme_ctrlr_opts *bdev_opts)
			       struct spdk_bdev_nvme_ctrlr_opts *bdev_opts)
{
	SPDK_ERRLOG("spdk not built with --with-avahi option\n");
	return -ENOTSUP;
+22 −22
Original line number Diff line number Diff line
@@ -5090,7 +5090,7 @@ err_alloc:

struct bdev_nvme_set_multipath_policy_ctx {
	struct spdk_bdev_desc *desc;
	bdev_nvme_set_multipath_policy_cb cb_fn;
	spdk_bdev_nvme_set_multipath_policy_cb cb_fn;
	void *cb_arg;
};

@@ -5126,9 +5126,9 @@ _bdev_nvme_set_multipath_policy(struct spdk_io_channel_iter *i)
}

void
bdev_nvme_set_multipath_policy(const char *name, enum bdev_nvme_multipath_policy policy,
			       enum bdev_nvme_multipath_selector selector, uint32_t rr_min_io,
			       bdev_nvme_set_multipath_policy_cb cb_fn, void *cb_arg)
spdk_bdev_nvme_set_multipath_policy(const char *name, enum spdk_bdev_nvme_multipath_policy policy,
				    enum spdk_bdev_nvme_multipath_selector selector, uint32_t rr_min_io,
				    spdk_bdev_nvme_set_multipath_policy_cb cb_fn, void *cb_arg)
{
	struct bdev_nvme_set_multipath_policy_ctx *ctx;
	struct spdk_bdev *bdev;
@@ -5532,7 +5532,7 @@ nvme_ctrlr_create(struct spdk_nvme_ctrlr *ctrlr,
	if (ctx != NULL) {
		memcpy(&nvme_ctrlr->opts, &ctx->bdev_opts, sizeof(ctx->bdev_opts));
	} else {
		bdev_nvme_get_default_ctrlr_opts(&nvme_ctrlr->opts);
		spdk_bdev_nvme_get_default_ctrlr_opts(&nvme_ctrlr->opts);
	}

	nvme_ctrlr->adminq_timer_poller = SPDK_POLLER_REGISTER(bdev_nvme_poll_adminq, nvme_ctrlr,
@@ -5578,7 +5578,7 @@ err:
}

void
bdev_nvme_get_default_ctrlr_opts(struct nvme_ctrlr_opts *opts)
spdk_bdev_nvme_get_default_ctrlr_opts(struct spdk_bdev_nvme_ctrlr_opts *opts)
{
	opts->prchk_flags = 0;
	opts->ctrlr_loss_timeout_sec = g_opts.ctrlr_loss_timeout_sec;
@@ -6165,14 +6165,14 @@ bdev_nvme_load_psk(const char *fname, char *buf, size_t bufsz)
}

int
bdev_nvme_create(struct spdk_nvme_transport_id *trid,
spdk_bdev_nvme_create(struct spdk_nvme_transport_id *trid,
		      const char *base_name,
		      const char **names,
		      uint32_t count,
		 spdk_bdev_create_nvme_fn cb_fn,
		      spdk_bdev_nvme_create_cb cb_fn,
		      void *cb_ctx,
		      struct spdk_nvme_ctrlr_opts *drv_opts,
		 struct nvme_ctrlr_opts *bdev_opts,
		      struct spdk_bdev_nvme_ctrlr_opts *bdev_opts,
		      bool multipath)
{
	struct nvme_probe_skip_entry *entry, *tmp;
@@ -6217,7 +6217,7 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid,
	if (bdev_opts) {
		memcpy(&ctx->bdev_opts, bdev_opts, sizeof(*bdev_opts));
	} else {
		bdev_nvme_get_default_ctrlr_opts(&ctx->bdev_opts);
		spdk_bdev_nvme_get_default_ctrlr_opts(&ctx->bdev_opts);
	}

	if (trid->trtype == SPDK_NVME_TRANSPORT_PCIE) {
@@ -6577,7 +6577,7 @@ struct discovery_ctx {
	struct discovery_entry_ctx		*entry_ctx_in_use;
	struct spdk_poller			*poller;
	struct spdk_nvme_ctrlr_opts		drv_opts;
	struct nvme_ctrlr_opts			bdev_opts;
	struct spdk_bdev_nvme_ctrlr_opts	bdev_opts;
	struct spdk_nvmf_discovery_log_page	*log_page;
	TAILQ_ENTRY(discovery_ctx)		tailq;
	TAILQ_HEAD(, discovery_entry_ctx)	nvm_entry_ctxs;
@@ -6932,14 +6932,14 @@ discovery_log_page_cb(void *cb_arg, int rc, const struct spdk_nvme_cpl *cpl,
			}
			spdk_nvme_ctrlr_get_default_ctrlr_opts(&new_ctx->drv_opts, sizeof(new_ctx->drv_opts));
			snprintf(new_ctx->drv_opts.hostnqn, sizeof(new_ctx->drv_opts.hostnqn), "%s", ctx->hostnqn);
			rc = bdev_nvme_create(&new_ctx->trid, new_ctx->name, NULL, 0,
			rc = spdk_bdev_nvme_create(&new_ctx->trid, new_ctx->name, NULL, 0,
						   discovery_attach_controller_done, new_ctx,
						   &new_ctx->drv_opts, &ctx->bdev_opts, true);
			if (rc == 0) {
				TAILQ_INSERT_TAIL(&ctx->nvm_entry_ctxs, new_ctx, tailq);
				ctx->attach_in_progress++;
			} else {
				DISCOVERY_ERRLOG(ctx, "bdev_nvme_create failed (%s)\n", spdk_strerror(-rc));
				DISCOVERY_ERRLOG(ctx, "spdk_bdev_nvme_create failed (%s)\n", spdk_strerror(-rc));
			}
		}
	}
@@ -7127,7 +7127,7 @@ int
bdev_nvme_start_discovery(struct spdk_nvme_transport_id *trid,
			  const char *base_name,
			  struct spdk_nvme_ctrlr_opts *drv_opts,
			  struct nvme_ctrlr_opts *bdev_opts,
			  struct spdk_bdev_nvme_ctrlr_opts *bdev_opts,
			  uint64_t attach_timeout,
			  bool from_mdns,
			  spdk_bdev_nvme_start_discovery_fn cb_fn, void *cb_ctx)
Loading