nvmf: Add a channel map to the poll group

As of this patch, it is unused.

Change-Id: I15f42b8cc43e3792ae69c91f3911b7853d5b5664
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/388292
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2017-11-20 09:50:10 -07:00 committed by Jim Harris
parent 3580546bd1
commit ad876c00d3
5 changed files with 209 additions and 6 deletions

View File

@ -33,6 +33,7 @@
#include "spdk/stdinc.h" #include "spdk/stdinc.h"
#include "spdk/bdev.h"
#include "spdk/conf.h" #include "spdk/conf.h"
#include "spdk/io_channel.h" #include "spdk/io_channel.h"
#include "spdk/nvmf.h" #include "spdk/nvmf.h"
@ -82,6 +83,7 @@ spdk_nvmf_tgt_create_poll_group(void *io_device, void *ctx_buf)
struct spdk_nvmf_tgt *tgt = io_device; struct spdk_nvmf_tgt *tgt = io_device;
struct spdk_nvmf_poll_group *group = ctx_buf; struct spdk_nvmf_poll_group *group = ctx_buf;
struct spdk_nvmf_transport *transport; struct spdk_nvmf_transport *transport;
uint32_t sid;
TAILQ_INIT(&group->tgroups); TAILQ_INIT(&group->tgroups);
@ -89,6 +91,23 @@ spdk_nvmf_tgt_create_poll_group(void *io_device, void *ctx_buf)
spdk_nvmf_poll_group_add_transport(group, transport); spdk_nvmf_poll_group_add_transport(group, transport);
} }
group->num_sgroups = tgt->max_sid;
group->sgroups = calloc(group->num_sgroups, sizeof(struct spdk_nvmf_subsystem_poll_group));
if (!group->sgroups) {
return -1;
}
for (sid = 0; sid < group->num_sgroups; sid++) {
struct spdk_nvmf_subsystem *subsystem;
subsystem = tgt->subsystems[sid];
if (!subsystem) {
continue;
}
spdk_nvmf_poll_group_add_subsystem(group, subsystem);
}
group->poller = spdk_poller_register(spdk_nvmf_poll_group_poll, group, 0); group->poller = spdk_poller_register(spdk_nvmf_poll_group_poll, group, 0);
return 0; return 0;
@ -99,6 +118,8 @@ spdk_nvmf_tgt_destroy_poll_group(void *io_device, void *ctx_buf)
{ {
struct spdk_nvmf_poll_group *group = ctx_buf; struct spdk_nvmf_poll_group *group = ctx_buf;
struct spdk_nvmf_transport_poll_group *tgroup, *tmp; struct spdk_nvmf_transport_poll_group *tgroup, *tmp;
struct spdk_nvmf_subsystem_poll_group *sgroup;
uint32_t sid, nsid;
spdk_poller_unregister(&group->poller); spdk_poller_unregister(&group->poller);
@ -106,6 +127,21 @@ spdk_nvmf_tgt_destroy_poll_group(void *io_device, void *ctx_buf)
TAILQ_REMOVE(&group->tgroups, tgroup, link); TAILQ_REMOVE(&group->tgroups, tgroup, link);
spdk_nvmf_transport_poll_group_destroy(tgroup); spdk_nvmf_transport_poll_group_destroy(tgroup);
} }
for (sid = 0; sid < group->num_sgroups; sid++) {
sgroup = &group->sgroups[sid];
for (nsid = 0; nsid < sgroup->num_channels; nsid++) {
if (sgroup->channels[nsid]) {
spdk_put_io_channel(sgroup->channels[nsid]);
sgroup->channels[nsid] = NULL;
}
}
free(sgroup->channels);
}
free(group->sgroups);
} }
struct spdk_nvmf_tgt * struct spdk_nvmf_tgt *
@ -369,6 +405,69 @@ spdk_nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group,
return 0; return 0;
} }
int
spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
struct spdk_nvmf_subsystem_poll_group *sgroup;
struct spdk_nvmf_ns *ns;
uint32_t i;
if (subsystem->id >= group->num_sgroups) {
void *buf;
group->num_sgroups = subsystem->id + 1;
buf = realloc(group->sgroups, group->num_sgroups * sizeof(*sgroup));
if (!buf) {
return -ENOMEM;
}
group->sgroups = buf;
}
sgroup = &group->sgroups[subsystem->id];
sgroup->num_channels = subsystem->max_nsid;
sgroup->channels = calloc(sgroup->num_channels, sizeof(struct spdk_io_channel *));
if (!sgroup->channels) {
return -1;
}
for (i = 0; i < sgroup->num_channels; i++) {
ns = &subsystem->ns[i];
if (ns->allocated && sgroup->channels[i] == NULL) {
sgroup->channels[i] = spdk_bdev_get_io_channel(ns->desc);
if (sgroup->channels[i] == NULL) {
return -1;
}
}
}
return 0;
}
int
spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
struct spdk_nvmf_subsystem_poll_group *sgroup;
uint32_t nsid;
sgroup = &group->sgroups[subsystem->id];
for (nsid = 0; nsid < sgroup->num_channels; nsid++) {
if (sgroup->channels[nsid]) {
spdk_put_io_channel(sgroup->channels[nsid]);
sgroup->channels[nsid] = NULL;
}
}
sgroup->num_channels = 0;
free(sgroup->channels);
sgroup->channels = NULL;
return 0;
}
SPDK_TRACE_REGISTER_FN(nvmf_trace) SPDK_TRACE_REGISTER_FN(nvmf_trace)
{ {
spdk_trace_register_object(OBJECT_NVMF_IO, 'r'); spdk_trace_register_object(OBJECT_NVMF_IO, 'r');

View File

@ -77,9 +77,21 @@ struct spdk_nvmf_transport_poll_group {
TAILQ_ENTRY(spdk_nvmf_transport_poll_group) link; TAILQ_ENTRY(spdk_nvmf_transport_poll_group) link;
}; };
struct spdk_nvmf_subsystem_poll_group {
/* Array of channels for each namespace indexed by nsid - 1 */
struct spdk_io_channel **channels;
uint32_t num_channels;
};
struct spdk_nvmf_poll_group { struct spdk_nvmf_poll_group {
struct spdk_poller *poller; struct spdk_poller *poller;
TAILQ_HEAD(, spdk_nvmf_transport_poll_group) tgroups; TAILQ_HEAD(, spdk_nvmf_transport_poll_group) tgroups;
/* Array of poll groups indexed by subsystem id (sid) */
struct spdk_nvmf_subsystem_poll_group *sgroups;
uint32_t num_sgroups;
}; };
typedef enum _spdk_nvmf_request_exec_status { typedef enum _spdk_nvmf_request_exec_status {
@ -207,6 +219,10 @@ int spdk_nvmf_poll_group_remove(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_qpair *qpair); struct spdk_nvmf_qpair *qpair);
int spdk_nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group, int spdk_nvmf_poll_group_add_transport(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_transport *transport); struct spdk_nvmf_transport *transport);
int spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem);
int spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem);
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req); void spdk_nvmf_request_exec(struct spdk_nvmf_request *req);
int spdk_nvmf_request_complete(struct spdk_nvmf_request *req); int spdk_nvmf_request_complete(struct spdk_nvmf_request *req);

View File

@ -82,6 +82,24 @@ spdk_nvmf_valid_nqn(const char *nqn)
return true; return true;
} }
static void
spdk_nvmf_subsystem_create_done(void *io_device, void *ctx, int status)
{
}
static int
spdk_nvmf_subsystem_add_to_poll_group(void *io_device,
struct spdk_io_channel *ch,
void *ctx)
{
struct spdk_nvmf_poll_group *group;
struct spdk_nvmf_subsystem *subsystem = ctx;
group = spdk_io_channel_get_ctx(ch);
return spdk_nvmf_poll_group_add_subsystem(group, subsystem);
}
struct spdk_nvmf_subsystem * struct spdk_nvmf_subsystem *
spdk_nvmf_create_subsystem(struct spdk_nvmf_tgt *tgt, spdk_nvmf_create_subsystem(struct spdk_nvmf_tgt *tgt,
const char *nqn, const char *nqn,
@ -146,9 +164,47 @@ spdk_nvmf_create_subsystem(struct spdk_nvmf_tgt *tgt,
tgt->subsystems[sid] = subsystem; tgt->subsystems[sid] = subsystem;
tgt->discovery_genctr++; tgt->discovery_genctr++;
/* Send a message to each poll group to notify it that a new subsystem
* is available.
* TODO: This call does not currently allow the user to wait for these
* messages to propagate. It also does not protect against two calls
* to this function overlapping
*/
spdk_for_each_channel(tgt,
spdk_nvmf_subsystem_add_to_poll_group,
subsystem,
spdk_nvmf_subsystem_create_done);
return subsystem; return subsystem;
} }
static void
spdk_nvmf_subsystem_delete_done(void *io_device, void *ctx, int status)
{
struct spdk_nvmf_tgt *tgt = io_device;
struct spdk_nvmf_subsystem *subsystem = ctx;
free(subsystem->ns);
tgt->subsystems[subsystem->id] = NULL;
tgt->discovery_genctr++;
free(subsystem);
}
static int
spdk_nvmf_subsystem_remove_from_poll_group(void *io_device,
struct spdk_io_channel *ch,
void *ctx)
{
struct spdk_nvmf_poll_group *group;
struct spdk_nvmf_subsystem *subsystem = ctx;
group = spdk_io_channel_get_ctx(ch);
return spdk_nvmf_poll_group_remove_subsystem(group, subsystem);
}
void void
spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem)
{ {
@ -177,12 +233,16 @@ spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem)
spdk_nvmf_ctrlr_destruct(ctrlr); spdk_nvmf_ctrlr_destruct(ctrlr);
} }
free(subsystem->ns); /* Send a message to each poll group to notify it that a subsystem
* is no longer available.
subsystem->tgt->subsystems[subsystem->id] = NULL; * TODO: This call does not currently allow the user to wait for these
subsystem->tgt->discovery_genctr++; * messages to propagate. It also does not protect against two calls
* to this function overlapping
free(subsystem); */
spdk_for_each_channel(subsystem->tgt,
spdk_nvmf_subsystem_remove_from_poll_group,
subsystem,
spdk_nvmf_subsystem_delete_done);
} }

View File

@ -122,6 +122,20 @@ spdk_nvmf_ctrlr_destruct(struct spdk_nvmf_ctrlr *ctrlr)
{ {
} }
int
spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
return 0;
}
int
spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
return 0;
}
int int
spdk_nvmf_subsystem_bdev_attach(struct spdk_nvmf_subsystem *subsystem) spdk_nvmf_subsystem_bdev_attach(struct spdk_nvmf_subsystem *subsystem)
{ {

View File

@ -95,6 +95,20 @@ spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, enum spdk_nvme_transport_
return NULL; return NULL;
} }
int
spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
return 0;
}
int
spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)
{
return 0;
}
int int
spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str) spdk_nvme_transport_id_parse_trtype(enum spdk_nvme_transport_type *trtype, const char *str)
{ {