Commit a4d132cd authored by Jim Harris's avatar Jim Harris
Browse files

nvmf: add new 'id' to spdk_nvmf_subsystem_listener



This id can be used as the 'portid' for discovery
log entries.  Previously we were putting the entry
index in the portid field which was incorrect.

Signed-off-by: default avatarJim Harris <james.r.harris@intel.com>
Change-Id: I9f373585fe671ba7e69eb8e07f603f8e8ac1e270
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/10589


Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJacek Kalwas <jacek.kalwas@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 8dbf28ac
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -168,7 +168,7 @@ nvmf_generate_discovery_log(struct spdk_nvmf_tgt *tgt, const char *hostnqn, size

			entry = &disc_log->entries[numrec];
			memset(entry, 0, sizeof(*entry));
			entry->portid = numrec;
			entry->portid = listener->id;
			entry->cntlid = 0xffff;
			entry->asqsz = listener->transport->opts.max_aq_depth;
			entry->subtype = subsystem->subtype;
+4 −0
Original line number Diff line number Diff line
@@ -106,6 +106,7 @@ struct spdk_nvmf_subsystem_listener {
	struct spdk_nvmf_transport			*transport;
	enum spdk_nvme_ana_state			*ana_state;
	uint64_t					ana_state_change_count;
	uint16_t					id;
	TAILQ_ENTRY(spdk_nvmf_subsystem_listener)	link;
};

@@ -278,6 +279,8 @@ struct spdk_nvmf_ctrlr {
	TAILQ_ENTRY(spdk_nvmf_ctrlr)	link;
};

#define NVMF_MAX_LISTENERS_PER_SUBSYSTEM	16

struct spdk_nvmf_subsystem {
	struct spdk_thread				*thread;

@@ -319,6 +322,7 @@ struct spdk_nvmf_subsystem {
	pthread_mutex_t					mutex;
	TAILQ_HEAD(, spdk_nvmf_host)			hosts;
	TAILQ_HEAD(, spdk_nvmf_subsystem_listener)	listeners;
	struct spdk_bit_array				*used_listener_ids;

	TAILQ_ENTRY(spdk_nvmf_subsystem)		entries;

+25 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
#include "spdk/uuid.h"
#include "spdk/json.h"
#include "spdk/file.h"
#include "spdk/bit_array.h"

#define __SPDK_BDEV_MODULE_ONLY
#include "spdk/bdev_module.h"
@@ -297,12 +298,19 @@ spdk_nvmf_subsystem_create(struct spdk_nvmf_tgt *tgt,
	TAILQ_INIT(&subsystem->listeners);
	TAILQ_INIT(&subsystem->hosts);
	TAILQ_INIT(&subsystem->ctrlrs);
	subsystem->used_listener_ids = spdk_bit_array_create(NVMF_MAX_LISTENERS_PER_SUBSYSTEM);
	if (subsystem->used_listener_ids == NULL) {
		pthread_mutex_destroy(&subsystem->mutex);
		free(subsystem);
		return NULL;
	}

	if (num_ns != 0) {
		subsystem->ns = calloc(num_ns, sizeof(struct spdk_nvmf_ns *));
		if (subsystem->ns == NULL) {
			SPDK_ERRLOG("Namespace memory allocation failed\n");
			pthread_mutex_destroy(&subsystem->mutex);
			spdk_bit_array_free(&subsystem->used_listener_ids);
			free(subsystem);
			return NULL;
		}
@@ -311,6 +319,7 @@ spdk_nvmf_subsystem_create(struct spdk_nvmf_tgt *tgt,
			SPDK_ERRLOG("ANA group memory allocation failed\n");
			pthread_mutex_destroy(&subsystem->mutex);
			free(subsystem->ns);
			spdk_bit_array_free(&subsystem->used_listener_ids);
			free(subsystem);
			return NULL;
		}
@@ -359,6 +368,7 @@ _nvmf_subsystem_remove_listener(struct spdk_nvmf_subsystem *subsystem,
	TAILQ_REMOVE(&subsystem->listeners, listener, link);
	nvmf_update_discovery_log(listener->subsystem->tgt, NULL);
	free(listener->ana_state);
	spdk_bit_array_clear(subsystem->used_listener_ids, listener->id);
	free(listener);
}

@@ -405,6 +415,8 @@ _nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem)

	pthread_mutex_destroy(&subsystem->mutex);

	spdk_bit_array_free(&subsystem->used_listener_ids);

	if (subsystem->async_destroy) {
		async_destroy_cb = subsystem->async_destroy_cb;
		async_destroy_cb_arg = subsystem->async_destroy_cb_arg;
@@ -1068,6 +1080,7 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
	struct spdk_nvmf_subsystem_listener *listener;
	struct spdk_nvmf_listener *tr_listener;
	uint32_t i;
	uint32_t id;
	int rc = 0;

	assert(cb_fn != NULL);
@@ -1117,6 +1130,18 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
		return;
	}

	id = spdk_bit_array_find_first_clear(subsystem->used_listener_ids, 0);
	if (id == UINT32_MAX) {
		SPDK_ERRLOG("Cannot add any more listeners\n");
		free(listener->ana_state);
		free(listener);
		cb_fn(cb_arg, -EINVAL);
		return;
	}

	spdk_bit_array_set(subsystem->used_listener_ids, id);
	listener->id = id;

	for (i = 0; i < subsystem->max_nsid; i++) {
		listener->ana_state[i] = SPDK_NVME_ANA_OPTIMIZED_STATE;
	}